nginx uwsgi supervisor 服务部署

一、环境

推荐uwsgi在虚拟环境里安装,

二、注意事项

uwsgi 配置绑定在socket协议时,在浏览器是打不开的,要通过代理转发接入

所以根据运行协议,部署有2种方式

1、uwsgi 绑定在http协议,此时uwsgi直接当作web服务器;

2、uwsgi 绑定在socket协议,需要使用nginx代理接入;

细说来有三种协议,

http :独立部署;

http-socket :webserver不支持uwsgi时;

socket: webserver支持uwsgi协议;

三、supervisor

主要作用是方便管理uwsgi应用,及时监控、拉起服务,特别是应用数量不止1个的时候

四、3者的配置样例

1、flask应用样例

代码语言:javascript
复制
# f.py
from flask import Flask, request, abort
from flask import Blueprint, render_template

app = Flask(name)
f = Blueprint('f', name, url_prefix='/f')

@f.route('/')
def hello_world():
return 'hello world'

@f.route('/test')
def helloTest():
return 'hello test'

app.register_blueprint(f)

在测试时使用python f.py直接运行, 在uwsgi部署不需要这几行

#if name == 'main':
# 在开发模式下运行应用

app.run(host='0.0.0.0',port=8080, debug=True)

2、uwsgi

/root/myapp.ini

a、uwsgi单独部署时的配置

代码语言:javascript
复制
[uwsgi]

uid=root
gid=root

#启用主进程
master = true

处理器数 工作进程的数量

processes = 1

#启用线程
enable-threads = true

线程数

threads = 1

pidfile = /root/f.pid

#当服务器退出的时候自动删除unix socket文件和pid文件
vacuum = true

uwsgi 启动时所使用的地址与端口,也可以使用.sock文件的方式

http = 0.0.0.0:8080

指向网站目录

chdir = /root/python/project1

python 启动程序文件

wsgi-file = f.py

python 程序内用以启动的 application 变量名

callable = app

#状态检测地址
stats = 0.0.0.0:8081

buffer-size = 65536

#项目flask日志文件, 一般使用 daemonize
#logto = run.log

#使进程在后台运行,并将日志打到指定的日志文件或者udp服务器
daemonize = run.log

b、使用supervisor调度的配置:

代码语言:javascript
复制
[uwsgi]
uid=root
gid=root

#启用主进程
master = true

处理器数 工作进程的数量

processes = 1

#启用线程
enable-threads = true

线程数

threads = 1

pidfile = /root/f.pid

#当服务器退出的时候自动删除unix socket文件和pid文件
vacuum = true

uwsgi 启动时所使用的地址与端口,也可以使用.sock文件的方式

socket = 0.0.0.0:8080

#状态检测地址
stats = 0.0.0.0:8081

指向网站目录

chdir = /root/python/project1

python 程序内用以启动的 application 变量名

callable = app

64K

buffer-size = 65536

mount=/f=f.py
manager-script-nmae=true

3、supervisor

放在 /etc/supervisor/conf.d/myapp.conf 目录下就可以注册成supervisor管理的服务

代码语言:javascript
复制
# myapp.conf
[program:myapp]

myapp在管理任务时使用的名字: supervisorctl start myapp

启动命令入口

command=/root/.virtualenvs/uwsgi --ini /root/myapp.ini

命令程序所在目录

directory=/root/python/project1
#运行命令的用户名
user=root

进程名称

#process_name=myapp

#pidfile=%(program_name).pid

# 日志级别,默认info

loglevel = info

# 把stderr输入到stdout文件上

redirect_stderr=true

autostart=true
autorestart=true
#日志地址
stdout_logfile=/root/run.log

每文件最大100MB,默认是50MB

stdout_logfile_maxbytes=10MB

# 文件存10份

stdout_logfile_backups=10

# 每文件最大100MB,超出存到新文件

stdout_capture_maxbytes=10MB

4、nginx

代码语言:javascript
复制
 location ^~ /f/ {
include uwsgi_params;
uwsgi_pass 0.0.0.0:8080;
}

uwsgi_pass 结尾不能加/, 这里访问nginx的 xxxx/f 会把 /f 带到uwsgi里去,参考应用里加的前缀。如果应用程序里不加前缀,转发到uwsgi应用的请求会404

代码语言:javascript
复制
f = Blueprint('f', name, url_prefix='/f')

有些做法在nginx里还写 UWSGI_PYHONE 、UWSGI_CHDIR、 UWSGI_SCRIPT 这些选项,如

代码语言:javascript
复制

location ^~ /f/ {
include uwsgi_params;
uwsgi_pass 0.0.0.0:8080;
uwsgi_param UWSGI_PYHONE /a;
uwsgi_param UWSGI_CHDIR /a;
uwsgi_param UWSGI_SCRIPT xx:app;
}

我觉得十分不好,代理就干代理的事,别管应用的配置,写上就交叉混乱了,

一些命令:

开启关闭全部supervisor服务

supervisorctl start all

supervisorctl stop all

只开启关闭myapp supervisor服务

supervisorctl start myapp

supervisorctl stop myapp

后记

简化一点 ng + uwsgi , uwsgi 使用socket 或者http协议都行, 转发时不同写法