注意: 本章节是在虚拟环境下运行的
WSGI 的介绍
1. uWSGI 的介绍
- WSGI 是Web服务器网关接口。它是一个协议,WSGI 描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求)
- 基于 WSGI 运行的框架有 bottle, DJango, Flask, 用于解析动态HTTP请求
- 支持 WSGI 的服务器
- wsgiref
- python自带的web服务器 -> 性能很低
- Gunicorn
- 用于linux的 python wsgi Http服务器,常用于各种django,flask结合部署服务器
- mode_wsgi
- 实现了Apache与wsgi应用程序的结合
- uWSGI
- C语言开发,快速,自我修复,开发人员友好的WSGI服务器,用于Python Web应用程序的专业部署和开发
- 在部署 python 程序 web 应用程序时,可以根据性能的需求,选择合适的 wsgi server,不同的 wsgi server 区别在于并发支持上,有单线程,多进程,多线程,协程的区别,其功能还是近似,无非是请求路由,执行对应的函数,返回处理结果
2. uWSGI 注意事项
- uWSGI 不会处理 static 静态文件的配置
- 建议在虚拟环境中使用 uWSGI
uWSGI 的安装
(env1) [root@kevin_linux ~ 23:49:53]# pip3 install uwsgi -i https://pypi.douban.com/simple # 使用豆瓣的镜像
使用 uWSGI 启动一个 py 文件
1.在 /opt/test_py 目录下创建一个 test.py 文件
(env1) [root@kevin_linux ~ 23:49:53]# mkdir /opt/test_py
(env1) [root@kevin_linux ~ 23:49:53]# touch /opt/test_py/test.py
(env1) [root@kevin_linux ~ 23:49:53]# vim /opt/test_py/test.py
# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3
2.使用 uWSGI 启动 py 文件
- 命令: uwsgi --http :端口号 --wsgi-file 路径/文件名.py
- --http :端口号 -> 使用http协议,启动到xxx端口号
- --wsgi-file 路径/文件名.py -> 启动指定的文件
(env1) [root@kevin_linux ~ 23:49:53]# uwsgi --http :8000 --wsgi-file /opt/test_py/test.py
3.访问指定地址

使用 uWSGI 热加载启动 Django 项目
- 热加载: 修改文件后,无需重启 uwsgi,直接刷新浏览器查看修改后的效果(即: 实时更新)
- 注意: uWSGI 不会处理 static 静态文件的配置
1. 在 /opt/django_project 目录下创建一个 django 项目
(env1) [root@kevin_linux ~ 23:49:53]# mkdir /opt/django_project
(env1) [root@kevin_linux ~ 23:49:53]# cd /opt/django_project
(env1) [root@kevin_linux /opt/django_project 23:51:36]# django-admin startproject test_django
2.修改 django 配置文件
(env1) [root@kevin_linux ~ 23:49:53]# vim /opt/django_project/test_django/test_django/settings.py
# settings.py
ALLOWED_HOSTS = ['*'] # 允许所有ip地址访问该项目,上线时所使用
3.uWSGI 热加载启动 Django 项目
- uWSGI 启动 Django 项目要依赖Django项目中的 wsgi.py 文件
- 命令: uwsgi --http :端口号 --module django项目名.wsgi --py-autoreload=1
- --http :端口号 -> 使用http协议,启动到xxx端口号
- --module django项目名.wsgi -> 指定 uWSGI 所需要的 wsgi.py 文件
- django项目名.wsgi 等同于 django项目名/wsgi.py
- django项目名.wsgi -> 会自动找到 django项目名文件夹 下的 wsgi.py 文件
- --py-autoreload=1 -> 使用热加载
- 注意: 该命令必须在 django 项目的目录下执行
(env1) [root@kevin_linux ~ 23:49:53]# cd /opt/django_project/test_django/
(env1) [root@kevin_linux ~ 23:49:53]# uwsgi --http :8000 --module test_django.wsgi --py-autoreload=1
4.访问指定地址

