Я хотел бы избежать повторения всех блоков виртуального сервера {} в nginx только для того, чтобы иметь собственные настройки ssl, которые немного отличаются от простых HTTP-запросов.
Большинство директив ssl можно разместить прямо в основном блоке, за исключением одного препятствия, для которого я не могу найти обходного пути: другой keep-alive для https
против http
Есть ли способ использовать схему $ для динамического изменения keepalive_timeout
?
Я даже подумал, что могу использовать more_set_input_headers -r 'Keep-Alive: timeout=60';
условно заменить таймаут проверки активности, только если он уже существует, но проблема в $scheme
не может использоваться в location
т.е. это неверно location ^https {}
Я почти уверен, что ты можешь использовать map
:
map $scheme $myCustomTTL {
default 90;
http 90;
https 60;
}
add_header Keep-Alive timeout=$myCustomTTL;
Как кажется, что keepalive_timeout
нельзя использовать с параметрами, а только с фиксированными значениями, другим решением было бы использовать nginx
в качестве конечной точки SSL.
Ваши запросы SSL будут обрабатываться специальным server{}
блок, который будет управлять только подтверждением SSL и конкретным Keep-Alive
значение, а затем перенаправить простой HTTP-запрос в основной server {}
блок.
Ваш nginx
конфигурация будет включать что-то вроде следующего:
upstream plain_http {
server 127.0.0.1:80;
}
server {
listen 443;
server_name *.yourdomain.com;
ssl on;
ssl_certificate /etc/nginx/ssl/mycert.pem;
ssl_certificate_key /etc/nginx/ssl/mykey.key;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM;
ssl_prefer_server_ciphers on;
keepalive_timeout 90;
location / {
proxy_pass http://plain_http;
proxy_redirect http:// https://;
}
}
В proxy_redirect
директива говорит nginx
перезаписать URI, найденный в Location
и Refresh
заголовки в обычном HTTP-ответе.