如何在 Ubuntu 服务器上使用 Supervisor/Nginx/Gunicorn 部署 Flask 应用程序
How to deploy Flask app with Supervisor/Nginx/Gunicorn on Ubuntu server
我正在尝试在 Ubuntu 服务器上部署 Flask 应用程序。参考了this, this and this,在SO上发现了很多类似的问题,但还是想不通。
我可以通过执行 uwsgi siti_uwsgi.ini
并导航到 http://server_IP_address:8080/
从源目录手动 运行 它。但是当我尝试 uwsgi --socket 127.0.0.1:3031 --wsgi-file views.py --master --processes 4 --threads 2
并导航到 http://server_IP_address:3031
时,我什么也得不到。
如果我去siti.company.loc
(我设置的DNS名称),有一个标准的Nginx 502错误页面。
当我尝试重新启动主管进程时,它因致命错误而终止:
can't find command "gunicorn"
我做错了什么?如果我需要提供更多信息或背景,请告诉我。
/webapps/patch/src/views.py(烧瓶应用程序):
from flask import Flask, render_template, request, url_for, redirect
from flask_cors import CORS
app = Flask(__name__)
CORS(app, resources={r"/*": {'origins': '*'}})
@app.route('/')
def home():
return 'Hello'
@app.route('/site:<site>/date:<int:day>-<month>-<int:year>')
def application(site, month, day, year):
if request.method == 'GET':
# Recompile date from URL. todo: better way
dte = str(day) + "-" + str(month) + "-" + str(
print('about to run')
results = run_SITI(site, dte)
return results
def run_SITI(site, dte):
print('running SITI')
return render_template('results.html', site=site, dte=dte, results=None) # todo: Show results
if __name__ == '__main__':
app.run(debug=True)
/webapps/patch/siti_wsgi.ini (uWSGI ini):
[uwsgi]
http = :8008
chdir = /webapps/patch/src
wsgi-file = views.py
processes = 2
threads = 2
callable = app
/etc/nginx/sites-available/siti(Nginx 配置):
upstream flask_siti {
server 127.0.0.1:8008 fail_timeout=0;
}
server {
listen 80;
server_name siti.company.loc;
charset utf-8;
client_max_body_size 75M;
access_log /var/log/nginx/siti/access.log;
error_log /var/log/nginx/siti/error.log;
keepalive_timeout 5;
location /static {
alias /webapps/patch/static;
}
location /media {
alias /webapps/patch/media;
}
location / {
# checks for static file, if not found proxy to the app
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://flask_siti;
}
}
/etc/supervisor/conf.d/siti.conf(管理员配置):
[program:webapp_siti]
command=gunicorn -b views:app
directory=/webapps/patch/src
user=nobody
autostart=true
autorestart=true
redirect_stderr=true
/var/log/nginx/siti/error.log(Nginx错误日志):
2016/08/30 11:44:42 [error] 25524#0: *73 connect() failed (111: Connection refused) while connecting to upstream, $
2016/08/30 11:44:42 [error] 25524#0: *73 connect() failed (111: Connection refused) while connecting to upstream, $
2016/08/30 11:44:42 [error] 25524#0: *73 no live upstreams while connecting to upstream, client: 10.1.2.195, serve$
您在 nginx
配置中有错误:
而不是:
upstream flask_siti {
server 127.0.0.1:8008 fail_timeout=0;
server {
...
尝试:
upstream flask_siti {
server 127.0.0.1:8080 fail_timeout=0;
}
server {
...
您必须在 supervisor
配置中 "activate" virtualenv。为此,请将以下行添加到您的 supervisor
配置中:
environment=PATH="/webapps/patch/venv/bin",VIRTUAL_ENV="/webapps/patch/venv",PYTHONPATH="/webapps/patch/venv/lib/python:/webapps/patch/venv/lib/python/site-packages"
能够通过以下更改使其正常工作:
/etc/supervisor/conf.d/siti.conf(管理员配置):
[program:webapp_siti]
command=/webapps/patch/venv/bin/gunicorn -b :8118 views:app # didn't use uwsgi.ini after all
directory=/webapps/patch/src
user=nobody
autostart=true
autorestart=true
redirect_stderr=true
/etc/nginx/sites-enabled/siti(Nginx 配置):
upstream flask_siti {
server 127.0.0.1:8118 fail_timeout=0; # changed ports because 8008 was already in use by something else
}
# snip ...
原来我已经设置了 uWSGI 来监听端口 8008。我在 /etc/nginx/sites-enabled 中还有一个名为 siti.save
的额外文件,它阻止了 Nginx 重新加载。我删了,reloaded/restartedNginx,重启Supervisor,成功了
我正在尝试在 Ubuntu 服务器上部署 Flask 应用程序。参考了this, this and this,在SO上发现了很多类似的问题,但还是想不通。
我可以通过执行 uwsgi siti_uwsgi.ini
并导航到 http://server_IP_address:8080/
从源目录手动 运行 它。但是当我尝试 uwsgi --socket 127.0.0.1:3031 --wsgi-file views.py --master --processes 4 --threads 2
并导航到 http://server_IP_address:3031
时,我什么也得不到。
如果我去siti.company.loc
(我设置的DNS名称),有一个标准的Nginx 502错误页面。
当我尝试重新启动主管进程时,它因致命错误而终止:
can't find command "gunicorn"
我做错了什么?如果我需要提供更多信息或背景,请告诉我。
/webapps/patch/src/views.py(烧瓶应用程序):
from flask import Flask, render_template, request, url_for, redirect
from flask_cors import CORS
app = Flask(__name__)
CORS(app, resources={r"/*": {'origins': '*'}})
@app.route('/')
def home():
return 'Hello'
@app.route('/site:<site>/date:<int:day>-<month>-<int:year>')
def application(site, month, day, year):
if request.method == 'GET':
# Recompile date from URL. todo: better way
dte = str(day) + "-" + str(month) + "-" + str(
print('about to run')
results = run_SITI(site, dte)
return results
def run_SITI(site, dte):
print('running SITI')
return render_template('results.html', site=site, dte=dte, results=None) # todo: Show results
if __name__ == '__main__':
app.run(debug=True)
/webapps/patch/siti_wsgi.ini (uWSGI ini):
[uwsgi]
http = :8008
chdir = /webapps/patch/src
wsgi-file = views.py
processes = 2
threads = 2
callable = app
/etc/nginx/sites-available/siti(Nginx 配置):
upstream flask_siti {
server 127.0.0.1:8008 fail_timeout=0;
}
server {
listen 80;
server_name siti.company.loc;
charset utf-8;
client_max_body_size 75M;
access_log /var/log/nginx/siti/access.log;
error_log /var/log/nginx/siti/error.log;
keepalive_timeout 5;
location /static {
alias /webapps/patch/static;
}
location /media {
alias /webapps/patch/media;
}
location / {
# checks for static file, if not found proxy to the app
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://flask_siti;
}
}
/etc/supervisor/conf.d/siti.conf(管理员配置):
[program:webapp_siti]
command=gunicorn -b views:app
directory=/webapps/patch/src
user=nobody
autostart=true
autorestart=true
redirect_stderr=true
/var/log/nginx/siti/error.log(Nginx错误日志):
2016/08/30 11:44:42 [error] 25524#0: *73 connect() failed (111: Connection refused) while connecting to upstream, $
2016/08/30 11:44:42 [error] 25524#0: *73 connect() failed (111: Connection refused) while connecting to upstream, $
2016/08/30 11:44:42 [error] 25524#0: *73 no live upstreams while connecting to upstream, client: 10.1.2.195, serve$
您在 nginx
配置中有错误:
而不是:
upstream flask_siti {
server 127.0.0.1:8008 fail_timeout=0;
server {
...
尝试:
upstream flask_siti {
server 127.0.0.1:8080 fail_timeout=0;
}
server {
...
您必须在 supervisor
配置中 "activate" virtualenv。为此,请将以下行添加到您的 supervisor
配置中:
environment=PATH="/webapps/patch/venv/bin",VIRTUAL_ENV="/webapps/patch/venv",PYTHONPATH="/webapps/patch/venv/lib/python:/webapps/patch/venv/lib/python/site-packages"
能够通过以下更改使其正常工作:
/etc/supervisor/conf.d/siti.conf(管理员配置):
[program:webapp_siti]
command=/webapps/patch/venv/bin/gunicorn -b :8118 views:app # didn't use uwsgi.ini after all
directory=/webapps/patch/src
user=nobody
autostart=true
autorestart=true
redirect_stderr=true
/etc/nginx/sites-enabled/siti(Nginx 配置):
upstream flask_siti {
server 127.0.0.1:8118 fail_timeout=0; # changed ports because 8008 was already in use by something else
}
# snip ...
原来我已经设置了 uWSGI 来监听端口 8008。我在 /etc/nginx/sites-enabled 中还有一个名为 siti.save
的额外文件,它阻止了 Nginx 重新加载。我删了,reloaded/restartedNginx,重启Supervisor,成功了