nginx uwsgi supervisor 服务部署

2023-11-30 17:37:35 浏览数 (3)

一、环境

推荐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协议都行, 转发时不同写法

0 人点赞