Nginx (произносится как "engine-x") — это мощный и гибкий веб-сервер и обратный прокси-сервер, а также почтовый прокси-сервер. Он известен своей высокой производительностью, стабильностью, богатым набором функций, простой конфигурацией и низким потреблением ресурсов. В этой статье мы рассмотрим основные концепции Nginx, а также предоставим примеры конфигурации для новичков.
Что такое Nginx и зачем он нужен?
Nginx был разработан для решения проблемы C10k, которая заключается в необходимости обслуживать тысячи одновременных соединений. В отличие от традиционных веб-серверов, таких как Apache, которые используют потоки для обработки запросов, Nginx использует асинхронный, событийно-ориентированный подход. Это позволяет ему обрабатывать множество запросов с использованием очень малого количества памяти.
Установка Nginx
Установка Nginx относительно проста и может быть выполнена на большинстве операционных систем. Для Debian и Ubuntu-based систем, можно использовать следующие команды:
sudo apt update
sudo apt install nginx
Для CentOS и RHEL-based систем:
sudo yum install epel-release
sudo yum install nginx
После установки Nginx автоматически запускается, и вы можете проверить его статус командой:
sudo systemctl status nginx
А если служба не смогла запуститься, в первую очередь проверьте, не занят ли уже кем-то 80-й порт:
ss -anutp | grep ":80$"`
Конфигурация Nginx
Основная конфигурация Nginx находится в файле /etc/nginx/nginx.conf
, но на практике чаще всего используются отдельные файлы конфигурации для каждого сайта, расположенные в директории /etc/nginx/sites-available
. Эти файлы затем символически связываются с директорией /etc/nginx/sites-enabled
для активации.
Простейший пример конфигурации для обслуживания статического сайта выглядит следующим образом:
server {
listen 80;
server_name example.com www.example.com;
location / {
root /var/www/example.com;
index index.html index.htm;
}
}
Этот конфиг говорит Nginx слушать порт 80 для доменов example.com
и www.example.com
и обслуживать статические файлы из директории /var/www/example.com
.
Секция server
listen 80
; — Эта директива указывает Nginx
слушать входящие соединения на порту 80, который является стандартным портом для HTTP
. Это значит, что веб-сервер будет обрабатывать запросы, приходящие через HTTP
.
server_name example.com www.example.com
; — Здесь определяются доменные имена (или серверные имена), для которых этот конфиг будет применяться. В данном случае конфигурация активируется для запросов, адресованных к example.com или www.example.com.
Секция location /
- Эта часть конфигурации задает правила обработки запросов для корневого пути
(/)
и всех его подпутей. Для запросов, соответствующих этому местоположению, применяются следующие настройки:
root /var/www/example.com
; — Директива root указывает корневую директорию для файлов сайта. То есть, если поступает запрос к сайту, например, http://example.com/about.html
, Nginx попытается найти файл по пути/var/www/example.com/about.html
.
index index.html index.htm
; — Эта директива определяет, какие файлы считаются индексными. Если запрос идет на директорию (например, http://example.com/), Nginx попробует отдать файл index.html
или index.htm
из указанной корневой директории. Если такие файлы найдены не будут, Nginx вернет ошибку 404 (Файл не найден).
Обратный прокси
Nginx часто используется как обратный прокси-сервер для Node.js, Python приложений и других. В такой конфигурации Nginx принимает входящие HTTP(S) запросы и перенаправляет их на внутренний сервер приложений, обрабатывая статические ресурсы напрямую.
Пример конфигурации для Node.js приложения:
server {
listen 80;
server_name example-app.com;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Секция server
listen 80
; — Команда заставляет Nginx слушать входящие соединения на порту 80, стандартном порту для HTTP. Это означает, что все запросы, приходящие через HTTP, будут обработаны этой конфигурацией.
server_name example-app.com
; — Определяет имя сервера (домен), для которого эта конфигурация будет применяться. В данном случае, если запрос будет направлен к example-app.com, он будет обработан этим блоком server.
Секция location /
- Эта часть конфигурации задает правила обработки для всех запросов к корневому URL
(/)
и его подпутей. В ней указаны следующие директивы:
proxy_pass http://localhost:3000
; — Перенаправляет все запросы к приложению, работающему на localhost порту 3000. Это основная директива, обеспечивающая функционал обратного прокси.
proxy_set_header Host $host
; — Передает исходный Host запроса приложению. Это необходимо для корректной обработки запросов, особенно если приложение зависит от значения заголовка Host.
proxy_set_header X-Real-IP $remote_addr
; — Передает исходный IP-адрес клиента приложению. Это полезно для логирования или для приложений, которые используют IP-адрес для различных проверок или настроек безопасности.
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
; — Добавляет IP-адрес клиента в список адресов в заголовке X-Forwarded-For
. Этот заголовок может использоваться для идентификации исходного IP-адреса клиента за прокси-сервером.
proxy_set_header X-Forwarded-Proto $scheme
; — Передает исходный протокол запроса (например, http или https), что может быть важно для приложений, которые изменяют свое поведение в зависимости от типа протокола.
Заключение
Nginx — это мощный инструмент для веб-разработчиков и системных администраторов. Его легкость, гибкость и масштабируемость делают его идеальным выбором для многих сценариев использования, от простых статических сайтов до сложных веб-приложений.