使用 uWSGI 配置文件启动 Django 项目
- 注意:
- uWSGI 配置文件一般都会创建到项目的目录下,因为根据项目的不同 uWSGI 配置文件也会不同
- uWSGI 不会处理 static 静态文件的配置
1. 在 /opt/django_project 目录下创建一个 django 项目
(env1) [root@kevin_linux ~ 23:49:53]# mkdir /opt/django_project
(env1) [root@kevin_linux ~ 23:49:53]# cd /opt/django_project
(env1) [root@kevin_linux /opt/django_project 23:51:36]# django-admin startproject test_django
2.修改 django 配置文件
(env1) [root@kevin_linux ~ 23:49:53]# vim /opt/django_project/test_django/test_django/settings.py
# settings.py
ALLOWED_HOSTS = ['*'] # 允许所有ip地址访问该项目,上线时所使用
3.在项目的目录下创建一个 uWSGI 配置文件
(env1) [root@kevin_linux ~ 23:49:53]# touch /opt/django_project/test_django/uwsgi_settings.ini
4. 配置文件的内容
- 进入 uWSGI 配置文件
(env1) [root@kevin_linux ~ 23:49:53]# vim /opt/django_project/test_django/uwsgi_settings.ini
- 查看虚拟环境的绝对路径
(env1) [root@kevin_linux ~ 00:46:51]# cdvirtualenv
(env1) [root@kevin_linux ~/Envs/env1 00:47:14]# pwd
/root/Envs/env1
- 添加 uWSGI 配置文件内容
[uwsgi]
# 指定项目的第一层绝对路径(即: 是第一个项目文件夹名,而不是第二个项目文件夹名)
chdir = /opt/django_project/test_django
# 指定项目的 wsgi.py 文件 -> 写入相对路径即可,因为 module 参数是以 chdir 参数的值作为相对路径 -> test_django.wsgi 等同于 test_django/wsgi.py
module = test_django.wsgi
# 指定虚拟环境的绝对路径
home = /root/Envs/env1
# 是否为主进程
master = true
# 指定uwsgi启动的进程个数,根据当前服务器的配置进行设置
processes = 5
# 使用 nginx + uwsgi 启动项目的时候就使用 socket 参数进行启动
# socket = 0.0.0.0:8000
# 使用 uwsgi 启动项目的时候使用 html 参数进行启动
http = 0.0.0.0:8000
# 热加载
py-autoreload=1
# 退出 uwsgi 环境后,清空环境变量
vacuum = true
# 在后台运行 uWSGI
# daemonize = yes

5.使用 uWSGI 启动 Django 项目
- 命令: uwsgi --ini 路径/uwsgi配置文件名.ini
(env1) [root@kevin_linux ~ 23:49:53]# uwsgi --ini /opt/django_project/test_django/uwsgi_settings.ini
6. 访问指定地址

使用 nginx + uWSGI 配置文件启动 Django 项目
- 注意:
- uWSGI 配置文件一般都会创建到项目的目录下,因为根据项目的不同 uWSGI 配置文件也会不同
- uWSGI 不会处理 static 静态文件的配置
1. 在 /opt/django_project 目录下创建一个 django 项目
(env1) [root@kevin_linux ~ 23:49:53]# mkdir /opt/django_project
(env1) [root@kevin_linux ~ 23:49:53]# cd /opt/django_project
(env1) [root@kevin_linux /opt/django_project 23:51:36]# django-admin startproject test_django
2.修改 django 配置文件
(env1) [root@kevin_linux ~ 23:49:53]# vim /opt/django_project/test_django/test_django/settings.py
# settings.py
ALLOWED_HOSTS = ['*'] # 允许所有ip地址访问该项目,上线时所使用
3. 在项目的目录下创建一个 uWSGI 配置文件
(env1) [root@kevin_linux ~ 23:49:53]# touch /opt/django_project/test_django/uwsgi_settings.ini
4. 配置文件的内容
- 进入 uWSGI 配置文件
(env1) [root@kevin_linux ~ 23:49:53]# vim /opt/django_project/test_django/uwsgi_settings.ini
- 查看虚拟环境的绝对路径
(env1) [root@kevin_linux ~ 00:46:51]# cdvirtualenv
(env1) [root@kevin_linux ~/Envs/env1 00:47:14]# pwd
/root/Envs/env1
- 添加 uWSGI 配置文件内容
[uwsgi]
# 指定项目的第一层绝对路径(即: 是第一个项目文件夹名,而不是第二个项目文件夹名)
chdir = /opt/django_project/test_django
# 指定项目的 wsgi.py 文件 -> 写入相对路径即可,因为 module 参数是以 chdir 参数的值作为相对路径 -> test_django.wsgi 等同于 test_django/wsgi.py
module = test_django.wsgi
# 指定虚拟环境的绝对路径
home = /root/Envs/env1
# 是否为主进程
master = true
# 指定uwsgi启动的进程个数,根据当前服务器的配置进行设置
processes = 5
# 使用 nginx + uwsgi 启动项目的时候就使用 socket 参数进行启动
socket = 0.0.0.0:8000
# 使用 uwsgi 启动项目的时候使用 html 参数进行启动
# http = 0.0.0.0:8000
# 热加载
py-autoreload=1
# 退出 uwsgi 环境后,清空环境变量
vacuum = true
# 在后台运行 uWSGI
# daemonize = yes

