Ubuntu+Nginx+uWSGI+DJango+python3部署

流程

  1. 客户端请求服务资源
  2. nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析
    如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源
    如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI
  3. uWSGI 将接收到的包进行处理,并转发给wsgi,wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi,wsgi将返回值进行打包,转发给uWSGI,
  4. 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"Hello uwsgin xlf----!"

执行命令

uwsgi --http-socket :8088 --wsgi-filetest_for_uwsgi.py

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

文件配置

在DJango的项目文件夹下新增文件,输入

[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

image
打开浏览器,访问:本地IP:8080/Django接口路径
image
如上说明访问成功
(若是虚拟机作为服务器并使用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
image
如上,说明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<path>.*)', serve, {'document_root': MEDIA_ROOT}),
    re_path(r'^static/(?P<path>.*)$', serve, {'document_root': STATIC_ROOT}),
]

执行命令

python manage.py collectstatic

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

执行

此时uwsg已经启动django应用服务
执行命令

sudo nginx

打开浏览器访问配置的地址:服务器IP地址:8099/Django接口路径
image
如上显示说明配置成功

posted @ 2022-03-08 22:27  注入灵魂  阅读(198)  评论(0)    收藏  举报