文章目录
安装
pip install uwsgi
最小示范
Nginx配置
# 服务器IP 192.168.44.128
# /etc/nginx/sites-enabled/default
server {
listen 80;
access_log /var/log/mysite_access_log;
location / {
uwsgi_pass 127.0.0.1:9000;
include uwsgi_params;
}
}
uWSGI命令行
wsgi文件方式
uwsgi -s :9000 --wsgi-file wsgi.py
# coding=utf-8
# pip install flask
# wsgi.py
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def index():
_hreaders_list = map(lambda x: '%s: %s' % (x, request.headers[x]), request.headers.keys())
ret = '<p>' + '</p><p>'.join(_hreaders_list) + '</p>' + u'<p>请求的URL: %s</p>' % request.url
return ret
@app.route('/err')
def err_500():
1/0
return 'err'
application = app
wsgi模块方式
# 目录结构
.
├── uwsgi 工作目录
├── wsgi.py
├── app
│ └── __init__.py
# uWSGI模块 python
uwsgi -s :9000 --wsgi app
uwsgi -s :9000 --module app
# --wsgi和--module方式可以缩写为 -w
uwsgi -s :9000 -w app
# 可以指定application
uwsgi -s :9000 -w app:app
# coding=utf-8
# pip install flask
# __init__.py
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def index():
_hreaders_list = map(lambda x: '%s: %s' % (x, request.headers[x]), request.headers.keys())
ret = '<p>' + '</p><p>'.join(_hreaders_list) + '</p>' + u'<p>请求的URL: %s</p>' % request.url
return ret
@app.route('/err')
def err_500():
1/0
return 'err'
结果
一些有用的配置参数
Nginx与uwsgi通讯方式选择
参考
https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/Options.html
模块uWSGI core
常用方式
- http-socket
- socket / uwsgi-socket (快捷方式 -s)
# 对应Nginx配置
# uwsgi_pass 127.0.0.1:9000;
uwsgi --http-socket :9000 --wsgi-file wsgi.py
# 对应Nginx配置
# uwsgi_pass 127.0.0.1:9000;
uwsgi -s :9000 --wsgi-file wsgi.py
# 对应Nginx配置
# uwsgi_pass unix:///tmp/uwsgi.sock;
# uwsgi -s unix:///tmp/uwsgi.sock --wsgi-file wsgi.py 无法创建,Nginx 502
uwsgi -s /tmp/uwsgi.sock --wsgi-file wsgi.py
# /tmp/uwsgi.sock 权限配置, 如果uwsgi的UID和GID和nginx不一致,需要更改权限
uwsgi -s /tmp/uwsgi.sock --wsgi-file wsgi.py --chmod-socket=666
# 或者切换用户,假设nginx是以www-data:www-data身份运行
uwsgi -s /tmp/uwsgi.sock --wsgi-file wsgi.py --uid www-data --gid www-data
其他方式
不太清楚使用方法,请参考文档和资料
命令行daemon后台执行
uwsgi -s :9000 --daemonize ./uwsgi.log --wsgi-file wsgi.py
# --daemonize 可以缩写为 -d
uwsgi -s :9000 -d ./uwsgi.log --wsgi-file wsgi.py
输出日志文件
详细参考 https://uwsgi-docs.readthedocs.io/en/latest/Logging.html
以下为部分测试结果
# --daemonize可以配置日志输出 (--daemonize可以缩写为 -d)
uwsgi -s :9000 -d ./uwsgi.log --wsgi-file wsgi.py
# --logto / --logto2
uwsgi -s :9000 --wsgi-file wsgi.py --logto ./uwsgi.log
# 同时使用未测试
测试错误日志
[2019-04-05 10:40:41,018] ERROR in app: Exception on /err [GET]
Traceback (most recent call last):
File "/home/wang/.local/lib/python2.7/site-packages/flask/app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "/home/wang/.local/lib/python2.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/wang/.local/lib/python2.7/site-packages/flask/app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/wang/.local/lib/python2.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "/home/wang/.local/lib/python2.7/site-packages/flask/app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "r.py", line 17, in err_500
1/0
ZeroDivisionError: integer division or modulo by zero
修改文件后自动重载
# --touch-reload <filename>
uwsgi -s :9000 -d ./uwsgi.log --wsgi-file wsgi.py --touch-reload wsgi.py
# 假如修改了app中其他代码后, touch 一下 <filename> 即可重新加载
touch wsgi.py
进程ID
# --pidfile
uwsgi -s :9000 -d ./uwsgi.log --wsgi-file wsgi.py --pidfile uwsgi.pid
# 有用的命令
kill `cat uwsgi.pid`
uwsgi --reload uwsgi.pid
uwsgi --stop uwsgi.pid
切换运行目录
# --chdir
uwsgi -s :9000 --wsgi-file wsgi.py --chdir /app工作目录
允许应用中启动线程
# --enable-threads
uwsgi -s :9000 --wsgi-file wsgi.py --enable-threads
虚拟环境
# --home --virtualenv --venv --pyhome 都行
# 快捷方式为 -H
uwsgi -s :9000 --wsgi-file wsgi.py -H /venv_path
写入参数到配置文件
uwsgi --ini uwsgi.ini
[uwsgi]
# 以下参数大部分可选
socket = :9000
daemonize = /路径/uwsgi.log
wsgi-file = wsgi.py
# wsgi = app_package_name:application_name
# module = app_package_name:application_name
pidfile = /路径/uwsgi.pid
touch_reload = /路径/指定的文件
chdir = /app工作目录
master = true
processes = 4
enable-threads = true
# 配置虚拟环境 home virtualenv venv pyhome
home = /venv_path
master进程模式
当运行在 master 进程模式下时,uWSGI服务器可以在无需关闭主socket的情况下优雅地重启。
这个功能允许你在无需关闭与web服务器的连接以及丢失请求的情况下修补/更新uWSGI服务器。
详细介绍
https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/Management.html
# --master 缩写 -M (M大写)
uwsgi -s :9000 --wsgi-file wsgi.py -M
uwsgi -s :9000 --wsgi-file wsgi.py --master
开机自动启动
/etcrc.lcoal
编辑 /etc/rc.local 然后在”exit 0”行前添加:
# /home/leo/.local/bin/uwsgi
# locate uwsgi
# whereis uwsgi
# 参数更具可选添加
/home/leo/.local/bin/uwsgi -s :9000 -w app:app -d /日志文件路径
# 或者
/home/leo/.local/bin/uwsgi --ini /ini配置文件路径
upstart
systemd
其他