NGINX: Сборка с HTTP/2 и TLSv1.3

Рассмотрим как собрать NGINX с исходных кодов с модными плюшками, чтобы все было по красоте. Умение собирать с исходников поможет всегда использовать модные плюшки и держать программное обеспечение в актуальном состоянии. Будем использовать Mainline версию.

$ yum install gcc make libtool pcre-devel zlib-devel
$ wget http://nginx.org/download/nginx-1.15.8.tar.gz
$ tar xvvf nginx-1.15.8.tar.gz
$ wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz
$ tar xvvf openssl-1.1.1a.tar.gz
$ cd nginx-1.15.8.tar.gz
$ ./configure --with-http_stub_status_module --with-http_ssl_module --with-file-aio --with-threads --with-http_mp4_module --with-http_flv_module --with-http_realip_module --with-http_v2_module --with-openssl=../openssl-1.1.1a
$ make
$ make install
$ ln -s /usr/local/nginx/sbin/nginx /usr/sbin/

Не обязательно собирать именно с такими параметрами. Можете что-то убрать или что-то добавить (смотрите ./configure —help). Например, если ваш сайт не будет отдавать видеофайлы MP4 и FLV, то можно убрать параметры «—with-http_mp4_module —with-http_flv_module». После сборки NGINX будет установлен в директории «/usr/local/nginx» и для удобства создали симлинк в «/usr/sbin», чтобы вызывать nginx по команде «nginx» не указывая полный путь к исполняемому файлу. Информацию по модулям смотрите в справочнике по модулям на официальном сайте. Рассмотрим типовый конфиг:

server {
        listen 80;
        server_name www.example.com;
        rewrite ^(.*) https://$host$1;
        server_tokens off;
}

server {
        listen 443 ssl http2;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:EECDH+CHACHA20:EECDH+AESGCM:EECDH+AES;
        ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;
        ssl_certificate /etc/letsencrypt/fullchain.cer;
        ssl_certificate_key /etc/letsencrypt/*.example.key;
        server_name www.example.com;
        server_tokens off;
        add_header Strict-Transport-Security max-age=2592000;
        access_log logs/www_access.log main;
        error_log logs/www_error.log;
        client_max_body_size 1G;
        charset utf-8;
        index index.php;
        aio threads;
        directio 10m;
        location / {
                root /opt/www;
                location ~* \.(gif|jpeg|jpg|png|tif|bmp|doc|pdf|rtf|xls|ppt|rar|rpm|swf|zip|docx|xlsx|pptx|psd|cdr|flv)$ {
                        expires max;
                        add_header Cache-Control private;
                        access_log off;
                }
                location ~* \.(mp4)$ {
                        mp4;
                }
                location ~* \.(flv)$ {
                        flv;
                }
                location ~ \.php$ {
                        try_files $uri =404;
                        fastcgi_split_path_info ^(.+\.php)(/.+)$;
                        fastcgi_pass 127.0.0.1:9000;
                        fastcgi_index index.php;
                        fastcgi_read_timeout 300;
                        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                        fastcgi_intercept_errors on;
                        include fastcgi_params;
                }
        }
}

И как бы все. Добавили TLSv1.2 для обратной совместимости на случай если чей-то клиент не поддерживает TLSv1.3. Для проверки HTTP/2 можете установить в браузере расширение «HTTP/2 Indicator» и если молния синяя значит все нормально. Работу TLSv1.3 можете проверить в свойствах сертификата. В дальнейшем если понадобится пересобрать NGINX, то чтобы увидеть параметры предыдущей сборки просто наберите «nginx -V».

Настроим ротацию логов в /etc/logrotate.d/nginx:

/usr/local/nginx/logs/*.log {
        daily
        rotate 10
        missingok
        notifempty
        compress
        sharedscripts
        postrotate
                [ ! -f /usr/local/nginx/logs/nginx.pid ] || kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
        endscript
}

Создадим скрипт для systemd в /etc/systemd/system/nginx.service:

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Выполняем «systemctl daemon-reload» и пробуем запустить «systemctl start nginx».