Ubuntu+Nginx+uWSGI+DJango+python3部署
流程
-
客户端请求服务资源
-
nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析,
-
如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源,
-
如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI;
-
-
uWSGI 将接收到的包进行处理,并转发给wsgi,
-
wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi,
-
wsgi将返回值进行打包,转发给uWSGI,
-
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接口路径
如上显示说明配置成功