> Есть списки рассылки, ими и нужно пользоваться: https://mailman.nginx.org/mailman/listinfo/nginx-ru Вот не люблю я их, не удобные они, они не дают развёрнутого диалога как в багзиле или форуме. Тем более многие почтовики на которых они построены даже STARTTLS осилить не могут, и я в принципе ими не могу пользоваться.
>> try_files $uri return 404;
> Тут что-то странное написано.
Согласен, уже самому страшно, я за наделю разобрался как это работает и переписал на
location /
{
index index.html;
try_files $uri $uri/ =404;
}
Обязательно в самом конце, и убрал его из всех других блоков!
> Но в такой конструкции нет никакого смысла. Нужно просто оставить location пустым:
> location / { }
>
А вот до этого нужно было ещё догадаться...
Для меня не было очевидным что пустой location / и его отсутствие это не одно и тоже.
И с Вами я не соглашусь про пустой location.
При пустом location в лог ошибок заносятся все 404 Not a found, что для меня было нежданностью и удивлением, и чтобы этого не было то вся статика должна обрабатываться на сайте именно так, как я привёл ранее в location /.
Также этот location реализует стандартное поведение Apache к которому я привык. (В лог ошибок не попадпют 404 и обращение к директориям подставляется index.html)
Поправьте меня если я что-то понял не так и не допонял. (Собственно, сегодня ночью я занимался именно этим.)
>[оверквотинг удален]
> rewrite ^/([a-z][a-z])/?$ /?lang=$1? last;
> rewrite ^/([a-z][a-z])/(payment)$ /?lang=$1&view=$2 last;
> rewrite ^/([a-z][a-z])/([\w-]+)/?$ /?lang=$1&view=$2? last;
> rewrite ^/([a-z][a-z])/([\w-]+)/([\d-]+)\.html/?$ /?lang=$1&view=$2&id=$3? last;
> rewrite ^/([a-z][a-z])/([\w-]+)/([\w-]+)/([\d-]+)\.html/?$ /?lang=$1&view=$2&tab=$3&id=$4?
> last;
> rewrite ^/([a-z][a-z])/([\w-]+)/([\w-]+)/?$ /?lang=$1&view=$2&tab=$3? last;
> rewrite ^/([a-z][a-z])/(api)/([\w\s-]+)=\{1,3\}([\w\s-]+)=\{1,3\}\.html/?$ /?lang=$1&view=$2&data=$3&iv=$4?
> last;
>
Иными словами, там где мне нужна регулярка (~), я могу заменить на rewrite, а там где нет регулярки (= или /) я могу оставить location и производительность будет такая же?
> Все проблемы, увы, PHP программисты создают себе сами. Хотите чтобы было просто
> и быстро - разбирайте URI в index.php. Будете вы разбирать URI
> в PHP с помощью той же регулярки или с помощью каких-то
> более эффективных функций - не так важно.
> Сейчас же вы занимаетесь лишней работой. Сначала заставили веб-сервер с помощью регулярных
> выражений парсить URI и преобразовывать его в аргументы. А затем этот
> URI с аргументами отправляете PHP-интерпретатору, чтобы тот опять парсил ваш URI,
> но уже с аргументами, вычленял эти аргументы и запихивал в хэш.
> Зачем такое усложнение? Зачем этот лишний этап преобразования URI из
> одной формы в другую? Почему нельзя его парсить сразу в index.php?
Тут Я Вас не совсем понял. :-(
> разбирайте URI в index.php
От клиента приходит URI /ru/company/cargo/1.html Как мне его разбивать в /index.php если он полезет искать директории ru company cargo в ней файл 1.html, которых на сервере, естественно, нет и быть не может, а про наличие /index.php PHP и знаить не знает, если ему сервер не распарсит URI на GET-параметы и не вызовет /index.php с GET-параметрами? Как?
> Сейчас же вы занимаетесь лишней работой.
Или Вы под лишнюю работу считаете всё ЧПУ?
> А затем этот URI с аргументами отправляете PHP-интерпретатору, чтобы тот опять парсил ваш URI.
PHP URI не парсит. Он, разве что разбивает QUERY_STRING на GET-параметры, что очень лёгкая и быстрая задача, $_GET = explode('&',$_SERVER['QUERY_STRING']); причём деелает он это сам и всегда.
Я его ничем лишним не нагружаю, он даже не понимает что я использую ЧПУ. В этом весь и смысл.
>> 3 Стоит ли мне включить опцию в nginx pcre_jit on;?
>> Сделает ли она обработку моих Location-ов более производительной?
> Возможно чуть ускорит.
Ускорит только (пере)запуск nginx или также дальнейшую работу rewrite-ов.
>> 4 Socket vs Port на локалхосте.
>> Правильно ли я поступаю, что использую сокеты на локалхосте вместо портов с
>> точки зрения производительности? Какие там нюансы?
> Правильно. Особых нюансов нет.
Но почему-то почти у всех серверов в конфигурации по умолчанию, и в документации записаны именно порты, и мне приходится каждый раз тратить время чтобы найти как указывается socket в этом сервере... Думал, может я чего-то не понимаю.
>> 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.
>> Можно ли что-то с этим сделать?
> Сейчас алгоритмы для TLS 1.3 в nginx можно задать через openssl.conf, подробности
> в: https://trac.nginx.org/nginx/ticket/1529#comment:12
Благодарю. Про это необходимо написать в документации к параметру 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;
> Ещё сам TLS 1.3 нужно включить с помощью ssl_protocols, а больше ничего
> и не нужно. Но следует убедиться, что, во-первых, в системе
> стоит свежая версия OpenSSL 1.1.1+, а, во-вторых, сам nginx был именно
> с ней собран.
https://build.opensuse.org/package/view_file/server:http/ngi...
nginx -V
nginx version: nginx/1.17.3
built by gcc 9.2.1 20190903 [gcc-9-branch revision 275330] (SUSE Linux)
built with OpenSSL 1.1.1c 28 May 2019
TLS SNI support enabled
/etc/nginx/nginx.conf
error_log /var/log/nginx/error.log warn;
pid /run/nginx.pid;events
{
multi_accept on;
worker_connections 1024;
}
http
{
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
add_header Strict-Transport-Security 'max-age=63072000; includeSubDomains; preload' always;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
ssl_ecdh_curve prime256v1;
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 valid=300s ipv6=off;
ssl_early_data on;
proxy_set_header Early-Data $ssl_early_data;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
keepalive_timeout 70;
gzip on;
include conf.d/*.conf;
server
{
listen 443 default_server http2 ssl;
ssl_certificate /etc/apache2/ssl.crt/gricargo.com.crt;
ssl_certificate_key /etc/apache2/ssl.key/gricargo.com.key;
return 301 https://gricargo.com;
}
include vhosts.d/*.conf;
}
https://www.ssllabs.com/ssltest/analyze.html?d=gricargo.com
0-RTT enabled No :-(
>[оверквотинг удален]
> Параметры подбираются исходя из возможностей вашей системы, сколько в ней памяти и
> процессора доступно, и исходя из особенностей вашего приложения, сколько каждый процесс
> ест памяти, сколько ждет на I/O, а сколько работает. Пять процессов
> - это либо какой-нибудь Raspberry Pi, виртуалка, либо приложение на десяток
> активных пользователей. На нормальном сервере под средние нагрузки будет что-нибудь вроде:
> pm.max_children = 300
> pm.start_servers = 50
> pm.min_spare_servers = 25
> pm.max_spare_servers = 75
>
Хотелось бы если не формул, то инструкций по тому как узнать что процессов не хватает или их в избытке. Понимаю что эта тема не Ваша, буду разбираться с этим дальше.
Благодарю Вас, за ответ, мне он, как всегда очень помог. :-)