我是 nginx 新手。我正在尝试设置 nginx 以将所有 Web 流量反向代理到本地运行的 Web 服务器。现在它可以工作,但它显示每个登录用户的 IP 地址都是 127.0.0.1。我读了一些其他帖子,说我需要proxy_set_header Host $host;
正确设置。我设置了这个,但用户 IP 仍然是 127.0.0.1。有人能通过查看我的 nginx.conf 来判断我是否设置proxy_set_header Host $host;
不正确吗?我想我需要在两个服务器块中设置它,但我在服务器中没有location
接受端口 80 上流量的块。我想这可能是它丢失的地方。
server {
listen 80;
server_name www.myapp.com myapp.com;
return 301 https://myapp.com$request_uri;
}
server {
listen 443;
server_name _;
ssl on;
ssl_certificate /web/ssl/cert.pem;
ssl_certificate_key /web/ssl/key.pem;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://localhost:8000;
}
location /robots.txt {
alias /web/static/robots.txt;
}
}
答案1
使用;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
这将向后端服务器添加一个新标头,您的应用程序将能够看到原始 IP 地址。
您的想法是正确的X-Real-IP
,因为这将执行相同的操作(假设$remote_addr
实际上是客户端的 IP 地址)。X-Forwarded-For
但是更通用,如果您的后端正在运行标准的现成包,它可能已经知道了这一点。同样,如果您的应用程序没有查看X-Real-IP
标头,那么它就不会反映出来。
说白了,不在后端覆盖Remote-Addr
标头的方法,因为大多数 Web 服务器都在内部设置了该标头。您需要让应用程序查看其他标头,看看它是否Remote-Addr
是本地、私有或其他无法路由的 IP 地址(127.0.0.1、10.xxx 等)。
答案2
X-Forwarded-For
您可以检查后端服务器软件是否有任何工具可以从标头中获取 IP 地址X-Real-IP
并将其设置为远程地址。这完全取决于您的后端服务器软件或应用程序。