Код ошибки keepalive timeout

Практические советы по тюнингу веб-сервера NGINX

Советы и примеры по тюнингу NGINX показаны на базе операционных систем FreeBSD и CentOS, но они подойдут для любой системы семейства Linux.

Все действия нужно выполнять от суперпользователя, поэтому для удобства, сразу зайдем в систему под ним:

1. Установка NGINX

Для тюнинга установка из пакетов или портов не подходит. Лучше всего выполнять сборку и установку из исходников.

Скачайте последнюю стабильную версию nginx (актуальную ссылку можно посмотреть по адресу https://nginx. org/ru/download. html):

Копируем ссылку на последнюю стабильную версию NGINX

. и с помощью данной ссылки скачиваем исходник.

* На момент обновления статьи актуальная версия nginx — 1.16.1.

Распакуйте скачанный архив и сразу удалите его, чтобы не мешался:

И перейдите в распакованную директорию:

Сконфигурируйте исходники для установки:

Сначала устанавливаем пакеты, необходимые для сборки:

Приступаем к конфигурированию:

./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

Сначала устанавливаем пакеты, необходимые для сборки:

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

Теперь запустите сборку дистрибутива из исходника:

И установите nginx:

Теперь можно запустить и проверить наш веб-сервер.

а) во FreeBSD необходимо разрешить запуск демона nginx:

service nginx start

б) в CentOS действий больше.

Создаем учетную запись nginx и в качестве владельца каталога для его настроек:

Создаем юнит для systemd:

Применяем изменения в systemd:

Разрешаем автозапуск сервиса и стартуем его:

systemctl enable nginx

systemctl start nginx

2. Настройка NGINX

Продолжим тюнинг nginx, настроив несколько основных параметров, отвечающих за количество обрабатываемых соединений и сроки их поддержания.

Открываем конфигурационный файл nginx.

. или, если nginx ставился из пакетов:

Пример настроенного nginx. conf:

multi_accept, по умолчанию off. Если включен, позволяет принимать максимально возможное количество соединений. Иначе, процесс nginx за один раз будет принимать только одно новое соединение.

3. Оптимизация работы с файлами

Пример настроенного nginx. conf:

http <
.
sendfile on;
aio 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;
.
>

sendfile позволяет использовать более совершенный системный вызов, который обеспечивает прямую передачу файла (без системных вызовов read + write).

aio включает использование асинхронного обращения к файлам, что избавит от очередей запросов.

tcp_nopush позволит передавать заголовок ответа и начало файла в одном пакете.

open_file_cache по умолчанию выключена. Задает настройку для кэширования информации о файлах, с которыми работает nginx. По умолчанию, выключено.

open_file_cache_valid задает время, через которое веб-сервер будет проверять актуальность данных. По умолчанию, 60 секунд.

open_file_cache_min_uses задает минимальное число обращений к файлу, чтобы дескриптор файла оставался открытым в кэше.

open_file_cache_errors включает или выключает кэширование ошибок.

Также вы можете найти инструкции по тюнингу, где говорится об опции tcp_nodelay. Ее менять не нужно, так как по умолчанию она уже включена.

Для того, чтобы aio заработал в FreeBSD, необходимо выполнить следующее.

Подгружаем модуль aio в ядро системы:

Для автоматической подгрузки модуля во время включения нашего веб-сервера:

Открываем на редактирование файл с настройками лимитов для пользователей и групп:

.
nginx hard nofile 199680
nginx soft nofile 65535
.

* в данном примере мы задаем ограничение для пользователя nginx на количество открытых файлов.

Зададим ограничение для текущей загрузки:

4. Логирование

Если отключить логирование всех подключений к nginx, можно немного снизить нагрузку на дисковую систему. Но при этом стоит оставить логирование критических ошибок.

Пример настроенного nginx. conf:

error_log /var/log/nginx-error. log crit;

* само собой, не стоит отключать логирование на хостинге или если вы предоставляете доступ к веб-сервису третьим лицам.

5. Сжатие

Это один из самых эффективных методов ускорить ответ от вашего веб-сервера 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 сжатие применяться не будет (данный браузер не умеет принимать сжатые ответы).

6. Настройка метода select

В Linux и FreeBSD используются свои методы обработки соединений. На данный момент наиболее эффективными являются epoll (Linux) и kqueue (FreeBSD).

а) Пример nginx. conf для FreeBSD:

б) Пример nginx. conf для Linux:

7. Обработка статики и ее кэширование

NGINX умеет сам отдавать статические данные, не заставляя сервер backend этим заниматься. В настройке каждого сайта (секция server добавляем):

