注意: 本章节是在虚拟环境下运行的

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. 访问指定地址