5. Django 的静态文件 与 nginx 配置
- 收集当前项目的静态文件,放到指定的路径下,方便 nginx 进行调用
- 修改 django 的配置文件
(env1) [root@kevin_linux ~ 00:20:02]# vim /opt/django_project/test_django/test_django/settings.py
# settings.py
STATIC_ROOT='/opt/nginx-1-12/static/test_django_static' # 指定收集后的静态文件存放路径
STATIC_URL = '/static/'
STATICFILES_DIRS=[
os.path.join(BASE_DIR,"static"),
]
- 执行指定命令
(env1) [root@kevin_linux ~ 00:28:26]# python /opt/django_project/test_django/manage.py collectstatic

6. nginx 的配置
- 配置 nginx,配置一个网站入口,当前用户访问 10.0.0.3:80 这个web应用是,自动将请求转发给 uwsgi 进行处理,uwsgi 处理后返回给 nginx,然后 nginx 再将结果返回给用户
- 进入 nginx 的配置文件
(env1) [root@kevin_linux ~ 00:39:26]# vim /opt/nginx-1-12/conf/nginx.conf
- nginx 的 nginx.conf 的配置文件设置
# nginx运行的 work 进程数量 (建议与CPU数量一致或auto)
worker_processes 4;
...
events {
# 每个worker进程支持的最大连接数
worker_connections 65535;
...
}
...
http {
...
# 定义一个名为 test_django 的负载均衡池
upstream test_django {
# 池子中存放着处理请求减轻负载的服务器,默认轮询方式调用服务器
server 10.0.0.3:8000;
}
# 使用server配置网站, 每个 server{} 代表一个网站 (简称虚拟主机)
server {
# 监听端口, 默认80
listen 80;
# 提供服务的域名或主机名,即: 通过该域名或ip来访问当前配置的网站
server_name 10.0.0.3;
# 控制网站访问路径
location / {
# 使用负载均衡
uwsgi_pass test_django;
# 不使用负载均衡
# uwsgi_pass 10.0.0.3:8000;
# 将 uwsgi_params 配置文件添加到当前虚拟主机上
# include 参数的作用: 减少主配置文件 nginx.conf 的内容,将某部分的配置项单独写在一个配置文件中然后使用 include 参数进行导入,其效果和直接写在 nginx.conf 主配置文件下是一样的
# include 参数如果不使用绝对路径,那么默认会在 /opt/nginx-1-12/conf/ 下寻找你所定义的配置文件
include /opt/nginx-1-12/conf/uwsgi_params;
}
# 配置静态文件的访问路径
location /static {
# 使用 alias 所指定的路径结尾处不需使用 "/"
alias /opt/nginx-1-12/static/test_django_static/;
}
}
...
}
7. 启动 nginx 和 uWSGI 测试项目是否能正常运行
- 启动 nginx 服务
(env1) [root@kevin_linux ~ 00:55:26]# /opt/nginx-1-12/sbin/nginx
- 通过 uWSGI 启动项目
(env1) [root@kevin_linux ~ 00:55:26]# uwsgi --ini /opt/django_project/test_django/uwsgi_settings.ini
8. 访问指定地址
