我搜索了论坛(以及网络上的其他地方),找到了相关但似乎不完全相同的信息。希望我没有在这里重复。
我有一个在 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 位于我的路由器后面,并没有直接暴露在网络中。
杰森
编辑/更新:
我最初的询问缺少的重要信息:
我想要反向代理到 Apache 的面向网络的 Nginx 机器也为我想要反向代理的主域的三个子域提供服务(sub1.mydomain.com、sub2.mydomain.com、sub3.mydomain.com)。这三个子域共享一个来自 LetsEncrypt 的 SSL 证书。
本地网络上的 Apache 服务器也具有 LetsEncrypt 颁发的证书,该证书为 mydomain.com 提供服务,直到我将 Nginx 机器放在它前面。
我现在已经删除了 Apache 机器上的 SSL 证书,删除了 https 虚拟服务器,并为端口 80 设置了一个简单的虚拟服务器。
我的默认 Nginx 设置将请求发送到 http //www.mydomain.com,目前它只是共享一个非常无聊的 html 页面。
我已经在 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
您的配置中有四个错误:
listen
如果您想绑定到特定接口,指令仅接受 IP 地址。然而,实际上您可以绑定到所有接口,所以这就listen 443 ssl
足够了。root
location 指定 nginx 应该直接提供服务的文件的文件系统路径。由于您的/
位置是反向代理,root
因此根本不需要指定,因为 nginx 不提供任何文件。因此,删除root
指令。proxy_pass
需要上游服务器的 URL。在本例中,它应该是proxy_pass https://192.168.11.4
。您尚未指定 TLS 证书/私钥,它们需要使用
ssl_certificate
和ssl_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;
}
}