Частина 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_nopush | tcp_nopush невіддільний від опції sendfile. Він використовується для оптимізації кількості інформації, що надсилається одночасно. Пакети надсилаються лише тоді, коли вони досягли максимального розміру. |
tcp_nodelay | Активація tcp_nodelay змушує дані в сокет надсилатися негайно, незалежно від розміру пакета, що є протилежністю до того, що робить tcp_nopush . |
sendfile | Оптимізує надсилання статичних файлів (ця опція не потрібна для інверсної конфігурації проксі). Якщо функцію sendfile увімкнено, Nginx гарантує, що всі пакети будуть завершені, перш ніж вони будуть надіслані клієнту (завдяки tcp_nopush ). Коли надходить останній пакет, Nginx вимикає tcp_nopush і примусово надсилає дані за допомогою tcp_nodelay. |
keepalive_timeout | Максимальний час до закриття неактивного з'єднання. |
types_hash_max_size | Nginx підтримує хеш-таблиці, що містять статичну інформацію. Встановіть максимальний розмір хеш-таблиці. |
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