Apache 代理通过 nginx

Apache 代理通过 nginx

我在 Apache 中有以下配置:

RewriteEngine On


#APP
ProxyPass /abc/ http://remote.com/abc/
ProxyPassReverse /abc/   http://remote.com/abc/

#APP2
ProxyPass /efg/ http://remote.com/efg/
ProxyPassReverse /efg/   http://remote.com/efg/ 

我正在尝试在 nginx 中使用相同的配置。阅读了一些链接后,我得到了以下信息:

server {
      listen 8081;
      server_name  localhost;
      proxy_redirect http://localhost:8081/ http://remote.com/;

      location ^~/abc/ {
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        proxy_pass http://remote.com/abc/;
      }

       location ^~/efg/ {
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        proxy_pass http://remote.com/efg/;
      }
    }

我已经有以下配置:

server {
        listen       8080;
        server_name  localhost;


        location / {
            root   html;
            index  index.html index.htm;
        }
        location ^~/myAPP {
            alias   path/to/app;
            index main.html;
        }

        location ^~/myAPP/images {
            alias   another/path/to/images
            autoindex on;
        }
    }

这里的想法是克服同源策略问题。主页位于 localhost:8080,但我们需要 ajax 调用来http://remote.com/abc。两个域名都在我的控制之下。

使用上述配置,ajax 调用要么无法到达远程服务器,要么因为跨源而被切断。

上述解决方案在 Apache 中有效,但在 nginx 中无效,因此我认为这是一个配置问题。

我认为这里有一个隐含的问题:我应该有两个server声明还是应该以某种方式将它们合并为一个?

编辑:添加了更多信息

编辑2:我已将所有 proxy_pass 配置移至主server声明中,并将所有 ajax 调用更改为通过端口 8080。我现在收到一个新错误:502 Connection reset by peer。Wireshark 显示数据包发送到http://remote.comIP 头校验和不正确。

答案1

不工作不是特别详细,但让我试着猜测一下问题可能是什么。我建议尝试以下配置:

server {
  listen 8081;
  server_name  localhost;

  location /abc/ {
    proxy_pass http://remote.com/abc/;
    proxy_http_version 1.1;
    proxy_redirect http://localhost:8081/ http://remote.com/;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
  }

   location /efg/ {
    proxy_pass http://remote.com/efg/;
    proxy_http_version 1.1;
    proxy_redirect http://localhost:8081/ http://remote.com/;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
  }
}

我真正改变的是位置块定义并添加了一个主持人标头,以防远程主机使用基于名称的虚拟主机。所有其他更改都是表面的 - 当所有相应的指令都聚集在一起并正确排序时(这可能是按重要性排序,或按其他特征排序),可读性会得到改善。

如果上述配置不能按预期工作,请添加一些信息,说明到底是什么不起作用以及具体是如何失败的。

编辑:我还添加了主持人标头添加到上述配置中,以防远程使用基于名称的虚拟主机。

相关内容