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

uWSGI+Nginx+Django安装和配置

187次阅读
没有评论

共计 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、短信等云产品特惠热卖中