如何在 nginx 上设置 proxy_pass

如何在 nginx 上设置 proxy_pass

我是 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并将其设置为远程地址。这完全取决于您的后端服务器软件或应用程序。

相关内容