2016-03-23 26 views
1

私はnginxを初めて使用しました。フォワードプロキシ、それは作品の並べ替え、しかし、GET要求だけではなく、POSTです。ドッカーがある場合 以下のSETUP_NGINXスクリプトを使用して再現可能なテストケースを提供できます。 (私はLinuxでスクリプトをテストしましたが ですが、/ Usersの下にnginx.confがないかぎり、Macではボリュームマウントが機能しない可能性があります)POST要求を正しく処理するフォワードプロキシとしてnginxを設定する方法 - GETは機能しますが、POSTは404秒になります

このスクリプトでは、記事Iと同じnginx.confを使用しています上記参照。 POSTの問題は、localhost上で を実行しているサービスにPOSTしようとした場合にのみ発生します。リモートサービスへのPOSTは正常に機能します。しかし、実際にはnginxをセットアップしたいので、 はローカルで(テスト目的のために)実行されているサービスにプロキシすることができます。

問題を再現するには、以下のようにmongodbをDockerでローカルに実行するよう設定します。 私がmongodbを選んだ唯一の理由は、ローカルで実行するようにセットアップするのが速く、 はすぐにPOST要求を受け入れることです。

docker run -p 27017:27017 -p 28017:28017 --name some-mongo -e AUTH=no -d mongo --rest --httpinterface 
# verify you can send a POST 
curl -v -d '{ "A1" : 201 }' -H "Content-Type: application/json" http://localhost:28017/local/example1 
# the above command will return {"OK": true } when NOT run via proxy. 

次は、セットアップ、私はSETUP_NGINXでスクリプトを貼り付けコピーによって行ったようプロキシをすることができます。 9999でプロキシを設定した後、GETをプロキシすることができます。たとえば、次のコマンド:9999(それはそのプロキシされている 示して余分なヘッダを含んでいます):

curl --proxy localhost:9999 http://httpbin.org/get 

たちは--proxyローカルホストを指定しないときとほぼ同じ結果が得られます。

また、このようなhttpbin.orgへのプロキシPOSTリクエストは、することができます:

curl --proxy localhost:9999 --data "param1=value1" http://httpbin.org/post 

しかし、今、のは、私はプロキシに私のローカルで実行されているのMongoDBへのPOSTリクエストを望んでいたとしましょう。
は、私が最初にカールコマンドとほぼ同じcurlコマンド(上記)を実行します。

curl --proxy localhost:9999 -v -d '{ "A1" : 201 }' -H "Content-Type: application/json" http://localhost:28017/local/example2 

をしかし、今回は私が見つからない404を取得します。 --proxyスイッチ を削除すると問題なく動作します。どんな支援も大歓迎です!私の同僚ビネーシュからの助けを借りて

SETUP_NGINX

cat >nginx.conf <<'END' 
user nginx; 
worker_processes 1; 

error_log /var/log/nginx/error.log warn; 
pid  /var/run/nginx.pid; 


events { 
    worker_connections 1024; 
} 

http { 
    include  /etc/nginx/mime.types; 
    default_type application/octet-stream; 
    log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 
         '$status $body_bytes_sent "$http_referer" ' 
         '"$http_user_agent" "$http_x_forwarded_for"'; 

    access_log /var/log/nginx/access.log main; 

    sendfile  on; 
    #tcp_nopush  on; 
    keepalive_timeout 65; 
    #gzip on; 

    server { 
     listen  9999; 
     location/{ 
      resolver 8.8.8.8; 
      proxy_pass http://$http_host$uri$is_args$args; 
     } 
     error_page 500 502 503 504 /50x.html; 
     location = /50x.html { 
      root html; 
     } 
    } 
    include /etc/nginx/conf.d/*.conf; 
} 
END 

docker run -d --name nginxproxy -p 9999:9999 -p 80:80 -v `pwd`/nginx.conf:/etc/nginx/nginx.conf nginx 

答えて

0

、我々はここで何が起こっているかのような答えを思い付きました。 mongoへのリクエストを発行する際には、URL「http://localhost:28017/local/example1」をRESTエンドポイントとして使用します。このURLは、独自のドッカーコンテナで実行されているプロキシサーバ(nginx)に渡されます。プロキシサーバの観点から、ドッキングコンテナ内で実行されているmongodbサーバは存在しないので、これを放棄して404を返します。

次のような問題を回避することができる。

  • はそれが正確にnginxの設定ファイルを保持します。
  • ドッカーを起動しているマシンのIPアドレスに$ IPを設定します。その後

、あなたは、プロキシを経由して、モンゴこのようにそうするようにポスト:
カール--proxyはlocalhost:9999 -v -d '{ "A1":201}' -H「のContentタイプ:application/json "http:// $ IP:28017/local/example2

上記のURLのlocalhostに$ IPをスワップしたことに注意してください。

localhostではなく明示的なIPを使用することで、問題が解決されます。

関連する問題