2017-11-02 19 views
0

私は、DockerでnginxをWebアプリケーションの前に座って使用していますが、POST要求を除いてほとんどの部分で動作しています。私は、任意のURLとポートからの接続を受け入れ、それをWebアプリケーションの特定のホスト名とポートにプロキシできるようにする必要があります。これは通常のWeb要求では機能しますが、POSTでは分解されます。ユーザーを認証するときに、サーバーにのみ127.0.0.1:8080からの接続を受け付けますnginx POST Port Rewriting

server { 
    listen *:8080; 
    server_name _; 

    proxy_set_header Host 127.0.0.1:8080; 
    proxy_set_header X-Forwarded-For $remote_addr; 
    proxy_set_header X-Forwarded-Host $proxy_host; 
    proxy_set_header X-Real-IP 127.0.0.1; 

    location/{ 
     proxy_pass http://example.com:8080/ 
     rewrite "^(/.+?):\d+?/(.+?)$" $1:8080/$2 break; 
    } 
} 

:ここに私のnginx.confです。私はnginxを使用しています:1.13.6-アルパイン。ありがとう。

編集:ここでは

は、Webサーバからのサンプルログ出力されます:ここで

17:11:26,435 INFO [stdout] (http-0.0.0.0:8080-1) javax.servlet.ServletException: CORS origin denied 127.0.0.1:7001 not on allowed list:[] 

はnginxのコンテナからのログエントリです:

172.18.0.1 - - [02/Nov/2017:17:11:26 +0000] "POST /suite/auth?environment=tempo HTTP/1.1" 401 996 "http://127.0.0.1:7001/suite/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36" "-" 

私がしようとしていますDocker Swarmクラスタで複数のWebアプリケーションインスタンスを起動することはできますが、IPアドレスまたはホスト名を動的に割り当てる機能はありません私は各インスタンスに固有のポート番号を使用するつもりでした。私は必要なだけ多くの一意のインスタンスを起動できるように、私の要求をプロキシするためにnginxを取得しようとしています。

+0

エラーとは何ですか?ログはありますか? –

+0

POSTリクエストは書き換えによってGETリクエストに変更されるため、POSTリクエストを書き換えることはできません –

答えて

0

だから私はこれを理解し、うまくいけば私が見つけたものは他の人を助けるだろう。私は別の方法で問題に近づきました。 HTTPヘッダーのポートを書き換えようとするのではなく、nginxのsub_filterプラグインを使用して、アプリケーションが提供するHTMLを書き換えて、プロキシを経由するようにしました。この方法では、HTML内のすべてのリンクが正しいドメインとポートを使用していました。ここでは私のために働くことになった設定は次のとおりです。参考のため

server { 
    listen 7001 default_server; 
    server_name _; 

    location/{ 
     proxy_pass http://app:8080/; 

     proxy_redirect http://127.0.0.1:8080/ http://$host/; 

     proxy_set_header Accept-Encoding ""; 
     proxy_set_header Host $host; 
     proxy_set_header Origin 127.0.0.1:8080; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header X-Forwarded-Host $proxy_host; 
     proxy_set_header X-Forwarded-Server $host; 
     proxy_set_header X-Real-IP $remote_addr; 

     sub_filter_once off; 
     sub_filter_types *; 
     sub_filter "127.0.0.1:8080" "$host"; 
    } 
} 

、私docker-compose.ymlファイルの簡易版は、次のようになります。

version: "3.3" 

services: 
    app: 
    image: my-application:latest 
    depends_on: 
     - db 

    db: 
    image: mysql:latest 

    nginx: 
    image: nginx:1.13.6-alpine 
    ports: 
     - "80:7001" 
    volumes: 
     - ./nginx-config.conf:/etc/nginx/conf.d/nginx-config.conf 
    depends_on: 
     - app