我想避免在 nginx 中重复所有的 virtualhost server {} 块,只是为了拥有与普通 http 请求略有不同的自定义 ssl 设置。
大多数 SSL 指令都可以放在主块中,但有一个障碍我无法找到解决方法:https
SSL 和 SSL的 keep-alive 不同。http
有什么方法可以使用 $scheme 来动态更改keepalive_timeout
?
我甚至考虑过,more_set_input_headers -r 'Keep-Alive: timeout=60';
只有在保持活动超时已经存在的情况下,我才可以使用它来有条件地替换它,但问题是它不能在ie$scheme
中使用。这是无效的location
location ^https {}
答案1
我很确定你可以使用map
:
map $scheme $myCustomTTL {
default 90;
http 90;
https 60;
}
add_header Keep-Alive timeout=$myCustomTTL;
答案2
由于它似乎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
指令告诉重写在纯 HTTP 响应中nginx
找到的 URILocation
和标头。Refresh