Добрый день, Валентин и все кто сейчас читает эту ветку!
Я наконец-то сегодня перевёл с Apache на nginx свои сервера, но мне снова понадобится Ваша помощь, так как некоторые моменты мне не ясны, а некоторые и вовсе не получаются.0 При попытке регистрации на форуме https://forum.nginx.org мне постоянно пишут
Your registration request has been blocked because its suspected to come from a forum spammer!
Хотя я ни разу его до этого вообще не посещал его, так что продолжу общение здесь, в этой тёплой и ламповой, для меня, обстановке. :-)
1 С Вашего наставления я отказался от .htaccess и перевёл ЧПУ на Location-ы, но я не уверен оптимально ли я это сделал.
В apache у меня было коротко и ясно.
RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} \s/index\.php
RewriteRule ^index\.php/?$ /en/error
RedirectMatch 403 .*\/\..*
ErrorDocument 403 /en/error
ErrorDocument 404 /en/errorRewriteRule ^([a-z]{2})/?$ index.php?lang=$1 [END]
#https://gricargo.com/ru/payment?token=EC-9HP89464U39537617&P...
RewriteCond %{QUERY_STRING} ^token=([\w-]{20})&PayerID=([\w-]{13})$
RewriteRule ^([a-z]{2})/(payment)/?$ index.php?lang=$1&view=$2&token=%1&PayerID=%2 [END]
RewriteRule ^([a-z]{2})/([\w-]+)/?$ index.php?lang=$1&view=$2 [END]
RewriteRule ^([a-z]{2})/([\w-]+)/([\d-]+)\.html/?$ index.php?lang=$1&view=$2&id=$3 [END]
RewriteRule ^([a-z]{2})/([\w-]+)/([\w-]+)/([\d-]+)\.html/?$ index.php?lang=$1&view=$2&tab=$3&id=$4 [END]
RewriteRule ^([a-z]{2})/([\w-]+)/([\w-]+)/?$ index.php?lang=$1&view=$2&tab=$3 [END]
RewriteRule ^([a-z]{2})/(api)/([\w\s-]+)={1,3}([\w\s-]+)={1,3}\.html/?$ index.php?lang=$1&view=$2&data=$3&iv=$4 [END]
Но в nginx это развернулось вот в такую простыню.
error_page 404 /en/error;
error_page 500 502 503 504 /50x.html;location = /50x.html
{
root /srv/www/htdocs;
}
location = /favicon.ico
{
log_not_found off;
access_log off;
}
location = /
{
fastcgi_pass unix:/run/php-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
location = /index.php
{
return 404;
}
location ~ /\.
{
return 404;
}
location /
{
try_files $uri return 404;
}
location ~ ^/([a-z][a-z])/?$
{
set $_query_string "lang=$1";
fastcgi_pass unix:/run/php-fpm.sock;
include fastcgi_params;
fastcgi_param QUERY_STRING $_query_string;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
#/ru/payment?token=EC-9HP89464U39537617&PayerID=T94MQ4XMUXCWG
location ~ ^/([a-z][a-z])/(payment)$
{
set $_query_string "lang=$1&view=$2";
fastcgi_pass unix:/run/php-fpm.sock;
include fastcgi_params;
fastcgi_param QUERY_STRING $_query_string&$query_string;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
location ~ ^/([a-z][a-z])/([\w-]+)/?$
{
set $_query_string "lang=$1&view=$2";
fastcgi_pass unix:/run/php-fpm.sock;
include fastcgi_params;
fastcgi_param QUERY_STRING $_query_string;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
location ~ ^/([a-z][a-z])/([\w-]+)/([\d-]+)\.html/?$
{
set $_query_string "lang=$1&view=$2&id=$3";
fastcgi_pass unix:/run/php-fpm.sock;
include fastcgi_params;
fastcgi_param QUERY_STRING $_query_string;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
location ~ ^/([a-z][a-z])/([\w-]+)/([\w-]+)/([\d-]+)\.html/?$
{
set $_query_string "lang=$1&view=$2&tab=$3&id=$4";
fastcgi_pass unix:/run/php-fpm.sock;
include fastcgi_params;
fastcgi_param QUERY_STRING $_query_string;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
location ~ ^/([a-z][a-z])/([\w-]+)/([\w-]+)/?$
{
set $_query_string "lang=$1&view=$2&tab=$3";
fastcgi_pass unix:/run/php-fpm.sock;
include fastcgi_params;
fastcgi_param QUERY_STRING $_query_string;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
location ~ ^/([a-z][a-z])/(api)/([\w\s-]+)=\{1,3\}([\w\s-]+)=\{1,3\}\.html/?$
{
set $_query_string "lang=$1&view=$2&data=$3&iv=$4";
fastcgi_pass unix:/run/php-fpm.sock;
include fastcgi_params;
fastcgi_param QUERY_STRING $_query_string;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
Всё работает, как и ожидается, но каждое правило вместо 1-ой строчки, превратилось в блок, в котором почти в каждом повторяется 1 и тот же блок
fastcgi_pass unix:/run/php-fpm.sock;
include fastcgi_params;
fastcgi_param QUERY_STRING $_query_string
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
Можно ли это как-то оптимизировать?
Например, выноести этот блок, а потом вызывать это блок (читал про именованные location но не понял как их использовать и помогут ли они мне тут вообще.)
2 При написании правил, я использовал только Location-ы игнорировал if-ы и rewrite-ы, возможно что-то ещё, так как прочитал, что Location-ы работают лучше и быстрее.
Правильно ли я сделал и почему (почему Location производительнее чем rewrite если это так, и почему именно не стоит использовать if-ы если это так)?
2.1 Отдельно прошу обратить внимание на правило с payment, где в apache можно было задействовать для разбора не только URI, но и QUERY_STRING. В nginx, если я правильно понял, можно использовать только URI.
Конкретную задачу по маршрутизации я вроде решил конкатенацией нового и старого QUERY_STRING, но хотелось бы знать можно ли было это сделать иначе?
3 Стоит ли мне включить опцию в nginx pcre_jit on;?
Сделает ли она обработку моих Location-ов более производительной?
4 Socket vs Port на локалхосте.
Правильно ли я поступаю, что использую сокеты на локалхосте вместо портов с точки зрения производительности? Какие там нюансы?
5 Не получается указать ssl_ciphers и их порядок следования для TLS 1.3.
В апаче есть костыль, и можно указать так, и это работает:
SSLCipherSuite TLSv1.3 TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384
В nginx, как и везде.
ssl_ciphers TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384;
Это работает только для TLSv1.2 сиферов, а сиферы для TLSv1.3 выводятся те и только в таком порядке, в котором они зашиты в openssl ciphers.
Можно ли что-то с этим сделать?
6 Не получается включить 0-RTT (SSL Labs показывает 0-RTT enabled No)
https://nginx.org/ru/docs/http/ngx_http_ssl_module.html#ssl_...
Тут нет конкретного примера.
Я в http указал
ssl_early_data on;
и даже
proxy_set_header Early-Data $ssl_early_data;
Но оно не работает и, видимо, последняя строчка должна быть другой, ведь у меня nginx никого не проксирует, он сам единственный web-сервер.
7 Каким и можно ли вообще изменять параметр максимального времени жизни запроса для каждого виртуального хоста?
В apache это делалось так: FcgidIOTimeout 300
8 И вопрос по php-fpm, по каким правилам, критериям или стратегиям выбирается оптимальное число процессов в этих, возможно и других опциях для pm = dynamic.
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
P.S. Буду рад выслушаю конструктивные ответы от всех кто их может дать. :-)