我有以下配置作为 Nginx 上的 L4 代理,并且一切运行正常。
stream {
map $ssl_preread_server_name $name {
hostnames;
.ipchicken.com $ssl_preread_server_name;
.bbc.com $ssl_preread_server_name;
.bbc.co.uk $ssl_preread_server_name;
.bbci.co.uk $ssl_preread_server_name;
.neverssl.com $ssl_preread_server_name; #<-------
}
server {
resolver 8.8.8.8;
listen 443;
ssl_preread on;
proxy_connect_timeout 5s;
proxy_pass $name:$server_port;
}
但是当请求 HTTP 站点时,例如“http://neverssl.com/”,Nginx 没有响应。对这个问题有什么想法吗?
答案1
据我所知,ssl_preread
指令仅适用于 HTTPS 协议。我不知道如何Host
在中获取 HTTP 标头值ngx_stream_core_module
。您可以尝试server
在中使用附加块http上下文如图所示这里:
http {
...
map $http_host $proxy {
hostnames;
.neverssl.com $http_host;
...
}
server {
listen 80;
resolver 8.8.8.8;
location / {
if ($proxy = '') { return 403; } # Return HTTP 403 Forbidden for unlisted domains
proxy_set_header Host $proxy;
proxy_redirect off;
proxy_connect_timeout 5s;
proxy_pass http://$proxy;
}
}
}
stream {
... # stream configuration for HTTPS port 443 here
}
无需$server_port
在流服务器块中使用变量,您只监听 443 端口,因此您只需使用proxy_pass $name:443;