Это многостраничный печатный вид этого раздела. Нажмите что бы печатать.

Вернуться к обычному просмотру страницы.

Nginx

Nginx — это программное обеспечение с открытым исходным кодом для создания легкого и мощного веб-сервера.

Документация

1 - Примеры настройки nginx

Настройка Nginx для управления контейнерами, разделами сайта и поддоменами

Оглавление

  1. Базовые настройки Nginx
  2. Конфигурация для контейнеров
  3. Настройка разделов сайта
  4. Работа с поддоменами
  5. Использование regex в Nginx
  6. Оптимизация и безопасность

Базовые настройки 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;

Заключение

В этом руководстве мы рассмотрели:

  1. Базовую настройку Nginx
  2. Конфигурацию для работы с контейнерами
  3. Организацию разделов сайта
  4. Настройку поддоменов
  5. Использование регулярных выражений
  6. Оптимизацию и безопасность
  • Тестирование конфигураций с помощью 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;
    }
}

Важные замечания по безопасности

  1. Всегда используйте SSL/TLS для почтовых сервисов
  2. Ограничивайте доступ к административным интерфейсам по IP:
    location /admin {
        allow 192.168.1.0/24;
        allow 10.0.0.1;
        deny all;
    }
    
  3. Регулярно обновляйте SSL-сертификаты
  4. Настройте правильные заголовки безопасности:
    add_header X-Frame-Options "DENY";
    add_header X-Content-Type-Options "nosniff";
    add_header Content-Security-Policy "default-src 'self'";
    
  5. Включайте логирование для мониторинга:
    access_log /var/log/nginx/mail_access.log;
    error_log /var/log/nginx/mail_error.log;
    

Эти конфигурации предоставляют базовые примеры для настройки Nginx в качестве прокси для почтовых сервисов. В зависимости от вашего конкретного почтового сервера (Postfix, Dovecot, Exim и т.д.) могут потребоваться дополнительные настройки.