Перейти до змісту

Частина 2.2 Веб-сервери Nginx

Веб-сервер Nginx

У цьому розділі ви дізнаєтеся про веб-сервер Nginx.


Цілі: Ви дізнаєтеся, як:

✔ встановити та налаштувати Nginx

🏁 nginx, http

Знання: ⭐ ⭐\ Складність: ⭐ ⭐

Час читання: 15 хвилин


Загальні положення

Nginx — це безкоштовний веб-сервер HTTP під ліцензією BSD. Вперше він був розроблений в Росії в 2002 році Ігорем Сисоєвим. На додаток до стандартних функцій веб-сервера, Nginx надає зворотний проксі для протоколу HTTP і проксі для протоколів обміну повідомленнями POP і IMAP.

Розробка сервера Nginx є відповіддю на проблему C10K, яка підтримує десять тисяч одночасних підключень (стандарт сучасного Інтернету). Це справжній виклик для веб-серверів.

Комерційна підтримка доступна від Nginx Inc.

Внутрішня архітектура сервера забезпечує дуже високу продуктивність з низьким споживанням пам’яті порівняно з веб-сервером Apache.

Модулі, що доповнюють основні функції ядра Nginx, обмежені часом компіляції. Це означає, що активація або деактивація не може відбуватися динамічно.

Головний процес контролює серверні процеси, дозволяючи змінювати конфігурацію або оновлювати програмне забезпечення без зупинки служби.

Nginx має значну частку ринку в 28% на найбільш завантажених сайтах, відразу поступаючись Apache (41%).

Особливості

Nginx пропонує такі основні функції:

  • Хостинг статичних веб-сторінок
  • Автоматичне створення індексної сторінки
  • Прискорений зворотний проксі з кешем
  • Балансування навантаження
  • Відмовостійкість
  • Кешована підтримка для кеш-сервера FastCGI, uWSGI, SCGI та Memcached
  • Різні фільтри для gzip, xslt, ssi, трансформації зображень тощо
  • Підтримка SSL/TLS і SNI
  • Підтримка HTTP/2

Інші особливості:

  • Хостинг по імені або IP-адресі
  • Keepalive керування підключеннями клієнтів
  • Керування журналами: syslog, ротація, буфер
  • Перезапис URI
  • Контроль доступу: за IP, паролем та ін
  • Потокове передавання FLV і MP4

Встановлення

Nginx доступний безпосередньо зі сховища потоків програм, а новіші версії доступні як модуль dnf.

sudo dnf install nginx
sudo systemctl enable nginx --now

Конфігурація

Розташування конфігурації Nginx знаходиться в /etc/nginx/nginx.conf.

Цей файл конфігурації є глобальним файлом конфігурації сервера. Налаштування впливають на весь сервер.

Примітка

Відома адміністраторам Apache функція файлу .htaccess не існує в Nginx!

