ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

uWSGI和Gunicorn对比实践笔记--()

2021-10-19 18:03:49  阅读:265  来源: 互联网

标签:supervisor gunicorn nginx -- wepub uwsgi uWSGI Gunicorn


uWSGI 一直没安装成功

gunicorn + supervisor 使用美滋滋

uWSGI和Gunicorn对比实践笔记

Hallucigenia Hallucigenia bbyy.io  
从flask微信公众号后台分析
Ubuntu+Python3+pipenv+flask环境下 uWSGI/Gunicorn+supervisor+nginx配置问题

这里的示例程序代码接上篇使用Flask创建微信公众号

在服务器能正常通信后,Werkzeug提供的的WSGI并不适合生产环境,调试完代码第一件事就找个独立WSGI容器。我们这里选择uWSGI和gunicorn,相对来说这两个比gevent更适合大型项目,uWSGI出现的比较早,gunicorn是从Ruby的unicorn移植而来,配置也简单。为了熟悉uwsgi我都尝试一下吧

uWSGI配置

这里我们先配置uwsgi,或者使用gunicorn,这两个任选其一。 如果是新浪SAE的话记得删除app.run()里的port,并且以下所有端口都是5050。

$ pipenv install uwsgi

然后运行

$ uwsgi --socket 0.0.0.0:5000 -w main:app

可以加上--protocol=http以指定协议,我们的项目启动文件名为main.py对应修改即可,运行http://server_domain_or_IP:5000倘若能看到我们在视图函数写的Hello World!即可。 如果开了防火墙莫忘了开启端口,以Ubuntu的ufw为例:

$ sudo ufw allow 5000

到此,可以到项目根目录创建配置文件wepub_uwsgi.ini,这里名字随意。

wepub_uwsgi.ini:

[uwsgi]
module = main:app
#用以启动程序名
master = true
processes = 4
#子进程数量
chdir = /root/WePub/wepub
#python启动程序目录
socket = /root/WePub/wepub/wepub_uwsgi.sock
#uwsgi 启动后所需要创建的文件,和 Nginx 通信,配置 Nginx 时用
logto = /root/WePub/wepub/%n.log
chmod-socket = 660
#赋予 .sock 文件权限与 Nginx 通信
vacuum = true
http = 0.0.0.0:5050
#http地址和端口

保存后运行:

$ uwsgi --ini wepub_uwsgi.ini

此时运行时会在设置的目录生成与配置文件同名的.sock文件,先不要关闭,等配置好Nginx后方可关闭确认后跳过gunicorn章节,即配置Nginx。

gunicorn配置

个人偏好于gunicorn,用的比较多了,至于区别,gunicorn比较好部署理解,性能上的短板还在我身上,安装gunicorn

$ pipenv install gunicorn

运行

$ gunicorn -w 4 -b 0.0.0.0:8000 main:app

其中-w 是--workers是定义同步worker的数量,--bind为主机地址和端口,不用异步的话这就够了 gunicorn的配置文件还能实现复杂的配置,目前学有不精,先不做讨论

uWSGI配置nginx

nginx反向代理使用比较多了,流程都比较一致,这里就简洁带过吧

$ sudo apt install nginx

这里我们先把nginx的配置文件找个位置备份好

$ mv /etc/nginx/sites-enabled/default ~/nginx.backup

而后直接定义server块,listen监听80端口 (新浪SAE为5050端口)

$ vi /etc/nginx/sites-enabled/wepub

wepub:

server {
    listen  80;
    server_name _;

    location / {
    include      uwsgi_params;
    uwsgi_pass unix:/root/WePub/wepub/wepub_uwsgi.sock;
    }
}

server_name可以指定HOST域名解析后的公网地址,这里默认用的是通配符 这里是最简配置,定义日志存放重写请求头部这些,有机会再详细说明吧 如果项目有静态文件的话,设置路径与过期时间

location /static {
    alias /the/path/to/staitic;
    expires 30d;
}

保存退出,最后 sudo nginx -t 检查语法错误,期待返回

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

有错误的话检查一下,而后重启nginx使配置生效

$ sudo service nginx restart

gunicorn配置nginx

只是配置文件不同

wepub:

server {
    listen 80;
    server_name example.org;


    location / {
    proxy_pass http://127.0.0.1:8000; #转发gunicorn运行地址
    }
 }

location 只需要直接转发gunicorn运行地址即可运行,这里是最简配置,成功后直接80地址即可访问服务器

 

反向代理部分:

 

    location / {
        proxy_pass         http://localhost:8000/; #gunicorn 运行地址
        proxy_redirect     off;

        proxy_set_header   Host             $http_host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }

 

管理uWSGI进程:

这里的差别主要就各自的命令而已,就放在一起说吧 对于uWSGI来说,uWSGI服务与nginx通信时依赖于sock文件,网站运行时无法关闭,始终不可靠,这里我们利用Supervisor管理并监控uWSGI的进程,

$ sudo apt install supervisor

这里我们不更改全局配置,为我们的程序单独创建配置文件

$ sudo vi /etc/supervisor/conf.d/wepub.conf

wepub.conf:

[program:wepub]
command = pipenv run uwsgi /root/WePub/wepub/wepub_uwsgi.ini ;监控uWSGI
# command=pipenv run gunicorn -w 4 main:app       监控Gunicorn
directory=/root/WePub/wepub                    ;程序目录
user=root                    ; 程序启动用户,最好不要用root
autostart=true                 ; 随supervisor启动而启动
autorestart=true              ; 自动重启
stopasgroup=true           ; 关闭程序时关闭子进程
killasgroup=true             ; 杀死程序时杀死子进程
stderr_logfile=/root/WePub/wepub/err.log   ;错误日志文件
stdout_logfile=/root/WePub/wepub/out.log  ;程序日志文件
stopsignal=INT          ; 杀死进程的自定信号
startretries=10               ; 启动失败时的重试次数

[supervisord]

我们:wq保存后检查配置文件是否正确:

$ supervisord -c /path/to/my/config.conf

返回的错误信息挺详细的,根据问题修改即可。确认无返回的时候重启supervisor

$ sudo service supervisor restart

如果运行过程中出现错误,可以查看supervisor的错误日志。也可以在supervisorctl命令行中进行查看与操作程序,也可以开启9001浏览器访问。


浏览器输入Nginx显示502badway,一般这时候是防火墙没打开或者sock文件位置有误

提示unix:///var/run/supervisor.sock no such file除了supervisor安装问题之外, 一般来说是指定位置或者和权限的问题

[unix_http_server]
file=/var/run/supervisor.sock   ; (socket 文件位置)
chmod=0700                       ; sockef file mode (default 0700)

如果是提示编码出错还需解决pipenv的编码问题

$ sudo vi /etc/supervisor/supervisord.conf

在[supervisord]的最后添加环境设置:

environment=LC_ALL='zh_CN.UTF-8', LANG='zh_CN.UTF-8'
  • 不知道新浪SAE怎么搞得非要debian系限定的C.UTF-8,我想这并不是个好办法
  environment=LC_ALL='C.UTF-8', LANG='C.UTF-8'
 

至此应该能得到一个还算稳定安全的部署程序了,应该足以应对个人微信公众号这些并发不高无需协程的了。 关于每个部分的详细设置都有很多,还是详细阅读文档吧。这里如果遇到什么问题的话还请指教

 

https://zhuanlan.zhihu.com/p/50857407  

 

标签:supervisor,gunicorn,nginx,--,wepub,uwsgi,uWSGI,Gunicorn
来源: https://www.cnblogs.com/akxmhd/p/15425793.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有