Ubuntu+Nginx+uWSGI+DJango+python3部署


Ubuntu+Nginx+uWSGI+DJango+python3部署

流程

  1. 客户端请求服务资源

  2. nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析,

    • 如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源,

    • 如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI;

  3. uWSGI 将接收到的包进行处理,并转发给wsgi,

  4. wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi,

  5. wsgi将返回值进行打包,转发给uWSGI,

  6. uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)。

*注:不同的组件之间传递信息涉及到数据格式和协议的转换

第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程;

为什么有了uwsgi还要使用nginx

  • nginx提供了更加安全的服务保障

  • 提供反向代理,负载均衡等功能

    • uWSGI本身是内网接口,开启多个work和processes可能也不够用,而nginx可以代理多台uWSGI完成uWSGI的负载均衡;

  • 对于静态文件处理能力强

    • django在debug=False下对静态文件的处理能力不是很好,而用nginx来处理更加高效。

uWSGI

WSGI协议:web server 和 web application通信的规范

webserver 接受客户端的请求,传送给 web application

uWSGI :一种python web server或称为Server/Gateway

uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型,它与WSGI相比是两样东西。

  • uWSGI可以进行多线程调度,进程监控

  • 提供完善的请求日志处理

  • runserver 性能差

安装

sudo apt-get install python3-dev    #先装这个才能使pip3 install uwsgi成功
sudo apt-get install python3-pip
sudo sudo pip3 install uwsgi

测试

新建一个python文件:test_for_uwsgi.py

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello uwsgin xlf----!"]

执行命令

uwsgi --http-socket :8088 --wsgi-file test_for_uwsgi.py

打开浏览器,访问:本地IP:8088

文件配置

在DJango的项目文件夹下新增uwsgi.ini文件

输入

[uwsgi]
#使用http访问的端口
http            = :8080
#使用nginx与之通信的端口
socket          = :8000
#django 目录
chdir           = /home/ubuntu/PycharmProjects/DRF/MyDRF/
#Django 项目下 wsgi.py 文件路径
module          = MyDRF.wsgi    # 通过模块定位到wsgi文件
# 也可以使用具体文件
#wsgi-file      = /home/ubuntu/PycharmProjects/DRF/MyDRF/MyDRF/wsgi.py
master          = true  # 主进程
#进程数
processes       = 4
vacuum          = true

运行

uwsgi --ini 项目路径/uwsgi.ini

打开浏览器,访问:本地IP:8080/Django接口路径

如上说明访问成功

(若是虚拟机作为服务器并使用uwsgi启动执行,亦可在本地机器打开浏览器访问)

Nginx

  • 反向代理器,网站服务器,负载均衡

  • 基本命令

    • sudo nginx启动

    • sudo nginx -s stop停止 (或者使用killall -9 nginx)

    • sudo nginx -s quit退出

    • sudo nginx -s reopen重开

    • sudo nginx -s reload重载

  • 关键配置模块

    • events配置域:网络连接相关配置(I/O模块)

    • server配置域:相关服务节点配置

    • location

    • http配置域

    • upstream配置域:反向代理配置域

  • 层次关系

    events {
        ....
    }
    http {
        ...
        upstream {
            ...
        }
        server {
            ...
            location {
                ...
            }
        }
    }

安装

sudo apt-get install nginx

测试

nginx -v    # 查看nginx版本
nginx -t    # 查看nginx配置路径
?
# 执行
sudo nginx

打开浏览器,访问:127.0.0.1:80

如上说明nginx开启成功

配置

进入/etc/nginx/sites-enabled,创建**.conf文件,比如项目名称.conf,在文件中输入如下

server {
    listen 8099;    # 浏览器访问nginx的端口
    server_name localhost;    # 浏览器访问nginx的域名或者IP地址

    # 指定项目路径uwsgi
    location / {
        include uwsgi_params;
        uwsgi_connect_timeout 30;
        uwsgi_pass 127.0.0.1:8000;    # 关联uwsgi的端口,要和uwsgi配置中的socket端口一致
    }

    # 指定静态文件路径
    location /static/ {
        alias /home/ubuntu/PycharmProjects/DRF/MyDRF/static/;    # 项目的静态文件路径
    }

}

项目的静态文件路径

在项目目录下的settings.py文件添加如下配置

# 静态文件配置
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static")

# 上传文件配置
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

在urls.py文件中添加url

from django.contrib import admin
from django.urls import path
from django.conf.urls import re_path, include
from django.views.static import serve

from MyDRF.settings import MEDIA_ROOT,STATIC_ROOT

urlpatterns = [
    ...
    re_path(r'^media/(?P.*)', serve, {'document_root': MEDIA_ROOT}),
    re_path(r'^static/(?P.*)$', serve, {'document_root': STATIC_ROOT}),
]

执行命令

python manage.py collectstatic

在项目路径下就会生成static文件夹,存放静态文件

执行

此时uwsg已经启动django应用服务

执行命令

sudo nginx

打开浏览器访问配置的地址:服务器IP地址:8099/Django接口路径

如上显示说明配置成功