Веб-сервер Nginx

Универсальный веб-сервер для широкого круга задач.

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

Настройка Nginx

Скопировано

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

Вы можете установить 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. Попробовать сгенерировать разные конфигурации позволит разобраться с конкретными настройками детальнее.

На практике

Скопировано

Игорь Коровченко советует

Скопировано

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

Скопировано

С помощью сигналов в 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.

Саша Патлух советует

Скопировано

Начальная конфигурация для старта проекта

Скопировано

При старте нового проекта часто копирую из заметок одну из этих заготовок.

  1. Если приложение слушает определённый порт и нужен обратный прокси (reverse proxy) с локального хоста. Это решение подходит, чтобы крутить на сервере Node.js-приложения и отдавать результаты по запросу на определённый домен. Подходит, чтобы запускать Next, Nuxt, Express и всё подобное на собственном домене.
        
          
          server {  listen 80;  listen [::]:80;  server_name yourdomain.com www.yourdomain.com;  location / {    proxy_redirect off;    proxy_pass http://localhost:3000;  }}
          server {
  listen 80;
  listen [::]:80;
  server_name yourdomain.com www.yourdomain.com;

  location / {
    proxy_redirect off;
    proxy_pass http://localhost:3000;
  }
}

        
        
          
        
      

Эта конфигурация позволит обращаться к приложению, которое слушает порт 3000 по адресу yourdomain.com (без порта).

Для простоты тут описан 80 порт, но вы, конечно же настроите себе HTTPS-сертификаты, и порт изменится на 443. Приложение тоже может использовать любой другой порт, не обязательно :3000.

  1. Бывает хочется, чтобы к вашим HTML-страницам на сайте можно было обращаться без указания расширения. Вот так: https://mydomain.com/hello, а не так https://mydomain.com/hello.html. При этом, если в дочерней директории окажется файл с именем index.html, нужно чтобы этот файл вызывался без указания своего имени внутри директории. Другими словами, нужен конфиг, который обслуживает такую структуру файлов:
|--index.html
|--about.html
|--posts
|--|--index.html
|--|--post-1.html

По URL-адресу https://mydomain.com/about откроется страница about.html, а по адресу https://mydomain.com/posts — страница /posts/index.html.

Вот готовое решение:

        
          
          server {  root /path-to-your-static-files;  index index.html index.htm index.nginx-debian.html;  server_name mydomain.com www. mydomain.com;  location / {    rewrite ^/([^.]+)$ /$1.html break;    try_files $uri $uri/ /$1/index.html;  }}
          server {
  root /path-to-your-static-files;
  index index.html index.htm index.nginx-debian.html;
  server_name mydomain.com www. mydomain.com;

  location / {
    rewrite ^/([^.]+)$ /$1.html break;
    try_files $uri $uri/ /$1/index.html;
  }
}