* ^.+\.(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 недели от момента их модификации.

8. Пример настроенного файла конфигурации

В итоге, у нас получиться что-то на подобие:

events <
worker_connections 2048;
multi_accept on;
use epoll;
>

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;
aio 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.

9. Проверка корректности настроек и их применение

После внесения всех настроек необходимо проверить их корректность командой:

Настройка Nginx

В одной из предыдущих статей мы уже рассматривали установку Nginx в Ubuntu и настройку его основных параметров, в этой же статье я хочу больше остановиться на производительности и подготовке веб-сервера к использованию в боевых условиях. Что касается дистрибутива Linux, то сегодня мы будем рассматривать CentOS, эта система часто используется на серверах и с настройкой Nginx тут могут возникнуть некоторые сложности. Дальше будет рассмотрена настройка Nginx CentOS, поговорим как включить полную поддержку http2, google pagespeed, и настроить основной конфигурационный файл.

1. Установка Nginx

В официальных репозиториях CentOS есть Nginx и он, скорее всего, уже установлен в вашей системе. Но мы хотим чтобы сайт работал по протоколу http2, который позволяет передавать все данные одним подключением, а это увеличивает производительность. Для работы по http2 вам понадобиться настроить SSL сертификат, но об этом уже написано в статье получение сертификата Lets Encrypt Nginx. Но это еще не все. для переключения с обычного SSL на HTTP2.0 в большинстве браузеров сейчас используется протокол ALPN, а он поддерживается начиная с OpenSSL 1.02. В то время, как в репозиториях есть только OpenSSL 1.01. Поэтому нам нужно установить версию Nginx, собранную с OpenSSL 1.02. Для этого можно использовать Broken Repo:

Если вы используете репозиторий EPEL, то нужно указать что не надо из него брать Nginx:

Теперь для установки правильной версии Nginx достаточно набрать:

sudo yum install nginx

Будет установлена самая последняя версия Nginx 1.13.2, с полной поддержкой ALPN. Дальше перейдем к настройке.

2. Настройка Nginx

Первым делом следует рассмотреть структуру конфигурационного файла. На первый взгляд, тут все может показаться очень запутанным, но там все достаточно логично:

глобальные опции
events <>
http <
server <
location<>
>
server <>
>

Сначала идут глобальные опции, которые задают основные параметры программы, например, от какого пользователя она будет запущена и количество процессов. Дальше есть секция events, в которой описано как Nginx будет реагировать на входящие подключения, затем идет секция http, которая объединяет все настройки касаемо работы протокола http. В ней находится секция server, каждая такая секция отвечает за отдельный домен, в секции server размещаются секции location, каждая из которых отвечает за определенный URL запроса, обратите внимание, что не файл на сервере, как в Apache, а именно URL запроса.

Основные глобальные настройки мы будем делать в файле /etc/nginx/nginx. conf. Дальше рассмотрим что именно будем менять и какие значения желательно установить. Начнем с глобальных опций:

В секции events стоит настроить два параметра:

Также в секции events рекомендуется использовать директиву use epoll, так как этот самый эффективный метод обработки входящих соединений для Linux, но этот метод применяется по умолчанию, поэтому не вижу смысла добавлять его вручную. Рассмотрим еще несколько параметров из секции http:

Вот как-то так будет выглядеть настройка nginx conf:

user nginx;
worker_processes 4;
worker_cpu_affinity auto;
worker_rlimit_nofile 10000;
pcre_jit on;
error_log /var/log/nginx/error. log warn;
load_module «modules/ngx_pagespeed. so»;
events <
multi_accept on;
accept_mutex off;
worker_connections 1024;
>
http <
sendfile on;
tcp_nopush on;
tcp_nodelay on;
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 120s;
open_file_cache_errors on;
reset_timedout_connection on;
client_body_timeout 10;
keepalive_timeout 65;
include /etc/nginx/sites-enabled.*.conf
>

3. Настройка http2

Я не буду подробно описывать настройку секции server, потому что делал это уже в статье установка Nginx в Ubuntu и здесь мне нечего добавить, настройка SSL это достаточно обширная тема и тоже будет рассмотрена в отдельной статье. Но чтобы настроить http2 вам нужно иметь уже SSL. Далее, просто подправьте директиву listen в вашей секции server:

listen 194.67.215.125:443 default_server;

listen 194.67.215.125:443 http2 default_server;

Вот таким простым способом можно включить http2 если перед этим была установлена правильная версия Nginx.

4. Настройка PageSpeed

Дело в том, что PageSpeed устанавливает очень долгий строк кэширования для всех файлов, а в имя файла добавляет его хэш. Так скорость загрузки ресурсов выходит намного выше, поскольку браузер будет запрашивать файлы только с новым хэшем, а LastModified удаляется чтобы пользователи смогли увидеть изменения в случае если какой-либо файл будет изменен. А теперь рассмотрим как установить модуль. Нам придется собрать его из исходных кодов.

Сначала установите инструменты для сборки, очень важно, если не установите, потом получите ошибку и не будете знать что делать:

yum install wget gcc cmake unzip gcc-c++ pcre-devel zlib-devel

Скачайте и распакуйте исходники Nginx для вашей версии, например, 1.13.3:

Настройка сервера nginx не включает пере сборку и замену программы из репозитория, мы просто используем эти исходники для сборки модуля. Скачайте и распакуйте исходники PageSpeed:

Скачайте и распакуйте библиотеку оптимизации PageSpeed в папку с исходниками модуля:

Скачайте и распакуйте исходники OpenSSL 1.02:

Теперь нам нужно собрать модуль. Сначала смотрим опции, с которыми собран текущий Nginx:

Если все было сделано правильно, то на выходе вы получите модуль ngx_pagespeed. so в папке obj, его нужно скопировать в папку /etc/nginx/modules:

cp ngx_pagespeed. so /etc/nginx/modules/ngx_pagespeed. so

Создаем папку для кэша:

Теперь добавьте такую строчку для включения модуля в /etc/nginx/nginx. conf:

Затем, в секцию сервер достаточно добавить:

pagespeed on;
pagespeed FileCachePath /var/ngx_pagespeed_cache;
location

Теперь вам достаточно перезапустить nginx чтобы изменения вступили в силу:

Выводы

Настройка Nginx завершена, возможно, остались еще и другие оптимизации, которые помогут ускорить Nginx, но они не войдут в эту статью. А какие оптимизации используете вы? Напишите обязательно в комментариях! Надеюсь, эта информация была полезной вам.

Источники:

https://www. dmosk. ru/instruktions. php? object=kak-optimizirovat-veb-server-nginx

https://losst. ru/nastrojka-nginx

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: