Nginx配置 - uWSGI - Python应用

安装

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

其他

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值