具有多个 SSL 域的 Nginx 反向代理

具有多个 SSL 域的 Nginx 反向代理

当我需要将 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

具体来说,你代理来自locationproxy_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

相关内容