Ответы пользователя по тегу Nginx
  • Как проверить есть ли файл на сервере(nginx)?

    @miksir
    IT
    location / {
      proxy_pass http://a.a.a.a;
      proxy_intercept_errors on;
      error_page 404 = @server2;
    }
    
    location @server2 {
      proxy_pass http://b.b.b.b;
    }
    Ответ написан
    Комментировать
  • Nginx: https to https?

    @miksir
    IT
    По сути https - https работает через расшифровку и повторную шифровку, т.е. сертификаты должны быть и на nginx. Посмотрите пример любого ssl сервера на nginx.

    Как вариант еще, если nginx только для балансировки, использовать haproxy, он умеет балансировку SSL без расшифровки https://www.haproxy.com/blog/enhanced-ssl-load-bal...
    Ответ написан
    1 комментарий
  • Как перенаправить несколько location на разные сервера?

    @miksir
    IT
    location /one {
                proxy_pass http://ipone:portone/;
                proxy_set_header X-Real-IP $remote_addr;
            }
    location /two {
                proxy_pass http://iptwo:porttwo/;
                proxy_set_header X-Real-IP $remote_addr;
            }

    Обратите внимание на слеш в конце адреса бекенда. Именно он показывает необходимость реврайта URI запроса. Учтите, что этот реврайт никак не влияет на само тело запроса (т.е. если у вас вернется html со ссылкой a href="/", то она такой и останется)
    Ответ написан
    6 комментариев
  • Location в NGINX?

    @miksir
    IT
    location = / {
      root /var/www/main;
      try_files /index.html =404;
    }
    
    location / {
      /var/www/qwerty;
      try_files /index.html =404;
    }
    Ответ написан
    Комментировать
  • Как настроить адресацию по домену в nginx на на разные локальные IP адреса в зависимости от домена к которому обращаются?

    @miksir
    IT
    1. Терминировать SSL на 192.168.0.2 и далее проксировать на 0.3 и 0.4, как указано в ответе ky0
    1.1 - проксировать по http, локалка все же... минусы - могут быть подводные камни с генерацией ссылок в приложении, нужно предпринять некоторые телодвижения для этого (зависящие от приложения)
    1.2 - проксировать по https, в минусах оверхед на установку дополнительного tls, может и не критично

    2. Проксировать не доходя до L7 уровня используя SNI для роутинга. nginx это делать не умеет, можно использовать haproxy https://www.haproxy.com/blog/enhanced-ssl-load-bal...
    Ответ написан
    Комментировать
  • Как установить более новую версию nginx-extras debian?

    @miksir
    IT
    В jessie-backports (https://packages.debian.org/ru/jessie-backports/ng... ) nginx-extras 1.10.3
    Ответ написан
    Комментировать
  • Почему не отдаётся статика?

    @miksir
    IT
    Конфиг нормальный, все работает именно так, как вы написали. Запрос к / уходит на 127.0.0.1:8080. Запрос на /index.html попадает в другой локейшн и отдается статикой. Так как вы не описали, как же должна себя вести система, какие запросы должны быть статикой, какие - динамикой, то предложить другой конфиг возможности нет.

    PS;
    Вариант 1. Описываем / отдельным локейшеном точного совпадения
    root /home/www/files;
    
    location = / {
       index index.html;
    }
    
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
    
    location ~ \.(html|css|js)$ {
        access_log off;
        expires 30d;
    }

    Запрос / попадет в "= /", там отработает модуль autoindex, проверит наличие /index.html на диске, и если найдет - сделает внутренний редирект на /index.html, который попадет в "location ~ \.(html|css|js)$".

    Вариант 2. Просто проверяем наличие файлов на диске, и перебрасываем в ноду только если таковых нет.
    root /home/www/files;
    
    location / {
        try_files $uri $uri/ @nodejs;
        index index.html;
    }
    
    location @nodejs {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
    
    location ~ \.(html|css|js)$ {
        access_log off;
        expires 30d;
    }

    В данном случае запрос попадает в "location /", там try_files проверяет наличие файла на диске или наличие такой директории. Наличие директории срабатывает (у нас есть на диске директория /home/www/files/), запрос остается в контексте location /, отработает модуль autoindex, проверит наличие /index.html на диске, и если найдет - сделает внутренний редирект на /index.html. Если же try_files ничего не нашло (например, на запрос /bla/bla/), то try_files делает внутренний редирект на свой последний аргумент - "именованный локейшн", в котором уже происходит работа с нодой.

    В принципе второй вариант даже где-то предпочтительнее, но если нужно поведение "перебрасываем на ноду по запросу /dir/file.txt даже если на диске есть /home/www/files/dir/file.txt" - то первый вариант.

    Оба варианта будут давать 404, если файл index.html убрать с диска. Если нужно поведение, что есть index.html - даем его, нет - уходим на ноду, то конфиг чуток меняем.
    Вариант 3
    root /home/www/files;
    
    location / {
        try_files $uri /index.html @nodejs;
    }
    
    location @nodejs {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
    
    location ~ \.(html|css|js)$ {
        access_log off;
        expires 30d;
    }

    Поменялся только try_files, теперь он не проверяет наличие директории, но проверяет наличие двух файлов, запрошенного (в случае запроса / - такого файла нет), и /home/www/files/index.html вне зависимости от URL запроса.
    Ответ написан
    2 комментария
  • Nginx + php7-fpm High load?

    @miksir
    IT
    5000 запросов в 1 секунду на PHP скрипт? Давайте начнем с PHP, может, а не с nginx. Считаете время ответа одного запроса T, считаете количество воркеров PHP N = 5000*T. Далее запускаете это число воркеров, делаете одновременные запросы на все воркеры и путем увеличения числа ядер процессора добиваетесь времени ответа сервера такого же, какой был на одном воркере. Ну, это без учета того, что если используется СУБД - ее время ответа тоже нужно будет исправлять на заданной конкурентности. Не хватает ядер, добавляем сервера.
    Ответ написан
    4 комментария
  • Почему не работает CHROOT с php-fpm?

    @miksir
    IT
    chroot - это смена корня ("/") файловой системы. PHP переключившись на новый рут ничего не знает об уровнях выше, для него корень теперь - /var/www/mysite.com/fileman. Т.е. когда вы говорите - выполни скрипт fastcgi_param SCRIPT_FILENAME /var/www/mysite.com$fastcgi_script_name; - он ищет от своего нового корня, а значит реально по файловой системе он ищет файл /var/www/mysite.com/fileman/var/www/mysite.com$fastcgi_script_name

    Если вы не понимаете, зачем вам чрут - лучше не использовать. Там может возникнуть много нюансов.
    Ответ написан
    Комментировать
  • Nginx: proxy_protocol + обычное соединения + X-Real-IP header, как заставить работать совместно?

    @miksir
    IT
    Интересно. Пока вижу только два варианта. 1) не использовать прокси протокол, а просто ставить на haproxy заголовок X-Real-Ip и его расшифровывать на nginx. 2) Описать два сервера на разных портах, один для прокси протокола на кастомном порту, другой для обычных 80/443.
    Ответ написан
  • Wildcard поддомен в Nginx возвращает No input file specified. Что не так?

    @miksir
    IT
    Вы используете нумерованные выделения, но они сбрасываются после каждого регекспа. Т.е. в `location ~ \.php$` уже нет того $1, что вы ожидаете.
    Для выхода из положения присвойте $1 какой-то переменной `set $servername $1`, а самое лучшее - использовать именованные выделения
    `server_name ~^(?<servername>.+)\.example\.com$;`
    и далее использовать $servername в любом месте конфига сервера.

    Стоит прочитать nginx.org/ru/docs/http/ngx_http_core_module.html#s... и nginx.org/ru/docs/http/server_names.html
    Там расписано в том числе порядок обработки имен серверов.
    Ответ написан
  • Возможно ли кэширование nginx страниц с авторизацией по заголовкам?

    @miksir
    IT
    Все заголовки переводятся в переменные $http_...
    $http_имя
    произвольное поле заголовка запроса; последняя часть имени переменной соответствует имени поля, приведённому к нижнему регистру, с заменой символов тире на символы подчёркивания


    Т.е. достаточно подмешать к proxy_cache_key переменную $http_authorization
    Например:
    proxy_cache_key $scheme$proxy_host$request_uri$http_authorization;
    Ответ написан
    Комментировать
  • Как правильно сделать редирект с поддомена в каталог с помощью Nginx?

    @miksir
    IT
    server {
        listen 80;
        server_name api.domain.dev;
    
        location / {
            proxy_set_header Host domain.dev;
            proxy_pass http://keeper_app/api/;
        }
    }
    Ответ написан
    4 комментария
  • Как настроить несколько доменов для одного сайта на nginx?

    @miksir
    IT
    Самый правильный вартант - все же решить на уровне движка и правки базы.

    Эту задачу можно решить nginx-ом с помощью модуля замены данных в теле nginx.org/ru/docs/http/ngx_http_sub_module.html
    В примере там, даже, что-то такое, что вам нужно - замена фиксированной строки на $host - имя домена в запросе.

    Но я бы использовал это решение как временнное, и запланировал бы изменение базы ибо это гораздо более прозрачно для дальнейшей разработки и поддержки конфигурации.
    Ответ написан
    Комментировать
  • Реально сделать проект по схеме, где фронтенд работает на Node.JS, а бэкенд на php?

    @miksir
    IT
    Как уже сказали, нода - это тоже бекенд. Используются вместе путем разделения запросов к ноде и пхп по урлу или имени сервера.

    Например, по урлу. Запросы вида /api/что-то/ идут на пхп, все остальные - на ноду. Т.е. запрос клиента приходит на nginx, тот перенаправляет его на ноду, она отрабатывает логику и делает запрос в nginx на /api/что-то/, который, используя правила location - перенаправлет его в php.

    По домену - аналогично. Просто в nginx будет для разных типов запросов разные server блоки со своими site_name (и, возможно, своими listen, если мы хотим разнести эти точки входа по разным портам или ip адресам). Если запрос на www.domain.com - запрос на ноду. Если запрос на localhost - запрос в php. Соответсвенно, нода делает запросы на localhost (тоже через nginx).

    Теоретически, нода может работать напрямую с PHP без промежуточного nginx, по протоколу FastCGI, но такая схема почти не используется. И из-за того, что работать из ноды с http проще, и из-за гораздо большей гибкости управления конфигурацией, тогда как дополнительные накладные расходы из-да nginx между нодой и пхп - весьма малы относительно общего времени обработки запроса.
    Ответ написан
    3 комментария
  • Как настроить конфиг nginx если на севрере один сайт https и несолько http?

    @miksir
    IT
    На каждый домен http сайтов выписать сертификат (иначе браузеры будут ругаться) и прописать https конфигурацию для каждого этого сайта в nginx. Если хотите редирект - отдельный server блок, если хотите просто получить эти сайты по https - добавить listen 443 ssl и ключи в старый server блок.
    Ответ написан
  • NGINX. Как указать TMP папку для проксирования webdav запроса?

    @miksir
    IT
    Nginx читает тело запроса до client_body_buffer_size в память (по дефолту 16к). Если не влезает - сбрасывает все или только излишки (client_body_in_file_only) во временный файл по пути client_body_temp_path.

    Эту буфферизацию можно отключить совсем proxy_request_buffering.
    Ответ написан
  • Nginx: код 503 в конфиге по факту оказывается 302. Почему?

    @miksir
    IT
    Так как у вас URL в error_page указан с http и доменом - подразумевается внешний редирект. Отсюда и 302. Для получения того, что вы хотите, пишите
    error_page 503 /maintrance.html;
    Так же, если вы хотите получить 200 в ответе, не обязательно описывать отдельный локейшн, можно решить все той же error_page, это будет так
    error_page 503 =200 /maintrance.html;
    И тогда location = /maintrance.html можно выкинуть.

    UPD: Да, ступил. Так как error_page делает внутренний редирект, то если нет отдельного location /maintrance.html - сервер снова попадает в location / и получается бесконечный цикл редиректов. Так что в таком случае location /maintrance.html нужен.

    Попутно хочу акцентировать внимание на другом способе, более популярном, особенно если нам не нужно выдавать 503.
    location / {
        root   /usr/share/nginx/html;
        index index.html index.htm;
        try_files /maintrance.html $uri $uri/ =404;
    }

    try_files перебирает указанные аргументы пока не встретит существующий на диске. Т.е. в такой конфигурации достаточно создать /usr/share/nginx/html/maintrance.html - начинает выдаваться он, если его удалить - начинают работать обычные запросы (параметр $uri и $uri/).
    Ответ написан
    2 комментария
  • Как добиться DRY в конфигурации nginx для множества однотипных сайтов?

    @miksir
    IT
    Генерировать чем-то еще. Это в какой-то мере полуофициальная позиция разработчиков nginx. Но если хочется все же поиграться с единым конфигом - смотрите в сторону одного server блока и подстановки туда всяких переменных (типа рута и т.п.) через map. Например,
    map $host $newroot {
    hostnames;
    default /home/notfound/www/;
    .mysite.ru /home/user1/mysite.ru/www/;
    include user2_map.conf;
    }
    server {
      listen 80 default;
      server_name _:
      root $newroot;
    }

    Да, и вот такое
    if ($host = 'www.$site_name') {
        rewrite ^/(.*)$ http://$site_name/$1 permanent;
    }

    лучше описать отдельно
    server {
       server_name ~^www\.(?<newhost>.+)$;
       return 301 $scheme://$newhost$uri$is_args$query_string;
    }
    Ответ написан
    Комментировать