web-dev-qa-db-ja.com

nginxのApacheプロキシパス

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にありますが、 http://remote.com/abc へのajax呼び出しが必要です。両方のドメインが私の管理下にあります。

上記の構成を使用すると、クロスオリジンのためにajax呼び出しがリモートサーバーに到達しないか、切断されます。

上記のソリューションはApacheで機能し、nginxでは機能しないため、構成の問題であると想定しています。

ここに暗黙の質問があると思います。2つのserver宣言が必要ですか、それとも何らかの方法でそれらを1つにマージする必要がありますか?

編集:いくつかの情報を追加しました

EDIT2:すべてのproxy_pass構成をメインのserver宣言に移動し、すべてのajax呼び出しをポート8080を経由するように変更しました。新しいエラーが発生しました:502 Connection reset by peer。 Wiresharkは、パケットが http://remote.com に送信され、IPヘッダーのチェックサムが正しくないことを示しています。

1
summerbulb

動作していません特に詳細ではありませんが、問題が何であるかを推測してみましょう。次の構成を試すことをお勧めします。

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; 
  }
}

私が実際に変更したのは、リモートホストが名前ベースの仮想ホストを使用する場合に備えて、ロケーションブロックの定義とHostヘッダーの追加です。他のすべての変更は表面的なものです。対応するすべてのディレクティブがまとめられ、適切に順序付けられると、読みやすさが向上します(これは、重要度の高い順に、またはその他の特性によって行われる場合があります)。

上記の構成が期待どおりに機能しない場合は、正確に機能しないものと、正確に失敗する情報を追加してください。

編集:リモートが名前ベースの仮想ホストを使用する場合に備えて、上記の構成にHostヘッダーも追加しました。

2