如果我已经设置了 Nginx 代理,如何设置独立的 Gunicorn 应用程序服务器?
How do I set up a stand-alone Gunicorn App server if I already have an Nginx proxy set up?
我正在尝试设置多个服务器,如下所示:
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 地址时,无论是否附加 :8000 端口,我都无法单独访问 Gunicorn 服务器。如果没有 systemd 配置,我可以访问该站点:
gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application
但我想用像 systemd 这样的初始化系统以正确的方式做到这一点,我认为我不应该将它直接绑定到一个端口,因为我读过它更少 efficient/secure 而不是使用套接字。除非绑定到端口是唯一的方法,否则我想这就是我必须做的。
我看到的每个教程都说我需要在我的 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 状态并收到错误:
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.
仍然不确定如何解决该问题。
正确的答案是将 Gunicorn 绑定到端口而不是 unix 套接字。我不太清楚细节,但 unix 套接字只能在本地网络内使用,根据:
https://unix.stackexchange.com/questions/91774/performance-of-unix-sockets-vs-tcp-ports
所以当我将 gunicorn.service 文件 ExecStart 行更改为:
ExecStart=/home/kyle/do_app_one/venv/bin/gunicorn --workers 3 --bind 0.0.0.0:8000 do_app_one.wsgi:application
我能够自己访问服务器,并将它连接到我在不同 IP 上的 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
`----> ..
我知道我需要将应用服务器(在本例中为 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 地址时,无论是否附加 :8000 端口,我都无法单独访问 Gunicorn 服务器。如果没有 systemd 配置,我可以访问该站点:
gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application
但我想用像 systemd 这样的初始化系统以正确的方式做到这一点,我认为我不应该将它直接绑定到一个端口,因为我读过它更少 efficient/secure 而不是使用套接字。除非绑定到端口是唯一的方法,否则我想这就是我必须做的。
我看到的每个教程都说我需要在我的 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 状态并收到错误:
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.
仍然不确定如何解决该问题。
正确的答案是将 Gunicorn 绑定到端口而不是 unix 套接字。我不太清楚细节,但 unix 套接字只能在本地网络内使用,根据:
https://unix.stackexchange.com/questions/91774/performance-of-unix-sockets-vs-tcp-ports
所以当我将 gunicorn.service 文件 ExecStart 行更改为:
ExecStart=/home/kyle/do_app_one/venv/bin/gunicorn --workers 3 --bind 0.0.0.0:8000 do_app_one.wsgi:application
我能够自己访问服务器,并将它连接到我在不同 IP 上的 Nginx 服务器。