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

uWSGI+Nginx+Django安装和配置

469次阅读
没有评论

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

uWSGI 是为 Python 语言定义的通用网关接口,它承担 python web 框架(django、flask、web.py 等)和 web 服务器(nginx、apache、lighttpd 等)之间的中间层。

    浏览器                      chrome、firefox、ie 等
      |
    web 服务器                  nginx、apache 等
      |
    网关接口                    CGI、FastCGI、WSGI 等
      |
    Python(程序、Web 框架)Django、Flask、Tornado 等

python 中自带的 wsgiref 就是一种 wsgi 接口的标准实现,但是,由于 100% 使用 python 实现等原因,导致 wsgiref 实在过于缓慢,只能用于测试和学习。生产环境中我们需要使用性能更高的服务器,目前常用的 wsgi 服务器有:uWSGI、Gunicorn、twisted.web。

1 uWSGI 的安装
uWSGI 是用 C 语言写的高性能 WSGI 服务器,安装 uWSGI 前我们需要安装 Python 和 C 编译器(GCC)。推荐使用 python 包管理器 pip 安装 uWSGI。

# 安装最新稳定版
pip install uWSGI
# 也可以安装长期支持版(LTS 版本)
#pip install http://projects.unbit.it/downloads/uwsgi-lts.tar.gz
在 Ubuntu 下可以使用 apt-get 来安装

apt-get install uwsgi 

在 Fedora、RedHat、CentOS 下使用 yum 安装

yum groupinstall “Development Tools”
yum install python 

编译安装,从 github 下载 uwsgi 代码,cd 到目录下

python uwsgiconfig.py –build

2 测试 uwsgi 是否安装成功
在终端中输入以下命令查看 uwsgi 的版本号,如果输出正常,说明 uswgi 已安装成功

$ uwsgi –version
2.0.11.1
我们可以编写一个简单的 wsgi 应用来测试 uwsgi 是否被安装成功,首先创建一个 test.py 文件:

# test.py
def application(env, start_response):
    start_response(‘200 OK’, [(‘Content-Type’,’text/html’)])
    return [b”Hello World”] # python3
    #return [“Hello World”] # python2
运行 uwsgi:

uwsgi –http :8000 –wsgi-file test.py
参数中,http :8000 表示使用 http 协议,端口号为 8000,wigi-file 则表示要运行的 wsgi 应用程序文件。uwsgi 运行后打开浏览器,访问 http://127.0.0.1:8000/,或者是相应服务器地址的 8000 端口,就可以看到 hello world 页面了。

上面的例子中, 我们用浏览器直接访问了 uwsgi 运行的 python 程序(只有一个入口函数的 wsgi 测试应用 test.py),其访问结构如下所示。

    浏览器 <-> uWSGI <-> Python
上述方式运行 uWSGI 服务的过程中,可以使用 CTRL+C 即可停止服务,在后续的章节中会讲到自动管理和部署。

3 nginx 和 django 的配置
nginx 和 django 的安装不是本文的重点,故在此略去,只讨论配置部分。在这里,我们要实现的效果如下:

    浏览器 <-> nginx <-> uWSGI <-> Django(python)
uwsgi_params 配置文件
uWSGI 使用的协议不完全是标准的 WSGI 协议,我们需要从 Github 下载 uwsgi_paraments 配置文件,并将该文件拷贝到项目路径中(例如:/user/home/pengquanxin/projects/mysite1/)。

Nginx 服务器配置
接下来,要配置 nginx 服务器和 uWSGI 互通,可以使用 unix 套接字方式和 TCP 端口方式。在 nginx 配置文件夹(/etc/naginx/site-enabled 或 /usr/local/etc/nginx/sites-enabled)中新建网站的配置文件 mystie_nginx.conf,输入以下内容:

# mysite_nginx.conf

# nginx 需要连接的上游
upstream django {
    server unix:///path/to/your/mysite/mysite.sock; # 使用 unix 套接字
    #server 127.0.0.1:8001; # 使用 TCP 端口请注释上一行,并取消本行注释,这里的端口指的是跑 uwsgi 的端口
}

# nginx 服务器配置
server {
    # 监听端口
    listen      80;
    # 域名
    server_name .example.com;
    # 编码
    charset    utf-8;

    # 最大上传大小
    client_max_body_size 75M; 

    # Django 的 media 路径
    location /media  {
        alias /path/to/your/mysite/media; 
    }

    # 静态文件路径
    location /static {
        alias /path/to/your/mysite/static;
    }

    # 将动态请求转发到 uwsgi 跑的 django 程序
    location / {
        uwsgi_pass  django;
        include    /path/to/your/mysite/uwsgi_params; # 从 github 上下载的 uwsgi_params 文件路径
    }
}
你也可以把这个配置文件放在项目路径中,然后建立一个链接到 nginx 配置文件夹:

sudo ln -s ~/path/to/your/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/
部署静态文件
在部署服务器之前,需要先将 Django 的静态文件部署到静态文件夹中,首先,编辑 django 网站的 settings.py 文件

STATIC_ROOT = os.path.join(BASE_DIR, “static/”)
然后,运行以下命令

python manage.py collectstatic
4 启动服务
在启动 nginx 之前,我们需要先启动 uWSGI,进入项目目录然后输入以下命令,在这里我们使用 unix 套接字方式:

# 注:django1.6 前的版本需要手动添加 wsgi.py
uwsgi –socket mysite.sock
如果 nginx 和 uwsgi 跑在同一台服务器上,使用 unix 套接字就可以了,unix 套接字方式性能要高很多,但不能跨机器访问。当 nginx 和 uWSGI 不在一台服务器上时,就需要使用 TCP 端口方式(别忘了更改 nginx 配置文件,取消相应注释):

