Ответы пользователя по тегу Nginx
  • Есть возможность устранить ошибку nginx "alias" cannot be used in location "/hls/" where URI was rewritten?

    @xtreme
    Снимаю порчу по SSH :)
    Сильно не вникал, но... не пробовал вынести rewrite выше уровнем в server? Сейчас у тебя какая-то логическая петля получается - запрос попадает в location, там ему есть алиас, а потом приходит реврайт и все портит. Ну и еще непонятен немного смысл данного реврайта. Берем урл /hls/ololo/trololo и переписываем его в /hls/ololo/trololo ? Он вообще нужен?
    Ответ написан
  • Как добавить расширение в uri в nginx?

    @xtreme
    Снимаю порчу по SSH :)
    location ~ ^/zbx/ {
      try_files $uri $uri.pdf =404;
    }


    Естественно, что root должен быть прописан, иначе файлы будут искаться в /etc/nginx.
    Инфо: https://nginx.ru/ru/docs/http/ngx_http_core_module...
    Ответ написан
  • Nginx front + apache back. Как настроить под разных пользователей?

    @xtreme
    Снимаю порчу по SSH :)
    А на директории стоит 755 хотя бы? Если бит запуска не стоит на директориях (на всем пути от корня до статики) -  nginx не сможет получить туда доступ, даже если на файле стоит 644.
    И, кстати, почему такой древний nginx? В мейнлайне сейчас 1.9.9, а в 1.6.7 много чего не хватает по сравнению с версиями 1.9...
    Ответ написан
  • Nginx + gunicorn + ssl. Разные конфиги для разных поддоменов на одном сертификате. Это возможно?

    @xtreme
    Снимаю порчу по SSH :)
    upstream subexample.com {
    и
    proxy_pass http://sub.example.com;
    Тут непонятно, зачем описывать апстрим и не использовать его. Или это опечатка?
    Второе - непонятно назначение конструкции:
    if (!-f $request_filename) {
      proxy_pass http://sub.example.com;
      break;
    }

    Читаю так - если файл не существует, то сделать proxy_pass на самого себя и получить бесконечный редирект (это в случае, если там не опечатка и проксится на sub.example.com), либо по http-протоколу обратиться к бэкенду, который висит на сокете и тогда получим фигню, потому что результирующий урл довольно необычного вида http://unix://....
    Сразу возникает вопрос... а если файл найден? Откуда его отдать? Других опций как-то не видно.

    Я бы порекомендовал:
    - не называйте апстримы также, как реальные серверы - одна ошибка и получим непредсказуемое поведение, которое очень сложно отловить. В идеале, апстримы можно назвать одним словом, чтобы не путать с именем сервера.
    - Постарайтесь обойтись без if в конфиге, особенно для проверки существования файла. Есть же try_files.
    Ответ написан
  • Ошибка 502 Bad Gateway на POST запросах. Почему?

    @xtreme
    Снимаю порчу по SSH :)
    child 3275 exited on signal 9 (SIGKILL) after 89.296408 seconds from start

    Что-то PHP делает с залитым вами файлом целых 90 секунд, после чего fpm его успешно убивает, как повисший. Смотрите обработку файла картинки при POST-запросе. Возможно не стоит обрабатывать его сразу, а для начала сохранить оригинал, чтобы отпустить коннект, а уже потом проводить над ним какие-то магические действия в виде обрезки, конвертации, накладывания водяных знаков и т.д.
    Ответ написан
  • Как в Ap-hotspot перенаправить запросы на nginx?

    @xtreme
    Снимаю порчу по SSH :)
    Если для wifi выделена отдельная подсеть - тогда в bind можно настроить разные view для разных адресов и, соответственно, отдавать разные ответы на разные view.
    Гуглите bind9 split dns.
    Ответ написан
  • Почему не работает error_page в nginx?

    @xtreme
    Снимаю порчу по SSH :)
    Рискну предположить, что дело в отсутствии fastcgi_intercept_errors on; в секции с php.
    nginx.org/ru/docs/http/ngx_http_fastcgi_module.htm...
    Ответ написан
  • Nginx reverse proxy в зависимости от ответа сервера?

    @xtreme
    Снимаю порчу по SSH :)
    В такой ситуации стоило бы сначала разобраться, почему отдается 401 от бэкенда. И на бэкенде заменил 401 на другую ошибку (как пример 404). Например, если на бэкенде тоже nginx, то это делается просто директивой error_page. Ну а на фронтенде включить второй сервер в апстрим с параметром backup и proxy_next_upstream http_404;
    В этом случае запрос уйдет на второй бэкенд.

    Как вариант немного посложнее (я бы, например, поступил так) - взять исходники nginx, найти там модуль proxy, написать по образу и подобию обработки других ошибок кусок кода для обработки http_401, сделать патч на будущее (пригодится при обновлениях), собрать свой пакет с измененными исходниками и проапгрейдиться. Ну а дальше по накатанной - proxy_next_upstream http_401; и сервер в апстриме с параметром backup.

    В любом случае, маловато информации - почему возникает ошибка? Она там должна быть или это какой-то баг? Можно ли исправить баг, если это баг? Есть ли смысл в другом бэкенде, если получен 401? Возможно, если не надо дальше обрабатывать запрос, а отдавать запросу заглушку, просто отдать заглушку?
    Ответ написан
  • Временами долгий отклик от поддомена. nginx поддупливает?

    @xtreme
    Снимаю порчу по SSH :)
    1. Если измеряете время прохождения пакета с помощью ping - приблизьте размер пакета к реальному в 1500 байт и не надейтесь на 4 пинга. Потому как мелкими пакетами в 32 или 64 байта сложно заметить проблемы в сети.
    ping -l 1400 -t static.mysite.com
    2. Я наших вебников когда-то шваброй гонял за выполнение крона веб-запросом к PHP. Что мешает вписать в кронтаб выполнение любой команды без дергания веб-сервера? Тот же PHP спокойно может выполняться из шелла. К тому же, рано или поздно ваш урл кто-то найдет (тот же гугл или яндекс соберет данные и пойдет проверить, что там в урле) и тогда беды не миновать.
    3. Можете пояснить, зачем делать по крону OPTIMIZE? И как часто вы его делаете?
    4. Время отклика у вас большое. Сервер на другом континенте? Например, Вы - в Европе, а сервер - в Нью-Йорке. В таком случае нет ничего удивительного в подтупливании.
    5. Сервер VDS? В этом случае тоже вполне возможны подтупливания, если используется HDD, либо при оверсейлинге у хостера.
    6. Используете Chrome и в соседних вкладках также открыт ваш сайт? Учтите, что Chrome устанавливает не более 6 соединений к одному узлу.
    Неплохо было бы посмотреть на вкладку Network в инспекторе браузера, чтобы увидеть тайминги при подтупливании.
    7. Не перехватывается ли запрос картинки другим локейшном? Возможно, запрос промахивается и попадает в обработку, например, в PHP-скрипт, который уже сам забирает файл с диска и отдает nginx-у.
    Ответ написан
  • Как настроить nginx для dev?

    @xtreme
    Снимаю порчу по SSH :)
    1. Настроить log_format для отображения нужной информации в access_log
    Например:
    log_format upstreamlog '$remote_addr - [$time_local] "$host" "$request" $status ($bytes_sent) "$http_referer" "$uri $args" [$request_time] '
      '"$gzip_ratio" Cache:"$upstream_cache_status" "$content_length" "$http_user_agent" "Upstream: $upstream_addr response $upstream_response_time sec."';


    2. Выставить у нужного виртхоста этот logformat
    access_log /var/log/nginx/my-virthost-nginx.access_log upstreamlog;


    3. Зарелоадить nginx
    service nginx reload

    4. Прицепиться к логу tail-ом в консоли.
    tail -f /var/log/nginx/my-virthost-nginx.access_log


    Чтобы было красивее - поставить пакет ccze из репозиториев (yum install ccze например) и цепляться к логу примерно так:
    tail -f /var/log/nginx/my-virthost-nginx.access_log | ccze -A
    Ответ написан
  • Настройка редиректа на https nginx?

    @xtreme
    Снимаю порчу по SSH :)
     Может я не врубаюсь, но у вас тут что-то непонятное. Куча локейшнов, а в конце - редирект. А зачем тогда тут куча локейшнов (+вложенных локейшнов)? Эта куча все равно не работает.

    server {
      listen 99.99.999.999:80;
      server_name test.ru www.test.ru;
      index index.html index.php;
      access_log /var/www/httpd-logs/test-test.ru.access.log ;
      error_log /var/www/httpd-logs/test-test.ru.error.log;
    
      location /test/ {
        root /var/www/test/data/www/test.ru;
        #Тут параметры для локейшна test и т.д.
      }
      
      location / {
        return 301 https://test.ru$request_uri;
      }
    }
    Ответ написан
  • Как заставить Nginx перенаправлять запросы на виртуальные хосты апача?

    @xtreme
    Снимаю порчу по SSH :)
    Можно.
    По-умолчанию, если нигде не используется proxy_set_header, то все будет работать и так. Если надо явно задать имена в бэкенде не такие, как у фронтенда - в таком случае прописываем подмену заголовка
    proxy_set_header Host trololo.com;
    Далее, апач, если на нем настроены NameVirtualHost при попадании на него запроса с nginx, отдаст запрос в виртхост с именем, переданным в заголовке Host.
    Ответ написан
  • Что бы вы посоветовали поменять в таком конфиге NGINX?

    @xtreme
    Снимаю порчу по SSH :)
    Прочитал комментарии - фигней вы занимаетесь. Конкретная задача есть? Если нет - тогда к чему сотрясать клавиатуру, накидывая конфиг?
    Есть такое понятие - "преждевременная оптимизация". Вам почти любой, кто с этим сталкивался, скажет, что преждевременная оптимизация - это плохо.
    Как сказал Игорь Сысоев в одном из докладов - "Фактически настройка nginx сводится к выставлению worker_processes в число железных ядер на машине, или в auto, а дальше надо заниматься тюнингом самой системы".
    С моей колокольни, обычно первоначальная настройка выглядит так:
    В nginx.conf
    worker_processes auto;
    worker_rlimit_nofile 65535;
    worker_connections 65535;
    accept_mutex off;


    А потом в conf.d описываем первый виртхост с минимальным конфигом...
    Запустили что надо в минимальной конфигурации, посмотрели на все это дело и уже только потом тюнить - включить gzip где надо, выставить опции к сокетам (включая http2, куда ж без него :-) ), выключение sendfile, где не надо, включение aio, где надо, включение thread-pool если ситуация требует, выкручивание буферов в крайних случаях.

    По вашему конфигу - портянка получилась еще и потому, что многие опции дублированы в разных server, хотя можно было их вынести выше в секцию http, ssl-опции можно также почти полностью вынести в секцию http (в вашем случае можно вообще некоторые опустить).
    Ответ написан
  • Низкая скорость ответа сервера (WAIT 2-5 сек) - где копать и как решить?

    @xtreme
    Снимаю порчу по SSH :)
    Согласен с nirvimel в том, что надо смотреть $upstream_response_time. Если время ответа бэкенда примерно такое же, как и время ожидания - стоит посмотреть на то, чем он так занят.
    Чаще всего в подобных случаях виноват бэкенд. Особенно если там какая-нибудь джумла (ну да... не люблю я её), придется лезть в потроха и смотреть, где там что (тогда php-xdebug + qcachegrind в руки).
    Ответ написан
  • Как правильно настроить nginx proxy?

    @xtreme
    Снимаю порчу по SSH :)
    server {
      listen 80;
      server_name localhost;
    
      location ~ \.html$ {
        root   html;
        index  index.html index.htm;
      }
      location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
      }
    }


    Здесь два локейшна. Первый обрабатывает все uri, оканчивающиеся на .html, второй - все остальное.
    В качестве root в первом локейшне надо указать директорию, где расположены html-файлы.
    Странно, что у тебя стоит listen 127.0.0.1:80, так снаружи не зайдешь.
    Ответ написан
  • Как настроить Nginx в качестве прокси?

    @xtreme
    Снимаю порчу по SSH :)
    server {
      listen 80;
      server_name xxx.com;
      root /var/www/yyy.com/web;
      location /adb/ {
        resolver 127.0.0.1;
        rewrite ^/adb/(.*)$ /$1 break;
        proxy_pass http://yyy.com;
        proxy_redirect default; #???
        proxy_set_header Host yyy.com;
      }
    }


    Не поленитесь поставить named на локалхост. В CentOS, например, достаточно запустить дефолтную конфигурацию (yum install bind && chkconfig named on && service named start). Так будет проще и быстрее резолвить, чем каждый раз стучаться в гуглоднс.
    Далее - если не сделать rewrite с break, убрав ваш локейшн, то запрос на xxx.com/adb/ уйдет не на yyy.com, а на yyy.com/adb/. И если там такого урла нет - получим 404 или что-нибудь еще хуже.
    Далее - если собрались проксировать трафик на yandex.ru, то при проксировании подставляйте заголовок "Host yandex.ru". Если оставить, как есть "Host $host", то получится, что на yandex.ru придет ваш запрос, который ищет xxx.com на хосте с yandex.ru, как следствие - 404.
    Далее - nginx.org/ru/docs/http/ngx_http_proxy_module.html#... - стоит разобраться с proxy_redirect. Для разных узлов возможны разные значения. Обычно хватает default, но вполне может понадобиться и off или другие параметры.

    Чтобы заблокировать xxx.com/adb/logo.png при проксировании:

    location ~ ^/adb/logo\.png$ {
      empty_gif;
    }


    В location можно также и так:
    location = /adb/logo.png {
    Либо вместо empty_gif если надо отдавать свою картинку - тогда можно, например, сделать rewrite в нужный урл и отдавать картинку от себя.

    P.S. Можно также сделать пару локейшнов для статических элементов, чтобы обрабатывать их отдельно и класть в локальный кеш - сокращается трафик и ускоряется доступ.
    Ответ написан
  • Nginx, rewrite, как удалить часть URL?

    @xtreme
    Снимаю порчу по SSH :)
    location ~ /asdf/ {
    rewrite ^/asdf/(.*)$ /$1 break;
    proxy_pass ...;
    #или
    #root /....;
    }

    Либо просто

    rewrite ^/asdf/(.*)$ /$1 break;

    Скорее всего второго варианта с одним rewrite в секции server хватит. Зависит от остальной конфигурации.
    Ответ написан
  • Nginx redirect from http to https?

    @xtreme
    Снимаю порчу по SSH :)
    Блин, начал писать про редирект в коде, и почему-то вспомнил про .htaccess. Некрасиво получилось :)
    В общем искать надо, где 443 стоит рядом с http://
    Ответ написан
  • Nginx redirect from http to https?

    @xtreme
    Снимаю порчу по SSH :)
    Только что ради эксперимента проделал такой редирект. Причем с буква-в-букву приведенным конфигом, за исключением server_name-ов. Все работает отлично. Видимо проблема не в данной части, а далее, например, в описании проксирования на апач.
    proxy_redirect off; не забыли?
    Ответ написан