![具有多个 SSL 域的 Nginx 反向代理](https://linux22.com/image/645365/%E5%85%B7%E6%9C%89%E5%A4%9A%E4%B8%AA%20SSL%20%E5%9F%9F%E7%9A%84%20Nginx%20%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86.png)
当我需要将 Nginx 配置为基于源服务器但在一个端口上的多个位置的反向代理时,我遇到了问题。
例如我有这些服务器:
server1.domain.com
server2.domain.com
server3.domain.com
nginx.domain.com
是Nginx反向代理服务器
我需要通过这个方案进行访问:
nginx.domain.com/site -> server1.domain.com/site
(https) nginx.domain.com/site2 -> (https) server2.domain.com/site2
(https) nginx.domain.com/site3 -> (https) server3.domain.com/site3
但现在我只能访问配置中第一个的站点 2。当我更改顺序时,站点 3 就可以正常工作。所有服务器中的位置配置都正常。
我default.conf
的配置如下。
服务器1
server {
listen 80;
server_name server1.domain.com;
access_log off;
error_log off;
# some locations
}
服务器2
server {
listen 80;
server_name server2.domain.com;
access_log off;
error_log off;
# some locations
}
server {
listen 443 ssl;
server_name server2.domain.com;
include ssl/ssl.conf;
ssl on;
ssl_certificate ssl/server2.domain.com.crt;
ssl_certificate_key ssl/server2.domain.com.key;
# some locations
}
服务器3
server {
listen 80;
server_name server3.domain.com;
access_log off;
error_log off;
# some locations
}
server {
listen 443 ssl;
server_name server3.domain.com;
ssl on;
include ssl/ssl.conf;
ssl_certificate ssl/server3.domain.com.crt;
ssl_certificate_key ssl/server3.domain.com.key;
# some locations
}
我ssl.conf
有
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers RC4:HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
谢谢
答案1
您设置了 3 台服务器,分别监听发往 的请求server[123].domain.com
。
当对未知域的请求开始时,nginx 将使用默认域来处理该请求。默认情况下,nginx 使用第一个定义的域,除非您default_server
使用listen
您的某台服务器的指令。这就是为什么您的nginx.domain.com
请求将始终由默认(第一台)服务器提供服务。
现在,您想要的是反向代理。这不是您要求 nginx 执行的操作。您只是定义了后端服务器,需要向其添加另一个 nginx 服务器作为前端反向代理。
为此,您需要使用ngx_http_proxy_module随着ngx_http_upstream_module。
具体来说,你代理来自location
和proxy_pass
到您的后端服务器。
这是一个可能适合您的简单反向代理服务器配置:
server {
listen 80;
listen 443 ssl; # Ensure your certificate is for nginx.domain.com;
server_name nginx.domain.com;
location /site1 {
proxy_pass $scheme://server1.domain.com;
}
location /site2 {
proxy_pass $scheme://server2.domain.com;
}
location /site3 {
proxy_pass $scheme://server3.domain.com;
}
}
注意使用$scheme
变量,重现用于连接前端和后端的方案。
我不确定后端的 SSL 配置。我猜你需要server_name
在每个后端上使用相同的配置,并使用与前端相同的 SSL 证书。我不知道你是否可以在后端使用不同的证书,每个证书都有不同的SSL 参数,并更改与代理模块server_name
连接的 SSL 参数。proxy -> backends