web-dev-qa-db-ja.com

プロキシ(nginx)が不正なゲートウェイエラーを表示する

port 5000で実行するサービス(dockerレジストリ)があります。nginxをインストールして、httpリクエストを8080から5000にリダイレクトします。 localhost:5000へのカールを作成すると機能しますが、localhost:8080へのカールを作成するとBad gatewayエラーが発生します。

nginx設定ファイル:

upstream docker-registry {
 server localhost:5000;
}

server {
 listen 8080;
 server_name registry.mydomain.com;

 proxy_set_header Host       $http_Host; 
 proxy_set_header X-Real-IP  $remote_addr; 
 client_max_body_size 0; 
 chunked_transfer_encoding on;

 location / {

     proxy_pass http://docker-registry;
 }
 location /_ping {
     auth_basic off;
     proxy_pass http://docker-registry;
 }
 location /v1/_ping {
     auth_basic off;
     proxy_pass http://docker-registry;
 }

}

/var/log/nginx/error.logでは、

[crit] 15595#0: *1 connect() to [::1]:5000 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: registry.mydomain.com, request: "GET / HTTP/1.1", upstream: "http://[::1]:5000/", Host: "localhost:8080"

何か案が?

18
hellb0y77

私はそのLinuxボックスを想定しているため、接続を許可するポリシーがないため、SELinuxが接続を妨げている可能性があります。

あなたはただ走ることができるはずです

# setsebool -P httpd_can_network_connect true

nginxを再起動します。

58
Warren

エラーメッセージに基づいて、localhost:5000がipv6アドレスとして解決されているかどうかを確認します。あなたはそれを127.0.0.1:5000に変更してみることができます

編集: proxy_pass行で、URLの一部が欠落している可能性がありますか? $ request_uriを追加してみてください:

proxy_pass http://docker-registry/$request_uri;

またはおそらく:

proxy_pass http://docker-registry$request_uri;

どちらが最も正しいかわからない。

考慮すべきもう一つ。あなたの設定は示しています:

server_name registry.mydomain.com;

したがって、localhost:8080は一致しない可能性があります。テストの場合、これを次のように変更できます。

server_name registry.mydomain.com localhost;

次に、localhost:8080とドメインが一致します。私は、registry.mydomain.comは単なる例であり、実際のサーバーのFQDNをそこに配置するとします。

5
Gregor