Веб-сервер Nginx

Время чтения: меньше 5 мин

Настройка Nginx

Секция статьи "Настройка Nginx"

Веб-сервер Nginx был разработан в 2004 году Игорем Сысоевым для работы со статическим контентом и оказался очень быстрым. Благодаря модульности, Nginx постоянно обрастал функциональностью, и сейчас может использоваться практически для любой задачи бэкенда.

Вы можете установить Nginx с помощью официальной инструкции.

Структура файлов конфигурации

Секция статьи "Структура файлов конфигурации"

С помощью директив описывается конфигурация и подключаются модули. Директивы делятся на простые и блочные. Например, с помощью простой директивы listen 8080; веб-сервер понимает, что надо прослушивать порт 8080, на который будут приходить запросы от клиентов. Пример сложной директивы:

        
          
          server {  listen 8080;  root /data/up1;  location / {  }}
          server {
  listen 8080;
  root /data/up1;

  location / {
  }
}

        
        
          
        
      

Директива server описывает поведение Nginx. Согласно конфигурации веб-сервер должен слушать порт 8080 на компьютере, номер которого задаётся директивой listen, и отдавать статические файлы из директории /data/up1 при обращении к корневой странице сайта (за это отвечает директива root). Внутри фигурных скобок директивы становятся зависимыми от контекста. Контекст location / означает, что директивы внутри фигурных скобок описывают действия сервера при обращении к корневой директории сайта. Доступны несколько контекстов: events, http, server и location.

Чтобы перенаправить часть запросов по URI / (подробнее об этом в статье «Работа с сетью») приложению или службе, запущенной на компьютере и прослушивающей порт 8080, а часть запросов по пути /images/ в директорию /data, нужно описать это в конфигурации:

        
          
          server {  location / {    proxy_pass http://localhost:8080;  }  location /images/ {    root /data;  }}
          server {
  location / {
    proxy_pass http://localhost:8080;
  }

  location /images/ {
    root /data;
  }
}

        
        
          
        
      

Можно фильтровать по типу файлов, используя регулярные выражения:

        
          
          location ~ \.(gif|jpg|png)$ {  root /data/images;}
          location ~ \.(gif|jpg|png)$ {
  root /data/images;
}

        
        
          
        
      

Если нужно, чтобы часть запросов перенаправлялось к интерпретатору (например, PHP), нужно описать это так:

        
          
          server {  location / {    fastcgi_pass  localhost:9000;    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;    fastcgi_param QUERY_STRING    $query_string;  }  location ~ \.(gif|jpg|png)$ {    root /data/images;  }}
          server {
  location / {
    fastcgi_pass  localhost:9000;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param QUERY_STRING    $query_string;
  }

  location ~ \.(gif|jpg|png)$ {
    root /data/images;
  }
}

        
        
          
        
      

В сложной директиве location / описывается поведение Nginx для всех обращений к корневой директории сайта. Веб-сервер ожидает, что соответствующий модуль ngx_http_fastcgi_module прослушивает порт 9000 на этом же компьютере.

Каждый модуль имеет набор простых директив, которые можно использовать в конфигурации Nginx. fastcgi_pass, fastcgi_param входят в список таких директив для модуля ngx_http_fastcgi_module. В примере этот модуль принимает HTTP-запросы клиента, пересланные Nginx, исполняет PHP-скрипт с именем fastcgi_script_name в директории document_root и GET-параметры query_string для обработки этих запросов. Модуль передаёт HTTP-ответ веб-серверу Nginx, который в свою очередь посылает их клиенту.

Вторая сложная директива location ~ \.(gif|jpg|png)$ отдаёт клиенту статические файлы картинок напрямую, минуя модуль ngx_http_fastcgi_module. Символ ~ означает, что за ним следует регулярное выражение. В примере регулярное выражение проверяет запрошенные клиентом файлы по маске. Если файлы удовлетворяют условию, то они передаются согласно запрошенному пути из каталога /data/images на сервере.

Управление конфигурацией

Секция статьи "Управление конфигурацией"

Запустить Nginx можно напрямую, используя исполняемый файл, или в качестве службы в операционной системе.

Можно протестировать конфигурацию с помощью ключа -t:

        
          
          nginx -t
          nginx -t

        
        
          
        
      

Если конфигурационный файл написан правильно, то Nginx сообщит об этом в консоль, равно как и укажет на ошибки при их наличии.

Веб-сервером Nginx можно управлять, вызывая запущенный процесс с параметром -s. Используйте следующий синтаксис:

        
          
          nginx -s <signal>
          nginx -s <signal>

        
        
          
        
      

Можно использовать сигналы из списка:

stop — быстро завершить;
quit — плавно завершить;
reload — перезагрузить конфигурационный файл;
reopen — открыть лог-файлы заново.

Можно получить конфигурационный файл с помощью сервиса Mozilla SSL Configuration Generator. Попробовать сгенерировать разные конфигурации позволит разобраться с конкретными настройками детальнее.

На практике

Секция статьи "На практике"

igsekor

Секция статьи "igsekor"

Управление и мониторинг

Секция статьи "Управление и мониторинг"

С помощью сигналов в Unix-подобных операционных системах можно управлять большинством системных служб. Веб-сервер — не исключение.

Если Nginx уже запущен, можно получить отчёт о состоянии командой:

        
          
          sudo systemctl status nginx
          sudo systemctl status nginx

        
        
          
        
      

Остановить Nginx можно командой:

        
          
          sudo systemctl stop nginx
          sudo systemctl stop nginx

        
        
          
        
      

Запустить Nginx можно командой:

        
          
          sudo systemctl start nginx
          sudo systemctl start nginx

        
        
          
        
      

Для перезапуска веб-сервера, например, после смены конфигурации, можно использовать две команды:

        
          
          sudo systemctl reload nginxsudo systemctl restart nginx
          sudo systemctl reload nginx
sudo systemctl restart nginx

        
        
          
        
      

Первый способ лучше, поскольку позволяет сначала остановить все задачи Nginx, а уже потом перезапустить веб-сервер. Вторая команда обрывает текущие задачи и сразу перезагружает Nginx.