Настройка 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
при обращении к корневой странице сайта (за это отвечает директива 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
прослушивает порт 9000 на этом же компьютере.
Каждый модуль имеет набор простых директив, которые можно использовать в конфигурации Nginx. fastcgi
, fastcgi
входят в список таких директив для модуля ngx
. В примере этот модуль принимает HTTP-запросы клиента, пересланные Nginx, исполняет PHP-скрипт с именем fastcgi
в директории document
и GET-параметры query
для обработки этих запросов. Модуль передаёт HTTP-ответ веб-серверу Nginx, который в свою очередь посылает их клиенту.
Вторая сложная директива location
отдаёт клиенту статические файлы картинок напрямую, минуя модуль ngx
. Символ ~
означает, что за ним следует регулярное выражение. В примере регулярное выражение проверяет запрошенные клиентом файлы по маске. Если файлы удовлетворяют условию, то они передаются согласно запрошенному пути из каталога /data
на сервере.
Управление конфигурацией
СкопированоЗапустить 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.
советует Скопировано
Начальная конфигурация для старта проекта
СкопированоПри старте нового проекта часто копирую из заметок одну из этих заготовок.
- Если приложение слушает определённый порт и нужен обратный прокси (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
.
- Бывает хочется, чтобы к вашим HTML-страницам на сайте можно было обращаться без указания расширения. Вот так:
https
, а не так: / / mydomain . com / hello https
. При этом, если в дочерней директории окажется файл с именем: / / mydomain . com / hello . html index
, нужно чтобы этот файл вызывался без указания своего имени внутри директории. Другими словами, нужен конфиг, который обслуживает такую структуру файлов:. html
|--index.html |--about.html |--posts |--|--index.html |--|--post-1.html
По URL-адресу https
откроется страница about
, а по адресу https
— страница /posts
.
Вот готовое решение:
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; } }