Я пытаюсь настроить несколько серверов, которые выглядят как:Как настроить автономный сервер приложений 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
Я знаю, что сокет создается, потому что я вижу это:
, но я не могу получить доступ к серверу 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.
Тем не менее, вы не знаете, как решить проблему.