Настройка HTTP/3 Quic в HestiaCP для WP

Так как пока Hestia не поддерживает HTTP/3 Quic, стоит конечно же самостоятельно добавить поддержку в шаблон, и это значительно ускорит сайты.

Если у вас еще нет собственного Nginx шаблона в Hestia для сайта, то стоит его создать, делаем так, переходим в директорию и создаем копию шаблона wordpress-disable-xmlrpc.stpl и wordpress-disable-xmlrpc.tpl называем их как удобно

/usr/local/hestia/data/templates/web/nginx/php-fpm

После этого открываем шаблон wordpress-disable-xmlrpc.stpl и вносим изменения, получится вот так


server {
    listen      %ip%:%web_ssl_port% ssl;
    listen      %ip%:%web_ssl_port% quic reuseport;

    server_name %domain_idn% %alias_idn%;
    root        %sdocroot%;
    index       index.php index.html index.htm;
    access_log  /var/log/nginx/domains/%domain%.log combined;
    access_log  /var/log/nginx/domains/%domain%.bytes bytes;
    error_log   /var/log/nginx/domains/%domain%.error.log error;

    ssl_certificate     %ssl_pem%;
    ssl_certificate_key %ssl_key%;
    ssl_stapling        on;
    ssl_stapling_verify on;

    # TLS 1.3 0-RTT anti-replay
    if ($anti_replay = 307) { return 307 https://$host$request_uri; }
    if ($anti_replay = 425) { return 425; }

    include %home%/%user%/conf/web/%domain%/nginx.hsts.conf*;

    # HTTP/3 specific settings
    ssl_protocols TLSv1.3;
    ssl_prefer_server_ciphers off;

    add_header Alt-Svc 'h3=":%web_ssl_port%"; ma=86400'; # Advertise that HTTP/3 is available
    add_header QUIC-Status $http3;

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        try_files $uri $uri/ /index.php?$args;
        log_not_found off;
        access_log off;
    }

    location ~ /\.(?!well-known\/) {
        deny all;
        return 404;
    }

    location = /xmlrpc.php {
        deny all;
        access_log off;
        log_not_found off;
        return 403;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;

        location ~* ^.+\.(ogg|ogv|svg|svgz|swf|eot|otf|woff|woff2|mov|mp3|mp4|webm|flv|ttf|rss|atom|jpg|jpeg|gif|png|webp|ico|bmp|mid|midi|wav|rtf|css|js|pdf|jar)$ {
            expires 365d;
            fastcgi_hide_header "Set-Cookie";
        }

        location ~* /(?:uploads|files)/.*.php$ {
            deny all;
            return 404;
        }

        location ~ [^/]\.php(/|$) {
            try_files $uri =404;
            include /etc/nginx/fastcgi_params;

            fastcgi_index index.php;
            fastcgi_param HTTP_HOST $host;
            fastcgi_param HTTP_EARLY_DATA $rfc_early_data if_not_empty;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

            fastcgi_pass %backend_lsnr%;

            include %home%/%user%/conf/web/%domain%/nginx.fastcgi_cache.conf*;

            if ($request_uri ~* "/wp-admin/|/wp-json/|wp-.*.php|xmlrpc.php|index.php|/store.*|/cart.*|/my-account.*|/checkout.*") {
                set $no_cache 1;
            }

            if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in|woocommerce_items_in_cart|woocommerce_cart_hash|PHPSESSID") {
                set $no_cache 1;
            }
        }
    }

    location /error/ {
        alias %home%/%user%/web/%domain%/document_errors/;
    }

    location /vstats/ {
        alias %home%/%user%/web/%domain%/stats/;
        include %home%/%user%/web/%domain%/stats/auth.conf*;
    }

    proxy_hide_header Upgrade;

    include /etc/nginx/conf.d/phpmyadmin.inc*;
    include /etc/nginx/conf.d/phppgadmin.inc*;
    include %home%/%user%/conf/web/%domain%/nginx.ssl.conf_*;
}

Обратите внимание, что кроме

# HTTP/3 specific settings
    ssl_protocols TLSv1.3;
    ssl_prefer_server_ciphers off;

    add_header Alt-Svc 'h3=":%web_ssl_port%"; ma=86400'; # Advertise that HTTP/3 is available
    add_header QUIC-Status $http3;

Мы добавили отсутствующий в шаблоне параметр

fastcgi_param HTTP_HOST $host;

