【发布时间】:2016-12-04 05:13:08
【问题描述】:
我正在尝试设置多个服务器,如下所示:
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
`----> ..
我知道我需要将应用服务器(在本例中为 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
我知道正在创建套接字,因为我可以看到它:
但是当我点击 IP 地址时,我无法自行访问 Gunicorn 服务器,无论是否连接了 :8000 端口。如果没有 systemd 配置,我可以访问该站点:
gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application
但我想用 systemd 之类的初始化系统以正确的方式执行此操作,而且我认为我不应该将它直接绑定到端口,因为我读过它的效率/安全性低于使用插座。除非绑定到端口是唯一的方法,否则我想这就是我必须做的。
我看到的每个教程都说我的 Gunicorn 服务器前面需要一个 Nginx 服务器,但我前面已经有一个 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 服务器,为什么我需要在每个 App Server 前面都需要另一个 Nginx 服务器?这似乎是多余的。
如果我不需要在每个 Gunicorn 服务器前面再安装一个 Nginx 服务器,我该如何使用 systemd 设置 Gunicorn 服务器使其可以独立运行?
编辑:
我很好奇为什么绑定到物理端口有效,但套接字却没有,所以我运行 gunicorn status 并得到错误:
kyle@ubuntu-512mb-tor1-01-app:~/do_app_one$ . venv/bin/activate
(venv) kyle@ubuntu-512mb-tor1-01-app:~/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.
仍然不确定如何解决问题。
【问题讨论】:
标签: nginx load-balancing reverse-proxy gunicorn devops