![Nginx 反向代理到另一个 Nginx(无反向代理)](https://linux22.com/image/1532761/Nginx%20%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%20Nginx%EF%BC%88%E6%97%A0%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%EF%BC%89.png)
Nginx 反向代理服务器(AWS)--> 静态页面的 nginx 服务器(homeip)
我有一台 nginx 服务器,它在 pfsense 后面的我的家庭 IP 上提供静态文件。如果我访问家庭 IP,我就会看到我托管的网站。我试图将其放在另一个 nginx 反向代理服务器后面,这样我的家庭 IP 就不公开了。所以我有一个 ec2 实例,只运行带有反向代理服务器的 nginx docker。
这是我的 nginx.conf:
worker_processes 1;
events { worker_connections 1024; }
http {
sendfile on;
upstream docker-nginx {
server <homeip>;
}
server {
listen 80;
location / {
proxy_pass http://docker-nginx;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
}
和我的docker文件:
FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
构建后 Docker 运行命令:
docker run -p 80:80 reverseproxy
这非常简单。我在我的家庭 nginx 服务器中将 http 重定向到 https。
现在,如果我点击我的域名,我会得到无法访问服务器的信息。如果我直接点击 ec2 实例的 IP 地址(当然 80 和 443 是开放的),我会得到未找到服务器的信息。
然后 curl 容器中的我的家庭 IP 地址
<html> <head><title>301 Moved Permanently</title></head> <body bgcolor="white"> <center><h1>301 Moved Permanently</h1></center> <hr><center>nginx/1.10.0 (Ubuntu)</center> </body> </html>
我做错了什么?这个设置对吗?非常感谢您的帮助。我尝试了相同的设置,没有docker,但作为反向代理服务器本地运行,仍然不起作用:-(
答案1
在解决此类问题时,您通常需要一步一步地进行。我将尝试在这里进行总结,因为整个过程已经通过聊天进行了跟踪(成绩单)。
检查您是否可以从代理连接到上游主机。在本例中,您已经尝试过
curl
,这表明它可以连接但会遇到重定向(我们稍后会讨论这个问题)。curl -L
遵循重定向可能会有所帮助,但如果您已经将 DNS 名称指向反向代理,那么这可能会让您陷入循环。检查反向代理是否在正确的端口上侦听。在
netstat -apnt4
这里很有用(删除4
以显示 IPv6)。在这种情况下,因为您也想要 HTTPS,所以您需要确保 80 和 443 都在侦听。检查您是否可以连接到反向代理。如果代理正在侦听正确的端口,但您仍然收到错误
connection refused
,则需要检查防火墙配置(不要忘记服务器提供商的防火墙,例如通过 AWS 控制面板)。使用浏览器的开发人员控制台的网络选项卡查看您是否成功完成初始请求但被重定向到损坏的链接也可能会很有用。此时,希望您至少可以连接到反向代理,并且您知道服务器已连接到您的上游。如果仍然不起作用,也许您会收到响应
502 Bad Gateway
- 这通常意味着 nginx 由于某种原因无法成功与上游通信。检查您的日志:/var/log/nginx/error.log
是默认位置。使用 Google,搜索相关错误。常见的错误有两种:
连接到上游时权限被拒绝。这可能是因为 SELinux 阻止 nginx 发出传出网络请求。您需要允许它。
SSL_do_handshake()
带有SSL23_GET_SERVER_HELLO:unknown protocol
通常是因为您尝试使用 HTTPS 连接到 HTTP 端口(80
)。Nginx 上游默认为端口80
- 您需要明确指定443
是否要使用 HTTPS 连接到上游。