使用 Nginx 代理通道(反向代理)为 Apache 托管的站点提供 SSL 服务

使用 Nginx 代理通道(反向代理)为 Apache 托管的站点提供 SSL 服务

我搜索了论坛(以及网络上的其他地方),找到了相关但似乎不完全相同的信息。希望我没有在这里重复。

我有一个在 Apache 服务器上运行的网站。它已经有一个 SSL 证书(通过 LetsEncrypt)并且运行正常。

我最近在它的“前面”设置了一台运行 Nginx 的机器。该机器服务于三个域(使用来自 LetsEncrypt 的一个证书)。

我想通过 Nginx 传递 Apache 机器上的域请求,但在确定正确的设置时遇到了麻烦。我以前曾使用两台 Apache 服务机器完成此操作,没有遇到太大困难,但我对 Nginx 还不熟悉,显然还不够熟练。

我在 Nginx 网络机器上(通过路由器)的虚拟服务器设置是:

server {
    listen domain.pointing.to.apache.com:443 ssl;
    server_name  domain.pointing.to.apache.com;
    location / {
        root 192.168.11.14/var/www/html/;
        proxy_set_header X-Forwarded-Host $host:$server_port;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass domain.pointing.to.apache.com;
    }
}

但是,当然,Nginx 不喜欢这样,在添加 vs 后不会重新加载。任何建议等都将不胜感激。

注意 - 我想这很明显,但 192.168.11.14 位于我的路由器后面,并没有直接暴露在网络中。

杰森

编辑/更新:

我最初的询问缺少的重要信息:

  1. 我想要反向代理到 Apache 的面向网络的 Nginx 机器也为我想要反向代理的主域的三个子域提供服务(sub1.mydomain.com、sub2.mydomain.com、sub3.mydomain.com)。这三个子域共享一个来自 LetsEncrypt 的 SSL 证书。

  2. 本地网络上的 Apache 服务器也具有 LetsEncrypt 颁发的证书,该证书为 mydomain.com 提供服务,直到我将 Nginx 机器放在它前面。

  3. 我现在已经删除了 Apache 机器上的 SSL 证书,删除了 https 虚拟服务器,并为端口 80 设置了一个简单的虚拟服务器。

  4. 我的默认 Nginx 设置将请求发送到 http //www.mydomain.com,目前它只是共享一个非常无聊的 html 页面。

  5. 我已经在 Nginx 框上为域 https //www.mydomain.com 安装了 SSL 证书,并希望使用 Tero 提供的建议将 mydomain.com 上的 https 请求反向代理到本地 Apache 框。如下所示:

server {

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/www.mydomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.mydomain.com/privkey.pem;
    
    server_name www.mydomain.com;
    location / {
        proxy_set_header X-Forwarded-Host $host:$server_port;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass https://192.168.11.14;
    }
}

问题是我从 Nginx 机器收到 502 Bad Gateway 错误...所以我猜我的 Nginx 设置有问题...我接近但还不够。此外,我注意到尝试访问www.mydomain.com没有 https 就不再提供无聊的 html 页面...它们被转移/重写为 https ->www.mydomain.com以及相同的 502 错误网关。

答案1

您的配置中有四个错误:

  1. listen如果您想绑定到特定接口,指令仅接受 IP 地址。然而,实际上您可以绑定到所有接口,所以这就listen 443 ssl足够了。

  2. rootlocation 指定 nginx 应该直接提供服务的文件的文件系统路径。由于您的/位置是反向代理,root因此根本不需要指定,因为 nginx 不提供任何文件。因此,删除root指令。

  3. proxy_pass需要上游服务器的 URL。在本例中,它应该是proxy_pass https://192.168.11.4

  4. 您尚未指定 TLS 证书/私钥,它们需要使用ssl_certificatessl_certificate_key指令来指定。

因此,总的来说,您的配置应该是:

server {
    listen 443 ssl;
    ssl_certificate /path/to/certificate;
    ssl_certificate_key /path/to/key;
    
    server_name  domain.pointing.to.apache.com;
    location / {
        proxy_set_header X-Forwarded-Host $host:$server_port;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass https://192.168.11.4;
    }
}

如果您想在反向代理服务器上使用 Letsencrypt 证书,您需要/.well-known从服务器提供目录:

server {
    listen 80;

    location /.well-known {
        try_files $uri =404;
    }

    location / {
        # Redirect http requests to https
        return 301 https://domain.pointing.to.apache.com;
    }
}

通过此配置,您可以在反向代理服务器上运行 Certbot,然后它将正确验证域所有权并获取证书/密钥。

但是,使用此配置,您无法在本地网络上运行的服务器上运行 Certbot。如果认为本地网络是安全的,那么我建议在反向代理服务器和本地网络服务器之间使用http而不是。https

如果https反向代理服务器和本地网络服务器之间需要,那么可以使用此配置:

server {
    listen 80;

    # Try to serve `.well-known` files from local file system. If not found, send to upstream server
    location /.well-known {
        try_files $uri @local;
    }

    location @local {
        proxy_pass http://192.168.11.4;
    }

    location / {
        return 301 https://domain.pointing.to.apache.com;
    }
}

相关内容