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"Hello uwsgin xlf----!"
执行命令
uwsgi --http-socket :8088 --wsgi-filetest_for_uwsgi.py
打开浏览器,访问:本地IP:8088

文件配置
在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

打开浏览器,访问:本地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<path>.*)', serve, {'document_root': MEDIA_ROOT}),
re_path(r'^static/(?P<path>.*)$', serve, {'document_root': STATIC_ROOT}),
]
执行命令
python manage.py collectstatic

在项目路径下就会生成static文件夹,存放静态文件
执行
此时uwsg已经启动django应用服务
执行命令
sudo nginx
打开浏览器访问配置的地址:服务器IP地址:8099/Django接口路径

如上显示说明配置成功

浙公网安备 33010602011771号