uwsgi –socket :8001 –module mysite.wsgi –chmod-socket=664
接下来,启动 nginx 服务器,就可以访问 django 站点了。

5 使用 ini 配置文件跑 uWSGI
到这里,我们已经把 nginx+uWSGI+Django 跑起来了,但 uWSGI 的参数比较多的时候,每次都要输入非常麻烦,这时,我们可以在 django 项目目录下建立一个 mysite.uwsgi.ini

[uwsgi]
# 项目根目录路径(full path)
chdir          = /path/to/your/project
# Django 的 wsgi 文件
module          = mysite.wsgi
# virtualenv 目录 (full path)
home            = /path/to/virtualenv

master          = true
# 最大工作进程数(CPU 密集型建议设为 CPU 核心数,IO 密集型建议设为 CPU 核心数的两倍)
processes      = 16
# unix 套接字文件路径
socket          = /path/to/your/project/mysite.sock
# socket 文件权限
# chmod-socket    = 664
# 退出时清空环境
vacuum          = true
然后,直接根据配置文件运行 uwsgi 即可:

uwsgi –ini mysite.uwsgi.ini
6 管理 uwsgi
Emperor 模式
uWSGI 的 Epreror 模式可以用来管理机器上部署的 uwsgi 服务,在这种模式下,会有一个特殊的进程(皇帝)对其它部署的服务(诸侯)进行监视。我们将所有配置文件(ini 或 xml 文件,如上一节中的 mysite.uwsgi.ini)统一放到一个文件夹(如:/etc/uwsgi/vassals)中,然后启动 Emperor 模式:

uwsgi –emperor /etc/uwsgi/vassals
这样,就会自动读取文件夹中的配置文件,并自动监控这些 uwsgi 服务:– 检测文件夹中有新的配置文件时,会启动新的 uwsgi 服务实例 – 检测到一个配置文件发生改变,会自动重启该服务 – 检测到一个配置文件被移除,则自动停止该服务 – 如果一个服务死了(诸侯),皇帝进程会重启该服务 – 如果监控进程(皇帝)死了,所有服务(诸侯)都会停止

用 systemd 管理 uwsgi 服务
配合 Eperor 模式,在 centos、fedora、archlinux 中,我们可以用 systemd 来管理 uwsgi,首先,创建一个 systemd service 文件(/etc/systemd/system/emperor.uwsgi.service)

[Unit]
Description=uWSGI Emperor
After=syslog.target

[Service]
ExecStart=/root/uwsgi/uwsgi –emperor /etc/uwsgi/vassals
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target
这样我们就可以用 systemd 来管理 uwsgi 服务了。启动服务:

$ systemctl start emperor.uwsgi.service
查询服务运行状态:

$ systemctl status emperor.uwsgi.service
停止服务

systemctl stop emperor.uwsgi.service
Linux 系统中,还有一种通用的方法,就是在 init.d 或 rc.d 中加入启动脚本,这种方式不够智能,而且网上资料很多,在这里暂不讨论。

7 常用参数和选项
关于参数的具体使用,可以阅读官方文档 http://uwsgi-docs.readthedocs.org/en/latest/Options.html,在这里列出一些常用的参数:

chdir 项目目录
home virtualenv 目录(如没有运行 virtualenv 虚拟环境,则无需设置)
socket 套接字文件或 TCP 套接字,例如:site1.uwsgi.sock 或 127.0.0.1:8000
uid 用户 id
gid 用户组 id
processes 工作进程数
harakiri 进程超过该时间未响应就重启该进程(默认单位为秒)
module 要启动的 wsgi 模块入口,如:mysite.wsgi:application
ini 指定 ini 配置文件
xml 指定 xml 配置文件(与 ini 类似)
file 指定要运行的 wsgi 程序文件,如:test.py
emperor Emperor 模式
so-keepalive 开启 TCP KEEPALIVE(unix 套接字方式下无效)
vacuum 退出时清空环境

更多参考

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

uWSGI+Django+Nginx 的工作原理流程与部署过程 http://www.linuxidc.com/Linux/2017-03/141785.htm

快速部署 Python 应用:Nginx+uWSGI 配置详解  http://www.linuxidc.com/Linux/2016-12/137830.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/2017-03/141822.htm

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

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7982868
文章搜索
热门文章
星哥带你玩飞牛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-提高用户访问的响应速度和成功率
随机文章
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

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

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞...
Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集 在云原生体系中,Prometheus 已成为最主流的监控与报警...
免费领取huggingface的2核16G云服务器,超简单教程

免费领取huggingface的2核16G云服务器,超简单教程

免费领取 huggingface 的 2 核 16G 云服务器,超简单教程 前言 HuggingFace.co...
支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare 也瘫了连监控都挂,根因藏在哪? 最近两天的互联网堪称“故障...

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

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

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

星哥带你玩飞牛 NAS 硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话? 前言 在选择 NAS 用预...
免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

  免费无广告!这款跨平台 AI RSS 阅读器,拯救你的信息焦虑 在算法推荐主导信息流的时代,我们...
300元就能买到的”小钢炮”?惠普7L四盘位小主机解析

300元就能买到的”小钢炮”?惠普7L四盘位小主机解析

  300 元就能买到的 ” 小钢炮 ”?惠普 7L 四盘位小主机解析 最近...
还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手! 前言 对于个人开发者、建站新手或是想搭建测试站点的从业者...
星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛 NAS 硬件 02:某鱼 6 张左右就可拿下 5 盘位的飞牛圣体 NAS 前言 大家好,我是星...