Перейти к содержанию

🌐 NGINX

NGINX — веб-сервер, который часто используют как обратный прокси, балансировщик нагрузки или кэш статики.

Status: Draft

1. Файлы и каталоги

Типичная раскладка на Debian/Ubuntu:

Путь Назначение
/etc/nginx/nginx.conf Главный конфиг (worker’ы, include)
/etc/nginx/sites-available/ Виртуальные хосты (файлы сайтов)
/etc/nginx/sites-enabled/ Активные сайты — обычно symlink из sites-available
/var/log/nginx/ access.log, error.log

На RHEL/CentOS чаще conf.d/*.conf вместо sites-available/enabled — смысл тот же: отдельный файл на vhost.

2. Основные директивы
Директива Зачем
server { … } Один виртуальный хост
listen Порт / адрес (80, 443 ssl)
server_name Имя хоста
location Правила по URL-пути
root Корень статики
index Файлы по умолчанию (index.html)
proxy_pass Прокси на upstream / другой сервер
try_files Отдать файл или fallback (часто на index.php / SPA)
3. Static site

Минимальный сайт на статике.

Конфиг

/etc/nginx/sites-available/app.example.conf:

server {
    listen 80;
    server_name app.example www.app.example;
    charset utf-8;
    root /var/www/app.example;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}
Включить и проверить
mkdir -p /var/www/app.example
echo '<h1>ok</h1>' > /var/www/app.example/index.html
ln -s /etc/nginx/sites-available/app.example.conf \
      /etc/nginx/sites-enabled/app.example.conf

nginx -t
systemctl reload nginx

Логи: tail -f /var/log/nginx/access.log / error.log. Кто слушает 80: ss -tlnp | grep ':80'.

4. Reverse proxy

nginx принимает запрос снаружи и отдаёт на backend (другой хост/порт/сокет).

Конфиг

Backend слушает, например, 192.168.1.101:8080:

server {
    listen 80;
    server_name app.example;

    location / {
        proxy_pass http://192.168.1.101:8080;
        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;
    }
}

Без Host / X-Forwarded-* backend часто «не понимает» исходный хост и схему (http vs https).

upstream (кратко)

Несколько backend’ов:

upstream app_backends {
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
}

server {
    listen 80;
    server_name app.example;

    location / {
        proxy_pass http://app_backends;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
TLS (HTTPS)
server {
    listen 443 ssl;
    server_name app.example;

    ssl_certificate     /etc/nginx/ssl/app.example.crt;
    ssl_certificate_key /etc/nginx/ssl/app.example.key;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

server {
    listen 80;
    server_name app.example;
    return 301 https://$host$request_uri;
}

Сертификаты: Let's Encrypt (certbot) или корпоративный CA. После правок — nginx -t и reload.

5. PHP-FPM (опционально)

Если нужен PHP через unix-сокет FPM.

location для .php
server {
    listen 80;
    server_name app.example;
    root /var/www/app.example;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Пакеты (Debian): nginx + php-fpm (версия сокета должна совпасть с установленной). Проверка: echo '<?php phpinfo();' > /var/www/app.example/index.php.

Вопросы

В разработке..