Я настраиваю nginx-прокси как обратный прокси-сервер перед контейнером Docker, на котором запущен сервер приложений. Они определены в отдельных определениях композиции Docker. По какой-то причине я получаю 503
, но я не знаю почему, и я просмотрел nginx-proxy
документы подробно.
(Я также открыл это как проблема github для nginx-proxy
.)
Сервер приложений изначально обслуживал https через 443
с участием 10443
выставлен на хост. Я перешел на обслуживание http через 80
с участием 10443
выставлено на хосте.
Я могу выполнить скручивание напрямую с сервера приложений, но скручивание через nginx-proxy вызывает ошибку
Изначально у меня был nginx-proxy на 443
, но я переключил его на 80
на данный момент.
Пока я не добавил default.crt
и default.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
. Я сделал копию под названием foo.example.com
на случай, если nginx-proxy не смог его найти. Я пробовал устанавливать и не устанавливать 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"
В журнале сервера приложений ничего не отображается, то есть запрос не отображается.
Как мне отладить это? Есть где-нибудь логи получше?
Я бы начал с настройки вашего журнала nginx для отладки, а затем проверял, где запрос вызывает 503
server {
#other config
error_log /var/logs/nginx/example.com.error.log debug;
#other config
}
Вы говорите, что порт 80 - 10443, ваша установка Docker все еще обслуживает HTTPS? Если это так, попробуйте установить оба на HTTP и использовать менее запутанный порт 10080 в Docker.