Тематические термины: NGINX , FreeBSD , CentOS , Linux .
Советы и примеры по тюнингу NGINX показаны на базе операционных систем FreeBSD, CentOS и Ubuntu.
Подготовка
Общие настройки NGINX
Оптимизация работы с файлами
Логирование
Сжатие
Настройка метода select
Пример готового файла конфигурации
Проверка конфигурации и перезапуск nginx
Кэширование от backend’а
Сборка NGINX из исходников
Дополнительная информация
Убедимся, что мы готовы перейти в оптимизации. Для этого мы должны обладать достаточными правами и понимать, какие нам нужны конфигурационные файлы веб-сервера.
Предполагается, что все действия мы будем выполнять от суперпользователя, поэтому для удобства, сразу зайдем в систему под ним:
$ su
Путь до конфигурационного файла nginx зависит от его способа установки и типа операционной системы.
а) во FreeBSD:
vi /usr/local/etc/nginx.conf
б) в Linux:
vi /etc/nginx/nginx.conf
* для собранного из исходников nginx путь может быть разным, например, /etc/nginx/conf/nginx.conf .
Прежде чем начать, определите путь до конфигурационного файла в вашей системе.
Начнем тюнинг nginx, настроив несколько основных параметров, отвечающих за количество обрабатываемых соединений и сроки их поддержания.
Пример настроенного nginx.conf:
worker_processes auto;
worker_priority -2;
…
events {
worker_connections 2048;
multi_accept on;
}
worker_rlimit_nofile 16384;
…
http {
…
keepalive_timeout 45;
reset_timedout_connection on;
client_body_timeout 35;
send_timeout 30;
…
}
* где:
Пример настроенного nginx.conf:
http {
…
sendfile on;
tcp_nopush on;
open_file_cache max=100000 inactive=20s;
open_file_cache_valid 45s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
…
}
* где:
Также вы можете найти инструкции по тюнингу, где говорится об опции tcp_nodelay . Ее менять не нужно, так как по умолчанию она уже включена.
Открываем на редактирование файл с настройками лимитов для пользователей и групп:
vi /etc/security/limits.conf
Добавим строки:
…
nginx hard nofile 199680
nginx soft nofile 16384
…
* в данном примере мы задаем ограничение для пользователя nginx на количество открытых файлов. Для soft задаем такое же число, что указывали в worker_rlimit_nofile .
Зададим ограничение для текущей загрузки:
ulimit -n 65536
Если отключить логирование всех подключений к nginx, можно немного снизить нагрузку на дисковую систему. Но при этом стоит оставить логирование критических ошибок.
Пример настроенного nginx.conf:
error_log /var/log/nginx-error.log crit;
http {
…
access_log off;
…
* само собой, не стоит отключать логирование на хостинге или если вы предоставляете доступ к веб-сервису третьим лицам.
Это один из самых эффективных методов ускорить ответ от вашего веб-сервера nginx.
Пример настроенного nginx.conf:
http {
…
gzip on;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/javascript application/javascript application/x-javascript text/xml application/xml application/xml+rss application/json;
gzip_disable «msie6»;
…
gzip включает сжатие.
gzip_min_length устанавливает минимальную длину ответов, для которых будет применяться сжатие. По умолчанию 20, но имеет смысл поставить больше, так как постоянное сжатие приведет к повышению нагрузки на процессоры сервера и клиента.
gzip_proxied перечисляет параметры проксированных запросов, для которых будет разрешено сжатие.
gzip_types по умолчанию включено сжатие для ответов типа текст. В данном параметре можно перечислить все необходимые типы ответов.
gzip_disable запрещает для перечисленных параметров заголовка User-Agent сжатие. В данном примере для Internet Explorer 6 сжатие применяться не будет (данный браузер не умеет принимать сжатые ответы).
В Linux и FreeBSD используются свои методы обработки соединений. На данный момент наиболее эффективными являются epoll (Linux) и kqueue (FreeBSD).
а) Пример nginx.conf для FreeBSD:
events {
…
use kqueue;
}
б) Пример nginx.conf для Linux:
events {
…
use epoll;
}
NGINX умеет сам отдавать статические данные, не заставляя сервер backend этим заниматься. В настройке каждого сайта (секция server добавляем):
server {
…
location ~* ^.+.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|docx|xls|xlsx|exe|pdf|ppt|tar|wav|bmp|rtf|js|svg|woff2|ttf)$ {
root /var/www/site
expires modified +1w;
}
}
* в данном примере для перечисленных статических файлов NGINX сам будет сам их отдавать. Сами файлы мы будем искать в каталоге /var/www/site , однако, опцию root можно и не задавать в location, если мы ее задали уровнем выше (в секции server ). Также мы задали время кэширования для файлов, равное 1 недели от момента их модификации.
В итоге, у нас получиться что-то на подобие:
worker_processes auto;
worker_priority -2;
events {
worker_connections 2048;
multi_accept on;
use epoll;
}
worker_rlimit_nofile 16384;
http {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 45;
reset_timedout_connection on;
client_body_timeout 35;
send_timeout 30;
sendfile on;
tcp_nopush on;
open_file_cache max=100000 inactive=20s;
open_file_cache_valid 45s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
access_log off;
error_log /var/log/nginx-error.log crit;
gzip on;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/javascript application/javascript application/x-javascript text/xml application/xml application/xml+rss application/json;
gzip_disable «msie6»;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
* обратите внимание, что в Linux в events use задается epoll , во FreeBSD — kqueue .
После внесения всех настроек необходимо проверить их корректность командой:
nginx -t
Мы должны получить что-то на подобие:
…
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Теперь можно применить настройки командой:
nginx -s reload
Стоит отдельно рассмотреть возможность кэширования ответа от сервера бэкэнд. Когда nginx передает запрос на обработку интерпретатору, он может сохранить ответ и выдавать его некоторое время. С одной стороны, это очень сильно увеличивает скорость ответа, с другой — если неправильно настроить кэш, пользователи будут получать устаревшие данные.
Подробнее про данную настройку рассказано в инструкции Кэширование ответа от backend с помощью NGINX .
Если же нам нужно выжать из сервера максимум производительности установка nginx из пакетов или портов не подходит. Лучше всего выполнять сборку и установку из исходников — таким образом, мы можем отказаться от части функций, которые нам не нужны.
Скачайте последнюю стабильную версию nginx (актуальную ссылку можно посмотреть по адресу http://nginx.org/ru/download.html ):
… и с помощью данной ссылки скачиваем исходник.
а) во FreeBSD:
fetch http://nginx.org/download/nginx-1.16.1.tar.gz
б) в Linux:
wget http://nginx.org/download/nginx-1.16.1.tar.gz
* На момент обновления статьи актуальная версия nginx — 1.16.1.
Распакуйте скачанный архив и сразу удалите его, чтобы не мешался:
tar -xvf nginx-*.tar.gz && rm nginx-*.tar.gz
И перейдите в распакованную директорию:
cd nginx-*
Сконфигурируйте исходники для установки:
а) для FreeBSD:
Сначала устанавливаем пакеты, необходимые для сборки:
pkg install pcre
Приступаем к конфигурированию:
./configure
—prefix=/usr/local/etc/nginx
—with-cc-opt=’-I /usr/local/include’
—with-ld-opt=’-L /usr/local/lib’
—conf-path=/usr/local/etc/nginx/nginx.conf
—sbin-path=/usr/local/sbin/nginx
—pid-path=/var/run/nginx.pid
—error-log-path=/var/log/nginx-error.log
—user=www
—group=www
—http-client-body-temp-path=/var/tmp/nginx/client_body_temp
—http-fastcgi-temp-path=/var/tmp/nginx/fastcgi_temp
—http-proxy-temp-path=/var/tmp/nginx/proxy_temp
—http-scgi-temp-path=/var/tmp/nginx/scgi_temp
—http-uwsgi-temp-path=/var/tmp/nginx/uwsgi_temp
—http-log-path=/var/log/nginx-access.log
—with-http_ssl_module
—with-file-aio
—with-pcre
—with-http_stub_status_module
—without-http_charset_module
—without-http_ssi_module
—without-http_userid_module
—without-http_autoindex_module
—without-http_geo_module
—without-http_map_module
—without-http_split_clients_module
—without-http_referer_module
—without-http_empty_gif_module
—without-http_browser_module
—without-http_upstream_hash_module
—without-http_upstream_ip_hash_module
—without-http_upstream_least_conn_module
—without-http_upstream_keepalive_module
—without-mail_pop3_module
—without-mail_imap_module
—without-mail_smtp_module
а) для CentOS:
Сначала устанавливаем пакеты, необходимые для сборки:
yum install gcc pcre-devel openssl-devel make
Приступаем к конфигурированию:
./configure
—prefix=/etc/nginx
—sbin-path=/usr/sbin/nginx
—pid-path=/var/run/nginx.pid
—error-log-path=/var/log/nginx/error.log
—lock-path=/var/run/nginx.lock
—user=nginx
—group=nginx
—http-log-path=/var/log/nginx-access.log
—with-http_ssl_module
—with-file-aio
—with-pcre
—with-http_stub_status_module
—without-http_charset_module
—without-http_ssi_module
—without-http_userid_module
—without-http_autoindex_module
—without-http_geo_module
—without-http_map_module
—without-http_split_clients_module
—without-http_referer_module
—without-http_empty_gif_module
—without-http_browser_module
—without-http_upstream_hash_module
—without-http_upstream_ip_hash_module
—without-http_upstream_least_conn_module
—without-http_upstream_keepalive_module
—without-mail_pop3_module
—without-mail_imap_module
—without-mail_smtp_module
* Данный список опций подойдет для большинства серверов, но не помешает узнать о всех возможностях при помощи команды ./configure —help
Теперь запустите сборку дистрибутива из исходника:
make
И установите nginx:
make install
Теперь можно запустить и проверить наш веб-сервер.
а) во FreeBSD необходимо разрешить запуск демона nginx:
echo ‘nginx_enable=»YES»‘ >> /etc/rc.conf
service nginx start
б) в CentOS действий больше.
Создаем учетную запись nginx и в качестве владельца каталога для его настроек:
useradd nginx
chown -R nginx:nginx /etc/nginx
Создаем юнит для systemd:
vi /etc/systemd/system/nginx.service
[Unit]
Description=nginx — high performance web server
Documentation=https://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/conf/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
Применяем изменения в systemd:
systemctl daemon-reload
Разрешаем автозапуск сервиса и стартуем его:
systemctl enable nginx
systemctl start nginx
Другие инструкции, близкие по теме:
1. Ограничения и лимиты в NGINX .
2. Анализ нагрузки на веб-сервер Linux .
3. Установка и настройка модуля PageSpeed .
Zulip — программное обеспечение для реализации корпоративного чата. Разработан в 2012 году, в 2014 был…
Zookeeper — cервис-координатор, который позволяет обеспечить контроль синхронизации данных. Разработан на Java компанией Apache Software…
Zimbra — программное обеспечение для реализации почтового сервиса или, если сказать точнее, автоматизации совместной деятельности…
Zabbix — бесплатная система мониторинга. Позволяет отслеживать состояние сетевых узлов, компьютеров и серверов. Возможности: Поддержка…
YouTube — компания-владелец одноименного портала для просмотра и хранения видео. Чтобы пользоваться данным порталом достаточно…
Yota — провайдер, предоставляющий доступ к сети Интернет по беспроводной связи. Впервые, сервис начал работать…