Примеры настройки nginx
Настройка Nginx для управления контейнерами, разделами сайта и поддоменами
Categories:
Оглавление
- Базовые настройки 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