2016-12-03 18 views
1

Я пытаюсь настроить несколько серверов, которые выглядят как:Как настроить автономный сервер приложений Gunicorn, если у меня уже установлен прокси-сервер Nginx?

Client Request ----> Nginx (Reverse-Proxy/Load-Balancer) 
         | 
         /|\       
         | | `-> App. Server I. 10.128.xxx.yy1:8080 # Our example 
         | `--> App. Server II. 10.128.xxx.yy2:8080 
         `----> .. 

Я понимаю, что мне нужно поставить серверы App (Gunicorn в данном случае) позади Nginx прокси, но как настроить Серверы приложений сами по себе?

Я пытаюсь настроить сервер приложений с Systemd, и моя конфигурация выглядит следующим образом:

[Unit] 
Description=gunicorn daemon 
After=network.target 

[Service] 
User=kyle 
Group=www-data 
WorkingDirectory=/home/kyle/do_app_one 
ExecStart=/home/kyle/do_app_one/venv/bin/gunicorn --workers 3 --bind unix:/home/kyle/do_app_one/do_app_one.sock do_app_one.wsgi:application 

[Install] 
WantedBy=multi-user.target 

Я знаю, что сокет создается, потому что я вижу это:

enter image description here

, но я не могу получить доступ к серверу Gunicorn самостоятельно, когда попал на IP-адрес, с или без: подключенного к нему порта 8000. Без Systemd конфигурации, я могу получить доступ к сайту, если я:

gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application 

, но я хочу сделать это правильный путь с системой инициализации, как Systemd, и я не думаю, что я должен быть обязательным он непосредственно к порту, потому что я читал, что он менее эффективен/безопасен, чем использование сокета. Если привязка к порту - единственный способ, я думаю, это то, что я должен сделать.

Каждый учебник, который я вижу, говорит, что мне нужен сервер Nginx перед моим сервером Gunicorn, но у меня уже есть сервер Nginx перед ними. Нужно ли мне еще один в передней части каждого сервера таким образом, что она выглядит как:

Client Request ----> Nginx (Reverse-Proxy/Load-Balancer) 
         | 
         /|\       
         | | `-> Nginx + App. Server I. 10.128.xxx.yy1:8080 # Our example 
         | `--> Nginx + App. Server II. 10.128.xxx.yy2:8080 
         `----> .. 

Если Nginx является сервером HTTP и Gunicorn является сервером HTTP, зачем мне нужен другой сервер Nginx перед каждым App Server ? Это кажется излишним.

И если мне не нужен другой сервер Nginx перед каждым сервером Gunicorn, как мне настроить сервер Gunicorn с systemd таким образом, чтобы он мог стоять в одиночестве?

Edit:

мне было любопытно, почему привязка к физическому порту работает, но сокет не был, поэтому я побежал gunicorn статус и получил ошибки:

[email protected]:~/do_app_one$ . venv/bin/activate 
(venv) [email protected]:~/do_app_one$ gunicorn status 
[2016-12-03 20:19:49 +0000] [11050] [INFO] Starting gunicorn 19.6.0 
[2016-12-03 20:19:49 +0000] [11050] [INFO] Listening at: http://127.0.0.1:8000 (11050) 
[2016-12-03 20:19:49 +0000] [11050] [INFO] Using worker: sync 
[2016-12-03 20:19:49 +0000] [11053] [INFO] Booting worker with pid: 11053 
[2016-12-03 20:19:49 +0000] [11053] [ERROR] Exception in worker process 
Traceback (most recent call last): 
    File "/home/kyle/do_app_one/venv/lib/python3.5/site-packages/gunicorn/arbiter.py", line 557, in spawn_worker 
    worker.init_process() 
    File "/home/kyle/do_app_one/venv/lib/python3.5/site-packages/gunicorn/workers/base.py", line 126, in init_process 
    self.load_wsgi() 
    File "/home/kyle/do_app_one/venv/lib/python3.5/site-packages/gunicorn/workers/base.py", line 136, in load_wsgi 
    self.wsgi = self.app.wsgi() 
    File "/home/kyle/do_app_one/venv/lib/python3.5/site-packages/gunicorn/app/base.py", line 67, in wsgi 
    self.callable = self.load() 
    File "/home/kyle/do_app_one/venv/lib/python3.5/site-packages/gunicorn/app/wsgiapp.py", line 65, in load 
    return self.load_wsgiapp() 
    File "/home/kyle/do_app_one/venv/lib/python3.5/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp 
    return util.import_app(self.app_uri) 
    File "/home/kyle/do_app_one/venv/lib/python3.5/site-packages/gunicorn/util.py", line 357, in import_app 
    __import__(module) 
ImportError: No module named 'status' 
[2016-12-03 20:19:49 +0000] [11053] [INFO] Worker exiting (pid: 11053) 
[2016-12-03 20:19:49 +0000] [11050] [INFO] Shutting down: Master 
[2016-12-03 20:19:49 +0000] [11050] [INFO] Reason: Worker failed to boot. 

Тем не менее, вы не знаете, как решить проблему.

ответ

0

Правильный ответ - просто связать Gunicorn с портом вместо разъема unix. Я не слишком уверен в деталях, но UNIX-сокеты могут быть использованы только в пределах локальной сети в соответствии с:

https://unix.stackexchange.com/questions/91774/performance-of-unix-sockets-vs-tcp-ports

Так что, когда я изменил ExecStart линию gunicorn.service файла:

ExecStart=/home/kyle/do_app_one/venv/bin/gunicorn --workers 3 --bind 0.0.0.0:8000 do_app_one.wsgi:application 

Мне удалось получить доступ к серверу самостоятельно и подключить его к моему серверу Nginx, который был на другом IP-адресе.

 Смежные вопросы

  • Нет связанных вопросов^_^