Ответы пользователя по тегу Nginx
  • Как хранить сжатый кэш Nginx?

    AlekseyArh
    @AlekseyArh Автор вопроса
    Кибер существо
    Добрался сегодня до возможности всё попробовать самому, по этому сам себе отвечу к чему пришёл.

    1 - Нужно на приложении, куда проксирует nginx отдавать уже сжатый ответ. Можно как то через сжимающий прокси заморочиться, но проще и за меньшее количество посредников сжать в приложении.
    63aa10ef209c6680023825.png

    2 - В nginx нужно отключить директиву gzip и в нужном location включить директиву gunzip.
    63aa10fda05ea318263473.png
    У меня gunzip (--with-http_gunzip_module) уже была включена в nginx. Возможно уже собирал с ней и забыл, ну или она сейчас работает из коробки. Можно посмотреть nginx -V

    В моём случае приложение на golang с небольшой html выдачей. Без сжатия файл nginx кэша весит 20кб, с сжатием 8кб.

    Делаю curl на порт приложения, curl пишет что там бинарник. Делаю curl на nginx, который проксирует на порт приложения, curl отображает мой html. Файл кэша при этот только один, сжатый.

    Теперь думаю стоит ли вообще разжимать, кто сейчас не использует сжатие?
    Ответ написан
    Комментировать
  • Двойной слеш вместо одного в адресе uri - есть ли разница?

    AlekseyArh
    @AlekseyArh
    Кибер существо
    nginx по умолчанию склеивает слэши - merge_slashes off; // on по умолчанию
    Это может привести к сюрпризам.

    Например если вы используете nginx кэш, ключ кэша строится от урла.
    Вы зайдёте на site/page.html, а там закешированна 404, потому что кривой парсер зашёл на site//page.html, а ваш бэк nginxу отдал 404, который он закешировал в ключ md5(site/page.html)

    Плюс это кривой запрос на бэк, который в холостую будет искать страницу, который итак понятно что нету.

    Вариант лечения, который я вижу на данный момент - это добавить merge_slashes off; перед секцией server
    А в начале секции server прописать две регулярки.

    rewrite ^//([^/].*) /$1 permanent;
    rewrite (.*)//+(.*) /404 permanent;


    Первая сработает если вначале ссылки два слеша (site//page.html) и перенаправит на один слэш (site/page.html)
    Это распространённая ошибка, например пользователь скопировал относительную ссылку, вставил в адресную строку, а там уже забит домен.
    Или парсеры, которые криво парсят.

    Вторая регулярка сработает если не сработала первая, и если два и больше слешей есть в оставшемся урле, тогда считаем это ошибкой и редиректим на подготовленную 404 страницу

    Это site//page.html исправится на это site/page.html
    Это site/cat//page.html на /404
    Такой урл site/page.html?utm=https://site не попадает под регулярки.

    Можно использовать только одну регулярку
    rewrite (.*)//+(.*) $1/$2 permanent;
    Тогда все двойные слэши исправятся на одинарные (кроме параметров ссылки)
    Но это каждый раз новый редирект. В конечном счёте вы получите ERR_TOO_MANY_REDIRECTS
    5fd794a2b921f587081961.png
    Лучше так не делать, а просто кривые ссылки считать кривыми.
    Ответ написан
    Комментировать
  • Как асинхронно выполнить код Lua в location Nginx?

    AlekseyArh
    @AlekseyArh
    Кибер существо
    Попробуй напиши
    ngx.eof()
    после ответа клиенту.

    Что то вроде
    ngx.say("привет")
    ngx.eof() // тут клиент отключится
    mysql:new() // всякая хрень дальше
    Ответ написан
    Комментировать
  • Настройка роутинга и 404 nginx?

    AlekseyArh
    @AlekseyArh
    Кибер существо
    error_page 404 /404.html;
    Ответ написан
    Комментировать