Intereting Posts

Почему nginx возвращает 502 при выполнении `uwsgi_pass` в связанном контейнере докеров?

Я использую Docker Compose для организации многоконтейнерного приложения, состоящего из Django webapp и обратного прокси-сервера nginx.

Я смотрю на простой тестовый чехол, но я уже попал в блокпост. Приложение должно передать все запросы в приложение Django через uwsgi_pass через сетевой сокет ( frontend:8000 ).

Однако после запуска приложения с docker-compose up и отсутствия сообщения об ошибке, любой запрос / вызывает следующее сообщение об ошибке в консоли: gateway_1 | 2016/01/11 15:45:12 [error] 8#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.99.1, server: localhost, request: "GET / HTTP/1.1", upstream: "uwsgi://172.17.0.2:8000", host: "192.168.99.100:8000" gateway_1 | 2016/01/11 15:45:12 [error] 8#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.99.1, server: localhost, request: "GET / HTTP/1.1", upstream: "uwsgi://172.17.0.2:8000", host: "192.168.99.100:8000"

Мой вопрос таков: что может быть проблемой? Замена uwsgi_pass frontend; в блоке location с content_by_lua_file path/to/file.lua; ведет себя так, как ожидалось, поэтому я подозреваю, что проблема связана с uWSGI над контейнерной ссылкой, но я не понимаю, где искать дальше.

Ниже приведены соответствующие файлы:

Docker Compose: вид 30 000 футов

Файл docker-compose.yml выглядит следующим образом:

 postgres: image: mystuff/app.testdb:latest expose: - "5432" frontend: image: mystuff/app.frontend:latest expose: - "8000" environment: APP_DBCONN: "user=xxx dbname=xxx port=5432 host=postgres sslmode=require password=xxx" APP_ENV: "test" gateway: image: mystuff/app.gateway:latest links: - frontend expose: - "8000" ports: - "8000:8000" по теме postgres: image: mystuff/app.testdb:latest expose: - "5432" frontend: image: mystuff/app.frontend:latest expose: - "8000" environment: APP_DBCONN: "user=xxx dbname=xxx port=5432 host=postgres sslmode=require password=xxx" APP_ENV: "test" gateway: image: mystuff/app.gateway:latest links: - frontend expose: - "8000" ports: - "8000:8000" 

NGINX: обратный прокси

Ниже nginx.conf файл nginx.conf :

 worker_processes 1; user me; events { use epoll; worker_connections 1024; } http { access_log /dev/stdout; upstream frontend { server frontend:8000; # assumption: `frontend` is a known hostname thanks to docker-compose } server { listen 8000; server_name localhost; location / { uwsgi_pass frontend; include uwsgi_params; } } } 

И, наконец, вот мой файл uwsgi_params :

 uwsgi_param QUERY_STRING $query_string; uwsgi_param REQUEST_METHOD $request_method; uwsgi_param CONTENT_TYPE $content_type; uwsgi_param CONTENT_LENGTH $content_length; uwsgi_param REQUEST_URI $request_uri; uwsgi_param PATH_INFO $document_uri; uwsgi_param DOCUMENT_ROOT $document_root; uwsgi_param SERVER_PROTOCOL $server_protocol; uwsgi_param REQUEST_SCHEME $scheme; uwsgi_param HTTPS $https if_not_empty; uwsgi_param REMOTE_ADDR $remote_addr; uwsgi_param REMOTE_PORT $remote_port; uwsgi_param SERVER_PORT $server_port; uwsgi_param SERVER_NAME $server_name; 

uWSGI & Django: сервер приложений

uwsgi.ini :

 [uwsgi] chdir = /home/app wsgi-file = ./NFC/wsgi.py socket = 127.0.0.1:8000 master = true processes = 1 threads = 2 uid = me 

Правки

1. Выход журнала с http = 127.0.0.1:8000 в uwsgi.ini

 $ cat /tmp/uwsgi.log *** Starting uWSGI 2.0.12 (64bit) on [Wed Jan 13 12:09:44 2016] *** compiled with version: 4.9.2 on 03 January 2016 21:09:04 os: Linux-4.1.13-boot2docker #1 SMP Fri Nov 20 19:05:50 UTC 2015 nodename: default machine: x86_64 clock source: unix pcre jit disabled detected number of CPU cores: 1 current working directory: /home/srg detected binary path: /home/srg/.pyenv/versions/2.7.11/bin/uwsgi chdir() to /home/srg your processes number limit is 1048576 your memory page size is 4096 bytes detected max file descriptor number: 1048576 lock engine: pthread robust mutexes thunder lock: disabled (you can enable it with --thunder-lock) uWSGI http bound on 127.0.0.1:8000 fd 7 uwsgi socket 0 bound to TCP address 127.0.0.1:38922 (port auto-assigned) fd 6 Python version: 2.7.11 (default, Jan 3 2016, 21:07:12) [GCC 4.9.2] Python main interpreter initialized at 0x1d37300 python threads support enabled your server socket listen backlog is limited to 100 connections your mercy for graceful operations on workers is 60 seconds mapped 166144 bytes (162 KB) for 2 cores *** Operational MODE: threaded *** WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x1d37300 pid: 173 (default app) *** uWSGI is running in multiple interpreter mode *** spawned uWSGI master process (pid: 173) spawned uWSGI worker 1 (pid: 210, cores: 2) spawned uWSGI http 1 (pid: 211) SIGINT/SIGQUIT received...killing workers... gateway "uWSGI http 1" has been buried (pid: 211) worker 1 buried after 1 seconds goodbye to uWSGI. 

С этой конфигурацией uWSGI, особенно с:

 socket = 127.0.0.1:8000 

uWSGI разрешает только локальное соединение (что означает от одного докера, а не от хоста или других докеров). Чтобы разрешить подключения извне докера, вы должны изменить его на:

 socket = :8000 

Попробуйте добавить следующее свойство в конфигурацию .ini.

 chmod-socket = 666