Базовая установка и настройка Nginx на Debian 8

В интернете огромное количество статей про установку и настройку Nginx, но в очень многих статьях есть грубые ошибки конфигурации и неточности.

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

Итак, вперед…

Исходные данные: Debian 8.9 (jessie)

Выполняем установку wget (Опционально):

apt-get update
apt-get install wget -y

Скачиваем и добавляем ключ Nginx Inc. на нашу систему:

wget http://nginx.org/keys/nginx_signing.key && apt-key add nginx_signing.key && rm -f nginx_signing.key

Если нужно установить Nginx Stable (v1.12.x), то выполняем:

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 (v1.13.x), то выполняем:

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

Обновляем список пакетов:

apt-get update

Устанавливаем Nginx и OpenSSL (опционально):

apt-get install nginx -y
apt-get install openssl -y

После установки запускаем Nginx:

service nginx start

Для проверки факта запуска выполним:

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

Проверим открытые порты:

# 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 (Mainline) Вы можете командой:

wget https://gist.githubusercontent.com/CHERTS/8e9ecf4fbfb765556311a88e5106174b/raw/58d9792ed3c1c4360f3fbe2735fce265c2e27201/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://mozilla.github.io/server-side-tls/ssl-config-generator/ в режиме Intermediate
        ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
        # Задаем кривую для ECDHE-шифров
        ssl_ecdh_curve prime256v1:secp384r1:secp521r1;
        # Указываем, что при использовании протоколов SSLv3 и TLS серверные шифры были более приоритетны, чем клиентские
        ssl_prefer_server_ciphers on;
        # Указываем файл с параметрами для DHE-шифров
        ssl_dhparam /etc/nginx/ssl/dhparams.pem;
        # Задаём тип (разделяемый) и размеры кэшей для хранения параметров сессий
        ssl_session_cache shared:MAINSSL:10m;
        # Задаёт время, в течение которого клиент может повторно использовать параметры сессии
        ssl_session_timeout 10m;

        ##
        # 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

Все отлично!

На этом все, до скорых встреч. Продолжение следует…

Если у Вас возникли вопросы или Вы хотите чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.