前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nginx uwsgi supervisor 服务部署

nginx uwsgi supervisor 服务部署

原创
作者头像
qq606633
修改2023-11-30 17:37:35
2900
修改2023-11-30 17:37:35
举报

一、环境

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、环境
  • 二、注意事项
  • 三、supervisor
  • 四、3者的配置样例
    • 1、flask应用样例
      • 2、uwsgi
        • 3、supervisor
          • 4、nginx
            • 后记
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档