В интернете огромное количество статей про установку и настройку Nginx, но во многих статьях есть грубые ошибки конфигурации и неточности.
В небольшой серии статей я постараюсь на реальном сервере показать как правильно устанавливать и настраивать Nginx под разные типовые задачи.
Итак, вперед…
Исходные данные: Debian 8.9 (jessie)
Задача: Установить и настроить Nginx (ветка Mainline)
1. Выполняем установку wget (Опционально):
apt-get update apt-get install wget -y
2. Скачиваем и добавляем ключ Nginx Inc. на нашу систему:
wget --quiet -O - http://nginx.org/keys/nginx_signing.key | apt-key add -
Если нужно установить Nginx из ветки Stable, то выполняем:
echo "deb http://nginx.org/packages/debian/ $(lsb_release -sc) nginx">/etc/apt/sources.list.d/nginx.list echo "deb-src http://nginx.org/packages/debian/ $(lsb_release -sc) nginx">>/etc/apt/sources.list.d/nginx.list
Если нужно установить Nginx из ветки Mainline, то выполняем:
echo "deb http://nginx.org/packages/mainline/debian/ $(lsb_release -sc) nginx">/etc/apt/sources.list.d/nginx.list echo "deb-src http://nginx.org/packages/mainline/debian/ $(lsb_release -sc) nginx">>/etc/apt/sources.list.d/nginx.list
3. Обновляем список пакетов:
apt-get update
4. Устанавливаем Nginx и OpenSSL (опционально):
apt-get install nginx -y apt-get install openssl -y
5. После установки запускаем Nginx:
service nginx start
6. Проверим факта запуска Nginx:
# service nginx status ● nginx.service - nginx - high performance web server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2017-11-29 00:38:05 +05; 1s ago Docs: http://nginx.org/en/docs/ Process: 2650 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS) Main PID: 2651 (nginx) Tasks: 2 (limit: 4915) CGroup: /system.slice/nginx.service ├─2651 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf └─2652 nginx: worker process
Строка «Active: active (running)» говорит о работе Nginx.
7. Проверим открытые порты:
# netstat -ltupn | grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3503/nginx.conf
Видим, что Nginx ожидает соединения на 80 порту на всех сетевых интерфейсах.
Теперь по адресу http://Ваш-IP-адрес Вы сможете увидеть приветственную страницу «Welcome to nginx!».
Теперь займемся базовой настройкой.
1. Создадим директорию для хранения SSL сертификатов и DH-ключей, а также создаем файл с параметрами для DHE-шифров:
mkdir /etc/nginx/ssl/ openssl dhparam -out /etc/nginx/ssl/dhparams.pem 2048
2. Создадим директории для хранения настроек Web-сайтов:
mkdir /etc/nginx/sites-available /etc/nginx/sites-enabled
3. Отредактируем основной файл настроек Nginx.
Я приведу базовый эталонный файл настроек который использую я на 99% серверов, рекомендую использовать его с дополнительными Вашими правками под конкретные нужды. В файле присутствуют комментарии для многих параметров.
Скачать уже готовый файл для Nginx версии 1.13.x (1.15.x) и выше Вы можете командой:
wget https://gist.githubusercontent.com/CHERTS/8e9ecf4fbfb765556311a88e5106174b/raw/nginx.conf -O /etc/nginx/nginx.conf
Файл /etc/nginx/nginx.conf с описанием:
user www-data; worker_processes auto; worker_cpu_affinity auto; worker_rlimit_nofile 10000; worker_shutdown_timeout 30; pid /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 TLSv1.1 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 и TLS серверные шифры были более приоритетны, чем клиентские 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.conf и проверяем конфигурацию:
nginx -t
Если ошибок нет, то перезагружаем конфигурацию Nginx:
nginx -s reload
4. Меняем системные лимиты на кол.открытых файлов.
Т.к. мы указали в nginx.conf параметр worker_rlimit_nofile = 10000, то будем исходить из него.
Традиционно во всех статьях в Интернет все меняют лимиты через редактирование файла /etc/security/limits.conf, но это неправильно, т.к. для Debian 8 и Debian 9 этот файл не работает.
В Debian 8 и Debian 9 используется система инициализации 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 service nginx restart
Теперь проверим лимиты, для этого смотрим строку «Max open files» в выводе:
# cat /proc/$(cat /var/run/nginx.pid)/limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 31074 31074 processes Max open files 10000 10000 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 31074 31074 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
Все отлично!
На этом базовая настройка Nginx завершена, до скорых встреч. Продолжение следует…
Если у Вас возникли вопросы или Вы хотите чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.
Профессионально занимаюсь системным администрированием Linux -серверов и баз данных (MySQL, POstgreSQL) на протяжении последних 24 лет.