Nginx
Nginx — это программное обеспечение с открытым исходным кодом для создания легкого и мощного веб-сервера.
NGINX
Nginx (eNGIne X, «Энджинкс» или «Энджин-икс») — это программное обеспечение с открытым исходным кодом для создания легкого и мощного веб-сервера. Также его используют в качестве почтового сервера. Nginx решает проблему падения производительности с ростом трафика и является самым популярным веб-сервером в России и вторым в мире.
Документация
1 - Примеры настройки nginx
Настройка Nginx для управления контейнерами, разделами сайта и поддоменами
Оглавление
- Базовые настройки Nginx
- Конфигурация для контейнеров
- Настройка разделов сайта
- Работа с поддоменами
- Использование regex в Nginx
- Оптимизация и безопасность
Базовые настройки Nginx
Основная структура конфигурации
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Базовые настройки
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# Настройки логов
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# Подключение конфигов из отдельных файлов
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Конфигурация для контейнеров
1. Проксирование к контейнеру Docker
server {
listen 80;
server_name app.example.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;
}
}
2. Балансировка нагрузки между несколькими контейнерами
upstream myapp {
server 172.17.0.1:8001; # Контейнер 1
server 172.17.0.2:8002; # Контейнер 2
server 172.17.0.3:8003; # Контейнер 3
}
server {
listen 80;
server_name cluster.example.com;
location / {
proxy_pass http://myapp;
include proxy_params;
}
}
3. Проксирование WebSocket
server {
listen 80;
server_name ws.example.com;
location / {
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
Настройка разделов сайта
1. Разделы как подкаталоги
server {
listen 80;
server_name example.com;
# Главная страница
location = / {
root /var/www/main;
index index.html;
}
# Блог
location /blog/ {
alias /var/www/blog/;
try_files $uri $uri/ /blog/index.html;
}
# API
location /api/ {
proxy_pass http://localhost:8000/;
proxy_set_header Host $host;
}
}
2. Разделы с разными обработчиками
server {
listen 80;
server_name example.com;
# Статические файлы
location ~ ^/static/ {
root /var/www/static;
expires 30d;
access_log off;
}
# PHP-обработчик
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
# Обработка Python (uWSGI)
location /pythonapp {
include uwsgi_params;
uwsgi_pass unix:/run/uwsgi/app/pythonapp/socket;
}
}
Работа с поддоменами
1. Базовые поддомены
server {
listen 80;
server_name www.example.com;
return 301 https://example.com$request_uri;
}
server {
listen 80;
server_name example.com;
location / {
root /var/www/main;
index index.html;
}
}
server {
listen 80;
server_name blog.example.com;
location / {
root /var/www/blog;
index index.html;
}
}
2. Динамические поддомены (wildcard)
server {
listen 80;
server_name ~^(?<subdomain>.+)\.example\.com$;
location / {
root /var/www/$subdomain;
try_files $uri $uri/ /index.html;
}
}
3. Поддомены для пользователей
server {
listen 80;
server_name ~^(?<user>[a-z0-9-]+)\.users\.example\.com$;
location / {
proxy_pass http://unix:/home/$user/app.sock;
proxy_set_header Host $host;
}
}
Использование regex в Nginx
1. Основы регулярных выражений
Синтаксис: ~
(чувствительные к регистру) или ~*
(нечувствительные)
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
access_log off;
}
2. Именованные захваты
location ~* ^/user/(?<user_id>\d+)/profile$ {
proxy_pass http://backend/users/$user_id;
}
3. Сложные маршруты
location ~ ^/(api|v2)/v(?<version>\d+)/(?<resource>\w+)/(?<id>\d+)$ {
proxy_pass http://backend/$version/$resource?id=$id;
}
4. Отрицательные условия
location ~* \.(?!jpg|png|gif).*$ {
add_header Cache-Control "no-store";
}
5. Оптимизация regex
Лучшие практики:
- Используйте
^
и $
для точного соответствия
- Избегайте жадных квантификаторов (
.*
)
- Группируйте альтернативы в порядке вероятности
Пример оптимизированного regex:
location ~ ^/images/(thumb|large)/([a-z0-9-]+)\.(jpe?g|png)$ {
# Более эффективно, чем /images/.*
}
Оптимизация и безопасность
1. Безопасные заголовки
server {
# ...
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
add_header Content-Security-Policy "default-src 'self'";
add_header Referrer-Policy "strict-origin-when-cross-origin";
}
2. Ограничение доступа
location /admin/ {
allow 192.168.1.0/24;
allow 10.0.0.1;
deny all;
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.htpasswd;
}
3. Кэширование и сжатие
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
location ~* \.(?:jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
access_log off;
add_header Cache-Control "public";
}
4. Мониторинг и логирование
# Логирование в формате JSON
log_format json_combined escape=json
'{'
'"time_local":"$time_local",'
'"remote_addr":"$remote_addr",'
'"request":"$request",'
'"status": "$status",'
'"body_bytes_sent":"$body_bytes_sent",'
'"http_referrer":"$http_referer",'
'"http_user_agent":"$http_user_agent"'
'}';
access_log /var/log/nginx/access.log json_combined;
Заключение
В этом руководстве мы рассмотрели:
- Базовую настройку Nginx
- Конфигурацию для работы с контейнерами
- Организацию разделов сайта
- Настройку поддоменов
- Использование регулярных выражений
- Оптимизацию и безопасность
- Тестирование конфигураций с помощью
nginx -t
- Использование инструментов вроде Certbot для HTTPS
- Мониторинг производительности с помощью инструментов типа GoAccess
2 - Настройка Nginx для работы с почтовыми сервисами
Nginx может использоваться как прокси-сервер для различных почтовых протоколов (IMAP, POP3, SMTP) и веб-интерфейсов почтовых сервисов. Вот практические примеры конфигураций.
1. Проксирование веб-интерфейса почтового сервера (Roundcube, Rainloop)
server {
listen 80;
server_name mail.example.com;
# Перенаправление HTTP -> HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name mail.example.com;
# SSL сертификаты
ssl_certificate /etc/letsencrypt/live/mail.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mail.example.com/privkey.pem;
# Настройки SSL
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# Корневая директория
root /var/www/webmail;
index index.php;
# Обработка PHP для Roundcube
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Статические файлы
location ~* \.(jpg|jpeg|gif|png|css|js|ico|svg)$ {
expires 30d;
access_log off;
}
# Запрет доступа к скрытым файлам
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}
2. Проксирование почтовых протоколов (IMAP/POP3/SMTP)
Nginx может работать как TLS-терминатор для почтовых протоколов:
Конфигурация для IMAPS (SSL-порт 993):
stream {
upstream imap_backend {
server 127.0.0.1:143; # Внутренний IMAP сервер
}
server {
listen 993 ssl;
proxy_pass imap_backend;
ssl_certificate /etc/ssl/certs/mail.example.com.pem;
ssl_certificate_key /etc/ssl/private/mail.example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
}
}
Конфигурация для SMTPS (SSL-порт 465):
stream {
upstream smtp_backend {
server 127.0.0.1:25; # Внутренний SMTP сервер
}
server {
listen 465 ssl;
proxy_pass smtp_backend;
ssl_certificate /etc/ssl/certs/mail.example.com.pem;
ssl_certificate_key /etc/ssl/private/mail.example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
}
}
3. Проксирование Submission порта (587)
stream {
upstream submission_backend {
server 127.0.0.1:587; # Внутренний Submission порт
}
server {
listen 587;
proxy_pass submission_backend;
}
}
4. Конфигурация для почтового API (например, для Mailgun, SendGrid)
server {
listen 443 ssl;
server_name api.mail.example.com;
ssl_certificate /etc/ssl/certs/mail.example.com.pem;
ssl_certificate_key /etc/ssl/private/mail.example.com.key;
location /v3/ {
proxy_pass http://mail_api_server:8000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Ограничение методов
limit_except POST {
deny all;
}
# Ограничение скорости для API
limit_req zone=mailapi burst=20 nodelay;
}
location / {
return 403;
}
}
5. Аутентификация перед доступом к почтовому веб-интерфейсу
server {
listen 443 ssl;
server_name webmail.example.com;
# Базовая аутентификация
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.htpasswd;
# Двухфакторная аутентификация
location = /2fa {
proxy_pass http://auth_server:8000/verify;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
location / {
# Проверка 2FA перед доступом
auth_request /2fa;
proxy_pass http://webmail_server:8080;
proxy_set_header Host $host;
}
}
6. Виртуальные почтовые хосты (для разных доменов)
map $http_host $mail_backend {
hostnames;
default http://default_mail_server:8080;
mail.example.com http://primary_mail_server:8080;
mail.example.org http://secondary_mail_server:8080;
}
server {
listen 443 ssl;
server_name ~^mail\.(.*)$;
ssl_certificate /etc/ssl/certs/wildcard.$1.pem;
ssl_certificate_key /etc/ssl/private/wildcard.$1.key;
location / {
proxy_pass $mail_backend;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
7. Защита от спама и DDoS для почтовых сервисов
http {
# Зона для ограничения скорости
limit_req_zone $binary_remote_addr zone=mailauth:10m rate=5r/m;
server {
listen 443 ssl;
server_name smtp-auth.example.com;
location /auth {
limit_req zone=mailauth burst=10 nodelay;
proxy_pass http://auth_server:8000;
proxy_set_header Host $host;
}
}
}
stream {
# Защита SMTP-порта
server {
listen 25;
proxy_pass smtp_backend;
# Ограничение соединений
proxy_connect_timeout 5s;
proxy_timeout 30s;
# Защита от DDoS
limit_conn mail_conn 10;
limit_conn_log_level warn;
}
}
Важные замечания по безопасности
- Всегда используйте SSL/TLS для почтовых сервисов
- Ограничивайте доступ к административным интерфейсам по IP:
location /admin {
allow 192.168.1.0/24;
allow 10.0.0.1;
deny all;
}
- Регулярно обновляйте SSL-сертификаты
- Настройте правильные заголовки безопасности:
add_header X-Frame-Options "DENY";
add_header X-Content-Type-Options "nosniff";
add_header Content-Security-Policy "default-src 'self'";
- Включайте логирование для мониторинга:
access_log /var/log/nginx/mail_access.log;
error_log /var/log/nginx/mail_error.log;
Эти конфигурации предоставляют базовые примеры для настройки Nginx в качестве прокси для почтовых сервисов. В зависимости от вашего конкретного почтового сервера (Postfix, Dovecot, Exim и т.д.) могут потребоваться дополнительные настройки.