Дело в том что этот параметр по умолчанию отсутствует в шаблоне, и не причиняет сложностей, но как только мы добавляем Quic, мы получаем кучу ошибок PHP из-за того что информацию о хосте, с которого был сделан запрос не может быть передана без него. Таким образом правим и шаблон wordpress-disable-xmlrpc.tpl, в него просто добавляем fastcgi_param HTTP_HOST $host;, получается вот так

А так же мы можем добавить reuseport; только для одного сайта на одном сервере, т.е. с одним и тем же IP.(включает функцию повторного использования порта. Эта настройка удобна для сценариев с высоким трафиком, позволяя более эффективно распределять входящие соединения между несколькими рабочими процессами). Соответственно шаблон для другого сайта будет уже без reuseport; Выберите сайт с самым большим трафиком для шаблона с reuseport;


server {
	listen      %ip%:%web_port%;
	server_name %domain_idn% %alias_idn%;
	root        %docroot%;
	index       index.php index.html index.htm;
	access_log  /var/log/nginx/domains/%domain%.log combined;
	access_log  /var/log/nginx/domains/%domain%.bytes bytes;
	error_log   /var/log/nginx/domains/%domain%.error.log error;

	include %home%/%user%/conf/web/%domain%/nginx.forcessl.conf*;

	location = /favicon.ico {
		log_not_found off;
		access_log off;
	}

	location = /robots.txt {
		try_files $uri $uri/ /index.php?$args;
		log_not_found off;
		access_log off;
	}

	location ~ /\.(?!well-known\/) {
		deny all;
		return 404;
	}

	location / {
		try_files $uri $uri/ /index.php?$args;

		location ~* ^.+\.(ogg|ogv|svg|svgz|swf|eot|otf|woff|woff2|mov|mp3|mp4|webm|flv|ttf|rss|atom|jpg|jpeg|gif|png|webp|ico|bmp|mid|midi|wav|rtf|css|js|pdf|jar)$ {
			expires 365d;
			fastcgi_hide_header "Set-Cookie";
		}

		location ~* /(?:uploads|files)/.*.php$ {
			deny all;
			return 404;
		}

		location = /xmlrpc.php {
				deny all;
				access_log off;
				log_not_found off;
				return 403;
		}

		location ~ [^/]\.php(/|$) {
			try_files $uri =404;
			include /etc/nginx/fastcgi_params;

			fastcgi_index index.php;
			fastcgi_param HTTP_HOST $host;
			fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

			fastcgi_pass %backend_lsnr%;

			include %home%/%user%/conf/web/%domain%/nginx.fastcgi_cache.conf*;

			if ($request_uri ~* "/wp-admin/|/wp-json/|wp-.*.php|xmlrpc.php|index.php|/store.*|/cart.*|/my-account.*|/checkout.*") {
				set $no_cache 1;
			}

			if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in|woocommerce_items_in_cart|woocommerce_cart_hash|PHPSESSID") {
				set $no_cache 1;
			}
		}
	}

	location /error/ {
		alias %home%/%user%/web/%domain%/document_errors/;
	}

	location /vstats/ {
		alias   %home%/%user%/web/%domain%/stats/;
		include %home%/%user%/web/%domain%/stats/auth.conf*;
	}

	include /etc/nginx/conf.d/phpmyadmin.inc*;
	include /etc/nginx/conf.d/phppgadmin.inc*;
	include %home%/%user%/conf/web/%domain%/nginx.conf_*;
}

После этого сохраняем шаблоны, и пересобираем, замените user на имя пользователя в вашей Hestia

v-rebuild-web-domains user && systemctl restart nginx

Применяем шаблон в панели Hestia

Настройка HTTP/3 Quic в HestiaCP

И открываем порт UDP 443 для Quic в панели Hestia

Настройка HTTP/3 Quic в HestiaCP для WordPress

Проверить в терминале что ваши сайты используют quic можно так. Вместо angelka.ru поставьте свой домен, вы увидите вывоз слушателей, в том числе quic. Если его нет вы не верно что-то настроили.

grep -R 'listen.*quic' /etc/nginx/conf.d/domains/*angelka.ru* && grep -R reuseport /etc/nginx/conf.d/domains/*angelka.ru* && grep -Ri 'listen' /etc/nginx/conf.d/domains/*angelka.ru*

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

Настройка HTTP/3 Quic в HestiaCP для WordPress. Ускоряем загрузку сайтов.