nginx + uwsgi + Django 部署配置方案
- nginx, uwsgi, Django 三者关系
- 配置方法
1. nginx + uwsgi + Django 配置方案原理
浏览器发起web请求 < ---- > nginx接受到浏览器请求 < ----- > uwsgi 处理请求 < ----- > 经过wsgi请求django
#### Nginx 作为反响代理服务器
负责静态资源处理,动态请求转发 (客户端发送过来的http进行解包, 分析),以及响应结果的回传
静态资源的处理: 如果请求的是静态资源, 直接返回静态路径下的资源
如果是动态页面请求: 比如牵涉到数据库数据的调用的问题, 转接到uwsgi
uWSGI作为Web服务器
uWSGI在 Nginx + uWSGI + Django 的配置过程中 担任中间件的任务 负责转发Nginx请求并发送给Django并处理后转发回Nginx
uWSGI在 uWSGI + Django中 还承担web服务器的作用
uWSGI 将接收到的包进行处理,并转发给wsgi,
wsgi根据请求调用django工程的某个文件或函数(我们写的APP),处理完后django将返回值交给wsgi,wsgi将返回值进行打包,转发给uWSGI,uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)。
实现了http, uwsgi, WSGI等协议
WSGI
python web 中应用程序和后端服务器之间的规范,使得 WebApp和WebServer进行通信的规范, 规定了一个application,来调用特定的APP
在django项目模板生成的时候 一个默认的wsgi.py文件.
Django作为应用框架
MVC框架, 用来实现数据库调用, 模板显示等功能 (我们主要在这一块进行开发)
2. 部署配置方法 (conda)
主要参考的网页:
参考1
参考2
django静态文件参考
安装uWSGI
这里需要装两次 uwsgi
conda install uwsgi
source activate django
conda install uwsgi
配置uWSGI对应的配置文件
[uwsgi]
socket = 127.0.0.1:7999 # 内部映射到nginx的端口
chdir = /项目的绝对路径/mysite/ #项目的资源路径
wsgi-file = PV_Moniter/wsgi.py # wsgi.py所在的位置 相对项目路径的位置
processes = 4
threads = 2
stats = 127.0.0.1:9191
master=True
pidfile=uwsgi.pid
daemonize=uswgi.log
安装nginx
cd /usr/local/
wget http://nginx.org/download/nginx-1.13.7.tar.gz
// 解压
tar -zxvf nginx-1.13.7.tar.gz
cd ./nginx-1.13.7/
sudo ./configure
sudo make
sudo make install
cd ../naginx/conf/
sudo vim nginx.conf
安装完nginx之后就开始配置nginx的配置文件
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 80; # 80 http协议 443 https协议
server_name 127.0.0.1:80; # 服务器的域名或者ip地址
charset utf-8;
location / { # 这部配置要和内部wsgi配置的一样
include uwsgi_params;
uwsgi_pass 127.0.0.1:7999; # uwsgi 对应的内部端口 因为他是映射到内部wsgi的
uwsgi_param UWSGI_SCRIPT mysite.wsgi; # wsgi对应的文件模块,
uwsgi_param UWSGI_CHDIR /项目绝对路径/mysite/; #项目路径 这个mysite是最大的项目路径 而不是mysite下的mysite文件夹!!!
}
location /static/ {
alias /项目的绝对路径/mysite/static/; #静态资源路径
}
}
}
启动uwsgi和nginx
uwsgi -ini uwsgi.ini
sudo /usr/local/nginx/sbin/nginx
// 或者
sudo /usr/local/nginx/sbin/nginx -s reload
部署完成
访问配置环境我们配置的80端口即可!!!一定是我们配置的80 对外nginx代理的端口 而不是对内wsgi的7999端口
因为uWSGI本身不处理静态文件 所以一定要通过80端口才能访问
另外, 如果出静态文件找不到的情况,看一下 django中的路径配置
STATIC_URL = '/static/'
# STATIC_ROOT = os.path.join(BASE_DIR, 'common_static')
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
#
# 公共的 static文件 js 文件放在这里 公共的静态文件放在这里,
# STATICFILES_DIRS = [
# os.path.join(BASE_DIR, "static")
# ]
这里需要对STATICFILES_DIRS 与 STATIC_ROOT两个路径进行介绍
STATICFILES_DIRS:开发过程中放置静态文件
STATIC_ROOT: 上线后的文档目录执行python manage.py collectstaic 所有静态文件收集的目录
上述的目录 不能由包含关系
最佳实践
STATIC_URL = '/static/'
# 开发阶段放置项目自己的静态文件
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'staticfiles'),
)
# 执行collectstatic命令后会将项目中的静态文件收集到该目录下面来(所以不应该在该目录下面放置自己的一些静态文件,因为会覆盖掉)
STATIC_ROOT = os.path.join(BASE_DIR, 'static')