侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

详解python使用Nginx和uWSGI来运行Python应用

Python  /  管理员 发布于 7年前   249

uWSGI是一个Web应用服务器,它具有应用服务器,代理,进程管理及应用监控等功能。它支持WSGI协议,同时它也支持自有的uWSGI协议,该协议据说性能非常高,而且内存占用率低,为mod_wsgi的一半左右,我没有实测过。它还支持多应用的管理及应用的性能监控。虽然uWSGI本身就可以直接用来当Web服务器,但一般建议将其作为应用服务器配合Nginx一起使用,这样可以更好的发挥Nginx在Web端的强大功能。本文我们就来介绍如何搭建uWSGI+Ngnix环境来运行Python应用。

安装uWSGI

pip install uwsgi

让我们来写个Hello World的WSGI应用,并保存在”server.py”文件中:

def application(environ, start_response):  status = '200 OK'  output = 'Hello World!'   response_headers = [('Content-type', 'text/plain'),('Content-Length', str(len(output)))]  start_response(status, response_headers)   return [output]

让我们在uWSGI中运行它,执行命令:

uwsgi --http :9090 --wsgi-file server.py

然后打开浏览器,访问”http://localhost:9090″,你就可以看到”Hello World!”字样了。

上面的命令中”- -http”参数指定了HTTP监听地址和端口,”- -wsgi-file”参数指定了WSGI应用程序入口,uWSGI会自动搜寻名为”application”的应用对象并调用它。

更进一步,uWSGI可以支持多进程和多线程的方式启动应用,也可以监控应用的运行状态。我们将启动的命令改为:

复制代码 代码如下:
$ uwsgi --http :9090 --wsgi-file server.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191

执行它后,uWSGI将启动4个应用进程,每个进程有2个线程,和一个master主进程(监控其他进程状态,如果有进程死了,则重启)。同时,你可以访问”127.0.0.1:9191″来获取JSON格式的应用运行信息,uWSGI还提供了工具命令”uwsgitop”来像top一样监控应用运行状态,你可以用pip来安装它。

上面的命令参数太多了,我们可以将参数写在配置文件里,启动uWSGI时指定配置文件即可。配置文件可以是键值对的格式,也可以是XML,YAML格式,这里我们使用键值对的格式。让我们创建一个配置文件”myapp.ini”:

[uwsgi]http=:9090wsgi-file=server.pymaster=trueprocesses=4threads=2stats=127.0.0.1:9191

然后就可以将启动命令简化为:

$ uwsgi myapp.ini

配置Nginx

Nginx的安装可以参考这篇文章,文本采用的环境就是Ubuntu Linux,对于其他系统如Mac,基本上差不太多

首先,我们将uWSGI的HTTP端口监听改为socket端口监听,即将配置文件中的”http”项去掉,改为”socket”项:

[uwsgi]socket=127.0.0.1:3031wsgi-file=server.pymaster=trueprocesses=4threads=2stats=127.0.0.1:9191

然后,打开Nginx的配置文件,Ubuntu上默认是”/etc/nginx/sites-enabled/default”文件,将其中的根路径部分配置为:

location / {  include uwsgi_params;  uwsgi_pass 127.0.0.1:3031;}

这段配置表明Nginx会将收到的所有请求都转发到”127.0.0.1:3031″端口上,即uWSGI服务器上。现在让我们重启Nginx,并启动uWSGI服务器:

$ sudo service nginx restart$ uwsgi myapp.ini

访问”http://localhost”,我们会再次看到”Hello World!”。

运行Flask应用

其实很简单,只要将上例中server.py的内容改为Flask应用即可,当然你需要先把Flask包安装好:

from flask import Flaskapplication = Flask(__name__) @application.route('/')def index():  return '<h1>Hello World</h1>'

很多人习惯将Flask应用对象取名为”app”,但是WSGI标准是”application”。uWSGI提供了一个功能,可以指定应用对象,方法就是在配置文件中加上”callable”项:

[uwsgi]...callable=app

现在,我们的Flask应用就可以使用”app”作为对象名了

from flask import Flaskapp = Flask(__name__) @app.route('/')def index():  return '<h1>Hello World</h1>'

使用Python虚拟环境

我们永远都是建议采用虚拟环境来避免应用间冲突,uWSGI可以非常容易做到这点,就是在配置文件中加上”virtualenv”项:

[uwsgi]...virtualenv=/home/bjhee/virtualenv

部署多个应用

 一个Nginx中,可以同时运行多个应用,不一定是Python的应用。我们期望通过不同的路径来路由不同的应用,因此就不能像上例那样直接修改根目录的配置。假设我们希望通过”http://localhost/myapp”来访问我们的应用,首先要在Nginx的配置文件中,加入下面的内容:

location /myapp {  include uwsgi_params;  uwsgi_param SCRIPT_NAME /myapp;  uwsgi_pass 127.0.0.1:3031;}

这里我们定义了一个uWSGI参数”SCRIPT_NAME”,值为应用的路径”/myapp”。接下来,在uWSGI的启动配置中,去掉”wsgi-file”项,并加上:

[uwsgi]...mount=/myapp=server.pymanage-script-name=true

“mount”参数表示将”/myapp”地址路由到”server.py”中,”manage-script-name”参数表示启用之前在Nginx里配置的”SCRIPT_NAME”参数。再次重启Nginx和uWSGI,你就可以通过”http://localhost/myapp”来访问应用了。

补充内容

上面的所有例子中,我们是通过”127.0.0.1:3031″Socket端口来连接Nginx和uWSGI的,其实我们也可以采用socket文件的方式,这样可以不用写死端口。在uWSGI的启动配置中,我们要修改”socket”项:

[uwsgi]socket=/tmp/uwsgi.sock...

启动uWSGI服务器后,它会自动创建一个”/tmp/uwsgi.sock”文件。然后让我们修改Nginx配置文件,将”uwsgi_pass”配置项改为文件:

location /myapp {  include uwsgi_params;  uwsgi_param SCRIPT_NAME /myapp;  uwsgi_pass unix:/tmp/uwsgi.sock;}

重启Nginx服务器即可。这里我开始一直没跑通,研究了好久才发现,Nginx的用户(默认的www-date:adm),必须要对该文件有读写的权限才行。因为运行uWSGI的用户与运行Nginx的用户不一样,而”/tmp/uwsgi.sock”是由uWSGI的用户创建的,导致Nginx没有足够的权限。如果朋友们也遇到同样的问题,那就只能chmod了。

另外,还是要提一下”.egg”包的解压缩临时目录,我们在介绍mod_wsgi的最后提到过,在uWSGI应用中也一样,Linux上默认是在用户主目录下,比如”/home/bjhee/.python-eggs”。你可以通过设置系统环境变量”PYTHON_EGG_CACHE”来改变它。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    Python使用smtp和pop简单收发邮件完整实例
    下一条:
    Python numpy实现数组合并实例(vstack,hstack)
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客