阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

快速部署Python应用:Nginx+uWSGI配置详解

401次阅读
没有评论

共计 5007 个字符,预计需要花费 13 分钟才能阅读完成。

在 PHP 里,最方便的就是 deployment 了,只要把 php 文件丢到支持 PHP 的路径里面,然后访问那个路径就能使用了;无论给主机添加多少 PHP 应用,只要把目录改好就没你的事了,完全不用关心 php-cgi 运行得如何,deployment 极为方便。

反观 Python,部属起来真是头痛,常见的部署方法有:

◆fcgi:用 spawn-fcgi 或者框架自带的工具对各个 project 分别生成监听进程,然后和 http 服务互动。

◆wsgi:利用 http 服务的 mod_wsgi 模块来跑各个 project。

无论哪种都很麻烦,apache 的 mod_wsgi 配置起来很麻烦,内存占用还大,如果要加上 nginx 作为静态页面的服务器那就更麻烦了;我的应用基本上到后来都是是各个 project 各自为战,且不说管理上的混乱,这样对负载也是不利的,空闲的 project 和繁忙的 project 同样需要占用内存。

如果 Python 中能有个什么东西像 php-cgi 一样监听同一端口,进行统一管理和负载平衡,那真是能省下大量的部署功夫。偶然看到了 uWSGI,才发现居然一直不知道有那么方便地统一部署工具。uWSGI,既不用 wsgi 协议也不用 fcgi 协议,而是自创了一个 uwsgi 的协议,据说该协议大约是 fcgi 协议的 10 倍那么快,有个比较见下图:

快速部署 Python 应用:Nginx+uWSGI 配置详解

uWSGI 的主要特点如下:

◆超快的性能。

◆低内存占用(实测为 apache2 的 mod_wsgi 的一半左右)。

◆多 app 管理。

◆详尽的日志功能(可以用来分析 app 性能和瓶颈)。

◆高度可定制(内存大小限制,服务一定次数后重启等)。

正式开工

uwsgi 的文档虽然很多也很详细,这里是 uwsgi 的官方文档:http://projects.unbit.it/uwsgi/wiki/Doc

1. 安装 uwsgi

Ubuntu 有 uwsgi 的 ppa:

  1. add-apt-repository ppa:stevecrozz/ppa  
  2. apt-get update  
  3. apt-get install uwsgi 

2. 用 uwsgi 代替 mod_wsgi

