Для установки Nginx имеется инструкция:
https://nginx.org/ru/linux_packages.html
Мы её немного дополним начальной настройкой.
Установка Nginx
В стандартных репозиториях довольно старый пакет Nginx, так что будем устанавливать последний. Работаем под рутом.
Устанавливаем пакеты, необходимые для подключения apt-репозитория:
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
Импортируем официальный ключ, используемый apt для проверки подлинности пакетов:
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Проверяем, верный ли ключ был загружен:
gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
Вывод команды должен содержать полный отпечаток ключа 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62:
pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 uid nginx signing key <signing-key@nginx.com>
Если отпечаток отличается от вышеуказанного, удалите файл ключа.
Подключаем репозиторий. Для подключения apt-репозитория для стабильной версии nginx:
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
Для подключения apt-репозитория для основной версии nginx (мой случай):
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
Закрепим пакеты, чтобы они не тянулись из репозиториев Ubuntu, а брались только с репозитория nginx:
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx
Устанавливаем Nginx:
sudo apt update
sudo apt install nginx
Настройка Nginx
Включаем автостарт nginx:
systemctl enable --now nginx
Проверим статус:
systemctl status nginx
Nginx запущен: "Active: active (running)".
Проверим, какие порты прослушивает nginx:
netstat -plntu | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 102777/nginx: master
Видим, что Nginx слушает 80 порт на всех сетевых интерфейсах.
Создаём директорию для SSL сертификатов и ключей DH:
mkdir /etc/nginx/ssl
Создаём файл с параметрами DHE-шифрования:
openssl dhparam -out /etc/nginx/ssl/dhparams.pem 2048
Создадим директории для конфигурационных файлов сайтов.
mkdir /etc/nginx/sites-available /etc/nginx/sites-enabled
Модифицируем настройки /etc/nginx/nginx.conf (для Nginx версии 1.26.x, для пользователя www-data):
-
/etc/nginx/nginx.conf
user www-data; worker_processes auto; worker_cpu_affinity auto; worker_rlimit_nofile 10000; worker_shutdown_timeout 30; pid /var/run/nginx.pid; events { worker_connections 1024; # Для Linux 2.6+ - epool, Для FreeBSD - kqueue use epoll; multi_accept on; } http { ## # Basic Settings ## # Удаляем информацию об nginx в headers server_tokens off; # Метод отправки данных sendfile более эффективен, чем стандартный метод read+write (по умолчанию: off) sendfile on; # Будет отправлять заголовки и начало файла в одном пакете (по умолчанию: off) tcp_nopush on; tcp_nodelay on; # Будет ждать 60 секунд перед закрытием keepalive соединения (по умолчанию: 75s) keepalive_timeout 60s; # Задаёт максимальное число запросов, которые можно сделать по одному keep-alive соединению. После того, как сделано максимальное число запросов, соединение закрывается. (по умолчанию: 100) keepalive_requests 500; # Разрешает или запрещает сброс соединений по таймауту (по умолчанию: off) reset_timedout_connection on; # Будет ждать 30 секунд тело запроса от клиента, после чего сбросит соединение (по умолчанию: 60s) client_body_timeout 30s; # Не будет принимать запросы размером более 256Мб (по умолчанию: 1m) client_max_body_size 256m; # Если клиент прекратит чтение ответа, Nginx подождет 30 секунд и сбросит соединение (по умолчанию: 60s) send_timeout 30s; # Задаёт максимальный размер хэш-таблиц типов (по умолчанию: 1024) types_hash_max_size 2048; # Задаёт максимальный размер хэш-таблиц имён серверов (по умолчанию: 512) server_names_hash_max_size 8192; # Задаёт размер корзины в хэш-таблицах имён серверов (по умолчанию: зависит от размера строки кэша процессора) server_names_hash_bucket_size 128; include /etc/nginx/mime.types; default_type application/octet-stream; ## # SSL Settings ## # Разрешает указанные протоколы ssl_protocols TLSv1.2; # Набор шифров, использовался сайт https://ssl-config.mozilla.org/ в режиме Intermediate ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; # Задаем кривую для ECDHE-шифров ssl_ecdh_curve prime256v1:secp384r1:secp521r1; # Указываем, что при использовании протоколов SSLv3 и TLSv1 (мы их не используем, они устарели) серверные шифры были более приоритетны, чем клиентские ssl_prefer_server_ciphers off; # Указываем файл с параметрами для DHE-шифров ssl_dhparam /etc/nginx/ssl/dhparams.pem; # Задаём тип (разделяемый) и размеры кэшей для хранения параметров сессий ssl_session_cache shared:MAINSSL:10m; # Задаёт время, в течение которого клиент может повторно использовать параметры сессии ssl_session_timeout 1d; ## # Logging Settings ## log_format hosting '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$gzip_ratio"'; log_format main '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" "$http_x_forwarded_for" "$host" $upstream_response_time'; log_format bytes '$bytes_sent'; log_format download '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$http_range" "$sent_http_content_range"'; log_format postdata '$remote_addr [$time_local] "$request" $status "$request_body" "$http_cookie"'; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## # Включаем сжатие gzip (по умолчанию: off) gzip on; # Устанавливает минимальную HTTP-версию запроса, необходимую для сжатия ответа. (по умолчанию: 1.1) gzip_http_version 1.0; # Задаёт число и размер буферов, в которые будет сжиматься ответ. gzip_buffers 64 8k; # Устанавливает степень сжатия ответа методом gzip. Более 5 лучше не ставить, т.к. будет повышеная нагрузка на CPU, а уровень сжатия изменится незначительно. gzip_comp_level 5; # Минимальная длина файла, которую нужно сжимать gzip_min_length 512; # MIME-типы файлов в дополнение к text/html, которые нужно сжимать gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript; # Для IE6 отключить gzip_disable msie6; # Cжатие для всех проксированных запросов (для работы NGINX+Apache)(по умолчанию: off) gzip_proxied any; ## # nginx fastcgi config ## # Задаёт размер буфера, в который будет читаться первая часть ответа, получаемого от FastCGI-сервера (по умолчанию: 4k или 8k) fastcgi_buffer_size 128k; # Задаёт число и размер буферов для одного соединения, в которые будет читаться ответ, получаемый от FastCGI-сервера(по умолчанию: 8 и 4k или 8k) fastcgi_buffers 4 256k; # При включённой буферизации ответов FastCGI-сервера, ограничивает суммарный размер буферов, которые могут быть заняты для отправки ответа клиенту, пока ответ ещё не прочитан целиком (по умолчанию 8k|16k размер ограничен двумя буферами, заданными директивами fastcgi_buffer_size и fastcgi_buffers) fastcgi_busy_buffers_size 256k; # Задаёт таймаут при чтении ответа FastCGI-сервера (по умолчанию: 60s) fastcgi_read_timeout 120s; ## Detect when HTTPS is used map $scheme $fastcgi_https { default off; https on; } ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
Можно автоматически скачать конфигурационный файл, для пользователя nginx:
wget https://gist.githubusercontent.com/CHERTS/4b1ad58e06404267591636a9f2b08114/raw/nginx.conf -O /etc/nginx/nginx.conf
Проверяем конфигурацию Nginx:
nginx -t
Ошибок нет, перезагружаем конфигурацию Nginx:
nginx -s reload
Меняем системные лимиты на количество открытых файлов. В nginx.conf параметр worker_rlimit_nofile = 10000, нужно настроить в системе то же самое. В Ubuntu используется система инициализации systemd и поэтому лимиты на максимальное количество открытых файлов нужно настроить для systemd:
mkdir -p /lib/systemd/system/nginx.service.d
echo "[Service]" >/lib/systemd/system/nginx.service.d/limit.conf
echo "LimitNOFILE=10000" >>/lib/systemd/system/nginx.service.d/limit.conf
systemctl daemon-reload
systemctl restart nginx
Проверим лимиты:
cat /proc/$(cat /var/run/nginx.pid)/limits
Смотрим Max open files. Видим наше значение 10000.
При начальной установке имеется один сайт по умолчанию "Welcome to nginx!". Его конфигурация находится в файле /etc/nginx/conf.d/default.conf:
cat /etc/nginx/conf.d/default.conf | egrep -Ev "^\s*(;|#|$)"
server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
Начальная настройка завершена.