如何部署简单的 WSGI 应用和常见的 Web 框架
yum install build-essential gcc python-dev python-devel -y
pip 安装uwsgi ( 安装完后,会放在 /etc/uwsgi.ini )
pip3 install uwsgi
安装 uWsgi
1、获取uwsgi;目前最新版本是2.0.11.1
wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
2、编译安装;我是用python 3.6 编译的
tar zxf uwsgi-latest.tar.gz
cd uwsgi-2.0.11.1/
python3 uwsgiconfig.py --build
python3 setup.py install
uwsgi --version
测试uWsgi是否正常
从一个简单的 "Hello World" 开始,当前django项目下创建文件 foobar.py,代码如下
vim /data/website/foobar.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
uWsgi Python 加载器将会搜索的默认函数 application
接下来我们启动 uWsgi 来运行一个 HTTP 服务器,将程序部署在HTTP端口 8088(端口可以自己选择)
uwsgi --http 127.0.0.1:8088 --wsgi-file foobar.py
添加并发和监控
默认情况下,uWsgi 启动一个单一的进程和一个单一的线程。
你可以用 --processes 选项添加更多的进程,或者使用 --threads 选项添加更多的线程 ,也可以两者同时使用
uwsgi --http 127.0.0.1:8088 --wsgi-file foobar.py --master --processes 4 --threads 2
以上命令将会生成 4 个进程, 每个进程有 2 个线程。
如果你要执行监控任务,可以使用 stats 子系统,监控的数据格式是 JSON
uwsgi --http 127.0.0.1:8088 --wsgi-file foobar.py --master --processes 4 --threads 2 --stats 127.0.0.1:8089
我们可以安装 uwsgitop(类似 Linux top 命令) 来查看监控数据
pip3 install uwsgitop
结合 Web 服务器使用
我们可以将 uWsgi 和 Nginx Web 服务器结合使用,实现更高的并发性能。
一个常用的nginx配置如下
vim /usr/local/nginx/conf/nginx.conf
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8088;
}
# uwsgi在Nginx下的配置
cat -n /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name 域名;
location / {
include uwsgi_params; # 包含uwsgi的请求参数
uwsgi_pass uwsgi服务器的ip:port; # 转发请求给uwsgi
uwsgi_read_timeout 2;
}
}
特别注意:uwsgi_params在nginx文件夹下自带,uwsgi_pass一定要跟uwsgi_conf.ini中写的地址完全一致,然后启动nginx,以上代码表示使用 nginx 接收的 Web 请求传递给端口为 8088 的 uWSGI 服务来处理。
ls /etc/nginx/ |grep uwsgi
uwsgi_params
uwsgi_params.default
现在,我们可以生成 uWsgi 来本地使用 uwsgi 协议
uwsgi --socket :8088 --wsgi-file foobar.py --master --processes 4 --threads 2 --stats :8090
如果你的 Web 服务器使用 HTTP,那么你必须告诉 uWsgi 本地使用 http 协议 (这与会自己生成一个代理的–http不同)
uwsgi --http-socket :8088 --wsgi-file foobar.py --master --processes 4 --threads 2 --stats :8090
访问 http://域名:8088
提示:IP地址 : 端口 (IP地址看个人需求 可填指定IP访问,填无是开放IP)
部署 Django
Django 是最常使用的 Python web 框架,假设 Django 项目位于 /data/website/website/:
安装uWsgi地址:
uwsgi --socket 127.0.0.1:8088 --chdir /data/website/website/ --wsgi-file website/test.py --master --processes 4 --threads 2 --stats 127.0.0.1:8089
--chdir 用于指定项目路径
uwsgi.ini 配置文件
# 可以把Django项目,把以上命令弄成一个 uwsgi.ini 配置文件
[uwsgi]
chdir = /data/pythonData01/pythonTest01/
module = pythonTest01.wsgi
home = /data/pythonData01/pythonTest01/venv_data01
processes = 3
pidfile = /data/pythonData01/pythonTest01/uwsgi.pid
socket = 0.0.0.0:8090
master = true
vacuum = true
接下来你只需要执行以下命令即可
# 启动
uwsgi --ini uwsgi.ini
# 重启
uwsgi --reload uwsgi.pid # ini配置文件,需要添加pidfile = ../uwsgi.pid pid文件
# 关闭
uwsgi --stop uwsgi.pid
uwsgi ini 配置
[uwsgi]
# 指定IP端口 // 直接外部访问
http-socket = 0.0.0.0:8080
#项目目录
chdir = /www/wwwroot/web/
#指定项目的application
module = web.wsgi:application
#uwsgi启动用户名和用户组
uid = www
gid = www
#启用主进程
master = true
#指定Socket路径
socket = /www/wwwroot/web/script/uwsgi.sock # //内部访问 权限和nginx一样
socket = 0.0.0.0:8080 # 是用于和Nginx结合部署的unix-socket参数,可以nginx.conf配置下添加这IP地址
# socket权限设置
chmod-socket = 755
#进程个数
processes = 5
pidfile = /www/wwwroot/web/script/uwsgi.pid
#自动移除unix Socket 和 Pid 文件 当服务停止的时候
vacuum = true
#序列化接受的内容,如果可能的话
thunder-lock = true
#启用线程
enable-threads = true
#设置自动中断时间
harakiri = 30
#设置缓冲
post-buffering = 4096
#设置静态文件
static-map = /static=//www/wwwroot/mysite/static
#设置日志目录
daemonize = /www/wwwroot/mysite/uwsgi.log
supervisor管理uWsgi
1、安装supervisor
yum install -y supervisor
2、生成配置
echo_supervisord_conf > ./supervisord.conf
3、修改supervisor的配置文件,添加管理项目的任务
vim ./supervisord.conf
..添加到最下行
[program:pythonTest01]
command=/data/pythonData01/pythonTest01/venv_data01/bin/uwsgi --ini /data/pythonData01/pythonTest01/uwsgi.ini
startsecs=10 # 启动十秒后没有异常退出,表示正常启动。默认是1秒
autostart=true # 在supervisord启动的时候,也会自动启动
autorestart=true # 程序退出后自动重启,可选值:[ unexpected,true,false ],默认为unexpected,表示进程意外杀死后才重启
stopasgroup=true # 默认为 false 进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=true # 默认为 false ,向进程组发送 kill 信号,包括子进程
4、启动,默认就会直接启动uWsgi
supervisord -c ./supervisord.conf
5、检查进程supervisor信息
(venv_data01) [root@node01 pythonTest01]# ps -ef|grep supervisor
root 2400 1 0 11:56 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -c ./supervisord.conf
root 2418 32428 0 11:56 pts/0 00:00:00 grep --color=auto supervisor
(venv_data01) [root@node01 pythonTest01]# ps -ef|grep uwsgi
root 2401 2400 0 11:56 ? 00:00:00 /data/pythonData01/pythonTest01/venv_data01/bin/uwsgi --ini /data/pythonData01/pythonTest01/uwsgi.ini
root 2403 2401 0 11:56 ? 00:00:00 /data/pythonData01/pythonTest01/venv_data01/bin/uwsgi --ini /data/pythonData01/pythonTest01/uwsgi.ini
root 2404 2401 0 11:56 ? 00:00:00 /data/pythonData01/pythonTest01/venv_data01/bin/uwsgi --ini /data/pythonData01/pythonTest01/uwsgi.ini
root 2405 2401 0 11:56 ? 00:00:00 /data/pythonData01/pythonTest01/venv_data01/bin/uwsgi --ini /data/pythonData01/pythonTest01/uwsgi.ini
root 2425 32428 0 11:57 pts/0 00:00:00 grep --color=auto uwsgi
6、进度supervisor任务管理终端
# 进supervisor终端里面
(venv_data01) [root@node01 pythonTest01]# supervisorctl -c ./supervisord.conf
pythonTest01 RUNNING pid 2401, uptime 0:20:33
supervisor>
status # 查看进程运行状态
start # 进程名 启动进程
stop # 进程名 关闭进程
restart # 进程名 重启进程
update # 重新载入配置文件
shutdown # 关闭supervisord
clear # 进程名 清空进程日志
7、supervisor的客户端部分命令:
# 不进supervisor终端里面,使用命令
supervisorctl status 查看进程运行状态
supervisorctl start 进程名 启动进程
supervisorctl stop 进程名 关闭进程
supervisorctl restart 进程名 重启进程
supervisorctl update 重新载入配置文件
supervisorctl shutdown 关闭supervisord
supervisorctl clear 进程名 清空进程日志
supervisorctl 进入到交互模式下。使用help查看所有命令
start stop restart + all 表示启动,关闭,重启所有进程