web-dev-qa-db-ja.com

nginx-proxyはhttpとhttpsで503エラーを返します

アプリサーバーを実行しているDockerコンテナの前でリバースプロキシとして nginx-proxy を設定しています。これらは、個別のDocker構成定義で定義されています。なんらかの理由で503を取得していますが、理由がわからないため、nginx-proxyのドキュメントを詳しく調べました。

(私もこれを開きました githubの問題として for nginx-proxy。)

アプリサーバーは元々、443を介してhttpsを提供し、10443はホストに公開されていました。ホストに公開されている80を使用して10443経由でhttpを提供するように切り替えました。

アプリサーバーから直接カールすることはできますが、nginx-proxyを介してカールするとエラーが発生します

最初は443にnginx-proxyがありましたが、今は80に切り替えました。

default.crtdefault.keyを追加するまで、接続拒否エラーが発生していました。それらを追加した後、私は503を取得しています。

curl http://foo.example.com:80/apidocs --verbose --insecure
* Hostname was NOT found in DNS cache
*   Trying 10.x.x.x...
* Connected to foo.example.com (10.x.x.x) port 80 (#0)
> GET /apidocs HTTP/1.1
> User-Agent: curl/7.35.0
> Host: foo.example.com
> Accept: */*
>
< HTTP/1.1 503 Service Temporarily Unavailable
* Server nginx/1.9.12 is not blacklisted
< Server: nginx/1.9.12
< Date: Thu, 21 Apr 2016 17:26:16 GMT
< Content-Type: text/html
< Content-Length: 213
< Connection: keep-alive
<
<html>
<head><title>503 Service Temporarily Unavailable</title></head>
<body bgcolor="white">
<center><h1>503 Service Temporarily Unavailable</h1></center>
<hr><center>nginx/1.9.12</center>
</body>
</html>
* Connection #0 to Host foo.example.com left intact

これがnginx-proxyの私の作成定義です。 network_mode: bridgeを使用しています。これは 動作するはずですversion: 2でも使用できます。

version: '2'
# Not yet compatible with custom networks in v2 of Compose
services:
  nginx:
    image: jwilder/nginx-proxy
    # Necessary until nginx-proxy fully supports Compose v2 networking
    network_mode: bridge
    ports:
      - "80:80"
    restart: always
    volumes:
      - "certs:/etc/nginx/certs:ro"
      - "nginx-log:/var/log/nginx"
      - "/var/run/docker.sock:/tmp/docker.sock:ro"
volumes:
  certs:
    external: true
  nginx-log:
    external: true

これが私のアプリサーバーの構成です:

version: '2'
services:
  database:
    image: sameersbn/postgresql:9.4-13
    restart: always
    # Necessary until nginx-proxy fully supports Compose v2 networking
    network_mode: bridge
    ports:
      - "55433:5432"
    environment:
      - DB_USER=foo
      - DB_PASS=...
      - DB_NAME=foo_staging
      - USERMAP_UID=1000
    volumes:
      - "foo-data:/var/lib/postgresql"

  foo:
    image: private-registry.example.com/dswb/foo:1.4.3
    restart: always
    container_name: "dswb-foo"
    links:
      - "database:database"
    # Necessary until nginx-proxy fully supports Compose v2 networking
    network_mode: bridge
    ports:
      - "10443:80"
    volumes:
      - "certs:/home/Rails/webapp/certs"
    environment:
#      - "CERT_NAME=example.com"
      - "VIRTUAL_HOSTNAME=foo.example.com"
      - "VIRTUAL_PORT=80"
      - "VIRTUAL_PROTO=http"
    command: "bash -c 'rake db:migrate && thin --port 80 --address 0.0.0.0 start'"
volumes:
  foo-data:
    driver: local
  certs:
    external: true

デバッグのためにポート80に切り替えたため、証明書の関連性は低くなりました。 *.example.comのワイルドカード証明書を持っています。 nginx-proxyが見つからなかった場合に備えて、foo.example.comという名前のコピーを作成しました。 CERT_NAMEを設定する場合としない場合の両方を試しました。 dhparamのものも生成しました。

root@8b02a7deb220:/etc/nginx/certs# ls -la
total 48
drwxr-xr-x 2 root root 4096 Apr 21 18:15 .
drwxr-xr-x 4 root root 4096 Apr 21 18:06 ..
-rw------- 1 root root 3575 Apr 21 18:03 example.com.crt
-rw-r--r-- 1 root root  769 Apr 21 18:03 example.com.dhparam.pem
-rw------- 1 root root 1679 Apr 21 18:03 example.com.key
-rw-r--r-- 1 root root 1838 Apr 21 18:03 default.crt
-rw-r--r-- 1 root root 3268 Apr 21 18:03 default.key
-rw------- 1 root root 3575 Apr 21 17:37 foo.example.com.crt
-rw-r--r-- 1 root root  769 Apr 21 18:15 foo.example.com.dhparam.pem
-rw------- 1 root root 1679 Apr 21 17:37 foo.example.com.key

これは、カールしたときにnginx-proxyログに表示される唯一のものです。

nginx.1    | foo.example.com 10.x.x.x - - [21/Apr/2016:17:26:16 +0000] "GET /apidocs HTTP/1.1" 503 213 "-" "curl/7.35.0"

アプリサーバーのログには何も表示されません。つまり、リクエストは表示されません。

これをデバッグするにはどうすればよいですか?どこかにもっと良いログがありますか?

1
Leo

まず、nginxログをデバッグに設定してから、リクエストが503をスローする場所を確認します。

server {
    #other config
    error_log    /var/logs/nginx/example.com.error.log debug;
    #other config
}
2
DuckDNS

ポート80から10443と言いますが、DockerインストールはまだHTTPSを提供していますか?その場合は、両方をHTTPに設定し、Dockerで混乱の少ないポート10080を使用してみてください。

0
Dan Armstrong