私は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