Тут подано файл nginx.conf, позбавлений усіх коментарів:

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;
        include /etc/nginx/default.d/*.conf;
        error_page 404 /404.html;
        location = /404.html {
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
}

Налаштування за замовчуванням:

ДирективаОпис
userВизначає власника процесу user або group. Якщо група не вказана, використовується група з іменем користувача.
worker_processesВизначає кількість процесів. Оптимальне значення залежить від багатьох факторів, таких як кількість ядер ЦП і характеристики жорсткого диска. У разі сумнівів документація Nginx пропонує початкове значення, еквівалентне кількості доступних ядер ЦП (автоматичне значення спробує це визначити).
pidВизначає файл для зберігання значення PID.
worker_connectionsВстановлює максимальну кількість одночасних підключень, які може відкрити робочий процес (до клієнта та уповноважених серверів).
tcp_nopushtcp_nopush невіддільний від опції sendfile. Він використовується для оптимізації кількості інформації, що надсилається одночасно. Пакети надсилаються лише тоді, коли вони досягли максимального розміру.
tcp_nodelayАктивація tcp_nodelay змушує дані в сокет надсилатися негайно, незалежно від розміру пакета, що є протилежністю до того, що робить tcp_nopush.
sendfileОптимізує надсилання статичних файлів (ця опція не потрібна для інверсної конфігурації проксі). Якщо функцію sendfile увімкнено, Nginx гарантує, що всі пакети будуть завершені, перш ніж вони будуть надіслані клієнту (завдяки tcp_nopush). Коли надходить останній пакет, Nginx вимикає tcp_nopush і примусово надсилає дані за допомогою tcp_nodelay.
keepalive_timeoutМаксимальний час до закриття неактивного з'єднання.
types_hash_max_sizeNginx підтримує хеш-таблиці, що містять статичну інформацію. Встановіть максимальний розмір хеш-таблиці.
includeВключає інший файл або файли, які відповідають шаблону, наданому в конфігурації.
default_typeТип запиту MIME за замовчуванням.
ssl_protocolsПрийнятні версії протоколу TLS.
ssl_prefer_server_ciphersНадає перевагу набору шифрів сервера, а не набору шифрів клієнта.
access_logНалаштовує журнали доступу (див. параграф «керування журналами»).
error_logНалаштовує журнали помилок (див. параграф «керування журналами»).
gzipМодуль ngx_http_gzip_module — це фільтр, який стискає дані, передані у форматі gzip.
gzip_disableВимикає gzip на основі регулярного виразу.

Структура конфігурації Nginx така:

# global directives

events {
    # worker configuration
}

http {
    # http service configuration

    # Configure the first server listening on port 80
    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        root /var/www/html;
        index index.html index.htm;
        server_name _;
        location / {
            try_files $uri $uri/ =404;
        }
    }
}

mail {
    # mail service configuration

# global mail service directives
   server {
        # A first server listening on the pop protocol
        listen     localhost:110;
        protocol   pop3;
        proxy      on;
   }


   server {
        # A second server listening on the imap protocol
       listen     localhost:143;
       protocol   imap;
       proxy      on;
   }
}

Конфігурація https

Щоб налаштувати службу HTTPS, необхідно додати серверний блок або змінити існуючий. Серверний блок може слухати як порт 443, так і порт 80.

Ви можете додати цей блок, наприклад, до нового файлу /etc/nginx/conf.d/default_https.conf:

server {
    listen              443 ssl default_server;
    ssl_protocols       TLSv1.3 TLSv1.2 TLSv1.1
    ssl_certificate     /path/to/cert.pem;
    ssl_certificate_key /path/to/key.key;
    root                /var/www/html;
    index               index.html index.htm;
    server_name         _;
    location / {
        try_files       $uri $uri/ =404;
    }
}

або ви можете змінити сервер за замовчуванням для підтримки HTTPS:

server {
    listen              80;
    listen              443 ssl;
    server_name         _;
    ssl_protocols       TLSv1.3 TLSv1.2 TLSv1.1
    ssl_certificate     /path/to/cert.pem;
    ssl_certificate_key /path/to/key.key;
    ...
}

Керування журналами

Ви можете налаштувати директиву error_log для журналів помилок.

Синтаксис директиви error_log:

error_log file [level];

Перший параметр визначає файл для отримання журналів помилок.

Другий параметр визначає рівень журналу: debug, info, notice, warn, error, crit, alert або emerg (див. розділ про syslog нашого посібника адміністратора).

Функція надсилання журналів до syslog має префікс «syslog:».

access_log syslog:server=192.168.1.100:5514,tag=nginx debug;

Nginx як зворотний проксі

Функція зворотного проксі-сервера доступна за допомогою ngx_http_upstream_module. Це дозволяє визначати групи серверів, які потім викликаються директивами proxy_pass або fastcgi_pass, memcached_pass тощо.

Приклад базової конфігурації, яка розподіляє навантаження 2/3 на перший сервер і 1/3 на другий сервер додатків:

    upstream frontservers {
        server front1.rockylinux.lan:8080       weight=2;
        server front2.rockylinux.lan:8080       weight=1;
    }

    server {
        location / {
            proxy_pass http://docs.rockylinux.lan;
        }
    }

Ви можете оголосити сервери резервними:

    upstream frontservers {
        ...
        server front3.rockylinux.lan:8080   backup;
        server front4.rockylinux.lan:8080   backup;
    }

Директива сервера приймає багато аргументів:

  • max_fails=numberofattempts: встановлює кількість спроб з’єднання, які мають бути невдалими протягом періоду часу, визначеного параметром fail_timeout, щоб сервер вважався недоступним. Значення за замовчуванням 1; 0 вимикає функціональність.
  • fail_timeout=time: встановлює час, протягом якого певна кількість підключень призведе до того, що сервер буде недоступний, і встановлює період часу, протягом якого сервер вважатиметься недоступним. Значення за замовчуванням становить 10 секунд.

Author: Antoine Le Morvan

Contributors: Steven Spencer, Ganna Zhyrnova