Nginx 的整体配置说来话长,这里不再多说,假设已经明白 Nginx 的基本配置,那么 uwsgi 就类似这么配置:

  1. location / {
  2.   include uwsgi_params  
  3.   uwsgi_pass 127.0.0.1:9090  

这就是把所有 url 传给 9090 端口的 uwsgi 协议程序来互动。再到 project 目录建立 myapp.py,使得 application 调用框架的 wsgi 接口,比如 web.py 就是:

  1. ……  
  2. app = web.application(urls, globals())  
  3. appapplication = app.wsgifunc() 

再比如 django 就是:

  1. …….  
  2. from django.core.handlers.wsgi import WSGIHandler  
  3. application = WSGIHandler() 

然后运行 uwsgi 监听 9090,其中 - w 后跟模块名,也就是刚才配置的 myapp

  1. uwsgi -s :9090 -w myapp 

运行网站发现已经部署完成了。

3.uwsgi 的参数

以上是单个 project 的最简单化部署,uwsgi 还是有很多令人称赞的功能的,例如:

并发 4 个线程:

  1. uwsgi -s :9090 -w myapp -p 4 

主控制线程 + 4 个线程:

  1. uwsgi -s :9090 -w myapp -M -p 4 

执行超过 30 秒的 client 直接放弃:

  1. uwsgi -s :9090 -w myapp -M -p 4 -t 30 

限制内存空间 128M:

  1. uwsgi -s :9090 -w myapp -M -p 4 -t 30 –limit-as 128 

服务超过 10000 个 req 自动 respawn:

  1. uwsgi -s :9090 -w myapp -M -p 4 -t 30 –limit-as 128 -R 10000 

后台运行等:

  1. uwsgi -s :9090 -w myapp -M -p 4 -t 30 –limit-as 128 -R 10000 -d uwsgi.log 

4. 为 uwsgi 配置多个站点

为了让多个站点共享一个 uwsgi 服务,必须把 uwsgi 运行成虚拟站点:去掉“-w myapp”加上”–vhost”:

  1. uwsgi -s :9090 -M -p 4 -t 30 –limit-as 128 -R 10000 -d uwsgi.log –vhost 

然后必须配置 virtualenv,virtualenv 是 Python 的一个很有用的虚拟环境工具,这样安装:

  1. apt-get install Python-setuptools  
  2. easy_install virtualenv 

然后设置一个 / 多个 app 基准环境:

  1. virtualenv /var/www/myenv 

应用环境,在此环境下安装的软件仅在此环境下有效:

  1. source /var/www/myenv/bin/activate  
  2. pip install django  
  3. pip install mako  
  4. … 

最后配置 nginx,注意每个站点必须单独占用一个 server,同一 server 不同 location 定向到不同的应用不知为何总是失败,估计也算是一个 bug。

  1. server {
  2.         listen       80;  
  3.         server_name  app1.mydomain.com;  
  4.         location / {
  5.                 include uwsgi_params;  
  6.                 uwsgi_pass 127.0.0.1:9090;  
  7.                 uwsgi_param UWSGI_PYHOME /var/www/myenv;  
  8.                 uwsgi_param UWSGI_SCRIPT myapp1;  
  9.                 uwsgi_param UWSGI_CHDIR /var/www/myappdir1;  
  10.         }  
  11.     }  
  12.     server {
  13.         listen       80;  
  14.         server_name  app2.mydomain.com;  
  15.         location / {
  16.                 include uwsgi_params;  
  17.                 uwsgi_pass 127.0.0.1:9090;  
  18.                 uwsgi_param UWSGI_PYHOME /var/www/myenv;  
  19.                 uwsgi_param UWSGI_SCRIPT myapp2;  
  20.                 uwsgi_param UWSGI_CHDIR /var/www/myappdir2;  
  21.         }  
  22.     } 

这样,重启 nginx 服务,两个站点就可以共用一个 uwsgi 服务了。

5. 实战应用

最初的设置完毕以后,再添加的应用,只需要在 Nginx 里面进行少量修改,无需重启 uwsgi,就能立刻部署完毕。uwsgi 自带了基于 django 的监控 uwsgi 运行状态的工具,就拿它来部署好了:

  1. server {
  2.     listen 80;  
  3.     root   /var/www/django1.23;  
  4.     index  index.html index.htm;  
  5.     server_name uwsgiadmin.django.obmem.info;  
  6.     access_log  /var/log/nginx/django.access.log;  
  7.     location /media/ {
  8.         root /var/www/django1.23/adminmedia;  
  9.         rewrite ^/media/(.*)$ /$1 break;  
  10.     }  
  11.     location / {
  12.         include uwsgi_params;  
  13.         uwsgi_pass 127.0.0.1:9090;  
  14.         uwsgi_param UWSGI_PYHOME /var/www/django1.23/vtenv;  
  15.         uwsgi_param UWSGI_CHDIR /var/www/django1.23/uwsgiadmin;  
  16.         uwsgi_param UWSGI_SCRIPT uwsgiadmin_wsgi;  
  17.     }  

于是 uwsgi 的监控信息可以在 http://uwsgiadmin.django.obmem.info 看到(用户名密码都是 admin)。再比如 LBForum 论坛程序的部署:根据安装说明安装完���,再按部署说明修改完配置文件,然后只需修改 nginx 配置文件:

  1. server {
  2.     listen 80;  
  3.     root   /var/www/django1.23;  
  4.     index  index.html index.htm;  
  5.     server_name lbforum.django.obmem.info;  
  6.     access_log  /var/log/nginx/django.access.log;  
  7.     location / {
  8.         include uwsgi_params;  
  9.         uwsgi_pass 127.0.0.1:9090;  
  10.         uwsgi_param UWSGI_PYHOME /var/www/django1.23/vtenv;  
  11.         uwsgi_param UWSGI_CHDIR /var/www/django1.23/LBForum/sites/default;  
  12.         uwsgi_param UWSGI_SCRIPT lbforum_wsgi;  
  13.     }  

于是 http://lbforum.django.obmem.info 就是论坛程序了。

后记

虽然写出来寥寥几行,配置的时候我可吃尽了 uwsgi 的苦头,有些想当然的用法完全不能成立,–no-site 参数一加上去其他都好使 LBForum 怎么都部署不了,一开始多站点公用 uwsgi 怎么都成功不了等等。

Python 世界很有趣,一直会发现有趣的东西,但是 Python 世界也很折腾人,大部分东西都是 dev 版本,文档缺失,各种兼容问题。

更多参考

Nginx+uWSGI+Supervisor 在 Ubuntu 上部署 Flask 应用  http://www.linuxidc.com/Linux/2016-07/133064.htm

Ubuntu Server 12.04 安装 Nginx+uWSGI+Django 环境 http://www.linuxidc.com/Linux/2012-05/60639.htm 

Django+Nginx+uWSGI 部署 http://www.linuxidc.com/Linux/2013-02/79862.htm 

Nginx+uWSGI+Django+Python 应用架构部署  http://www.linuxidc.com/Linux/2015-10/124183.htm

Ubuntu Server 14.04.2 LTS 配置 Nginx + Uwsgi + Django  http://www.linuxidc.com/Linux/2015-04/116397.htm

Flask+uWSGI+Nginx+Ubuntu 部署教程 http://www.linuxidc.com/Linux/2016-06/132690.htm

Ubuntu 16.04 下安装部署 Nginx+uWSGI+Django1.9.7  http://www.linuxidc.com/Linux/2016-07/133484.htm

Nginx+uWSGI+Django 在 Ubuntu 下的部署  http://www.linuxidc.com/Linux/2016-07/133490.htm

Linux 上利用 Nginx 代理 uWSGI 处理 Flask Web 应用  http://www.linuxidc.com/Linux/2016-08/134164.htm

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-12/137830.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计5007字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19350
评论数
4
阅读量
7961392
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
【1024程序员】我劝你赶紧去免费领一个AWS、华为云等的主机

【1024程序员】我劝你赶紧去免费领一个AWS、华为云等的主机

【1024 程序员】我劝你赶紧去免费领一个 AWS、华为云等的主机 每年 10 月 24 日,程序员们都会迎来...
星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定! 前言 作为 NAS 玩家,你是否总被这些...
星哥带你玩飞牛NAS硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话?

星哥带你玩飞牛NAS硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话?

星哥带你玩飞牛 NAS 硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话? 前言 在选择 NAS 用预...
仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

还在忍受动辄数百兆的“全家桶”监控软件?后台偷占资源、界面杂乱冗余,想查个 CPU 温度都要层层点选? 今天给...
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...
浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍 前言 在 AI 自动化快速发展的当下,浏览器早已不再只是...
240 元左右!五盘位 NAS主机,7 代U硬解4K稳如狗,拓展性碾压同价位

240 元左右!五盘位 NAS主机,7 代U硬解4K稳如狗,拓展性碾压同价位

  240 元左右!五盘位 NAS 主机,7 代 U 硬解 4K 稳如狗,拓展性碾压同价位 在 NA...
恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击 PHP-FPM(FastCGl Process M...
让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级 大家好,我是星哥,之前写了一篇文章 自己手撸一...