在生产环境中运行Python Eve REST API
现在是时候把我的Python Eve API放到生产环境中了。实现这个目标有几种方法,最常见的需求包括:
- 错误日志记录
- 自动重启
- 多个进程(如果可能的话)
我找到的最佳解决方案是使用nginx作为前端服务器,并让python eve在uWSGI中间件上运行。
问题是:我有一个自定义的__main__
,但是uwsgi并没有调用它。
有没有人有这个配置在运行,或者有其他的建议?一旦它能正常工作,我会分享一个运行的配置。
谢谢。
解决方案(更新):
根据下面的建议,我把Eve()方法移动到了init.py文件中,并用一个单独的wsgi.py来运行应用。
文件夹结构:
webservice/ init.py
webservice/modules/...
settings.py
wsgi.py
其中,init.py包含
app = Eve(auth=globalauth.TokenAuth)
Bootstrap(app)
app.config['X_DOMAINS'] = '*'
...
而wsgi.py包含
from webservice import app
if __name__ == "__main__":
app.run()
wsgi.ini
[uwsgi]
chdir=/var/www/api/prod
module=wsgi:app
socket=/tmp/api.sock
processes=1
master=True
pidfile=/tmp/api.v1.pid
max-requests=5000
daemonize=/var/www/api/logs/prod.api.log
logto=/var/www/api/logs/uwsgi.log
nginx.conf
location = /v1 { rewrite ^ /v1/; }
location /v1 { try_files $uri @apiWSGIv1; }
location @apiWSGIv1 {
include uwsgi_params;
uwsgi_modifier1 30;
uwsgi_pass unix:/tmp/digdisapi.sock;
}
启动命令:
uwsgi --ini uwsgi.ini
1 个回答
4
WSGI容器需要一个可以调用的函数来运行,它们不会执行你的“主”入口。使用 run:Eve 的时候,你是在要求 uWSGI 在每次请求时执行“run”模块中的“Eve”函数(这显然是错误的)。
把
app = Eve(auth=globalauth.TokenAuth)
移出 __main__
检查,然后告诉 uWSGI 使用“run”模块中的 'app' 可调用函数,方法是:
module = run:app