关于 django ,uWSGI 与nginx的基本认识
- django: 一个基于python的开源web框架,请确保自己熟悉它的框架目录结构。
- uWSGI:一个基于自有的uwsgi协议、wsgi协议和http服务协议的web网关
- nginx:常用高性能代理服务器
- wsgi.py:django项目携带的一个wsgi接口文件
wsgi:一种实现python解析的通用接口标准/协议,是一种通用的接口标准或者接口协议,实现了python web程序与服务器之间交互的通用性。
利用它,web.py或bottle或者django等等的python web开发框架,就可以轻松地部署在不同的web server上了;
uwsgi:同WSGI一样是一种通信协议
uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型,它与WSGI相比是两样东西。
uWSGI :一种python web server或称为Server/Gateway
uWSGI类似tornadoweb或者flup,是一种python web server,uWSGI是实现了uwsgi和WSGI两种协议的Web服务器,负责响应python 的web请求。
因为apache、nginx等,它们自己都没有解析动态语言如php的功能,而是分派给其他模块来做,比如apache就可以说内置了php模块,让人感觉好像apache就支持php一样。
uWSGI实现了wsgi协议、uwsgi协议、http等协议。 Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
##项目流程
首先客户端请求服务资源,
nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析,
如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源,
如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI;uWSGI 将接收到的包进行处理,并转发给wsgi,
wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi,
wsgi将返回值进行打包,转发给uWSGI,
uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)。
*注:不同的组件之间传递信息涉及到数据格式和协议的转换
作用:
- 第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程;
- 在nginx上加上安全性或其他的限制,可以达到保护程序的作用;
- uWSGI本身是内网接口,开启多个work和processes可能也不够用,而nginx可以代理多台uWSGI完成uWSGI的负载均衡;
- django在debug=False下对静态文件的处理能力不是很好,而用nginx来处理更加高效。
安装与配置
保证你的项目已经可以正确的运行,即能够以 python manage.py runserver 0.0.0.0:8000
方式启动且服务正常
打开浏览器,输入部署地址(如:http://127.0.0.1:8000/)(或http://内网ip:8000、或http://外网ip:8000)测试,确认是否可正常打开浏览。
sudo pip install uwsgi
测试uWSGI: 新建文件test.py,写入以下内容
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return "Hello World"
运行
sudo uwsgi --http 0.0.0.0:8000 --wsgi-file test.py
如果端口占用,使用
lsof -i :8000
列出占用端口的程序的pid号,并使用以下命令杀掉所有占用端口的程序
sudo kill -9 pid
然后浏览 http://127.0.0.1:8000(或http://内网ip:8000、或http://外网ip:8000)查看效果,有”Hello World”输出即安装成功。
sudo apt-get install nginx
使用nginx -v
查看nginx版本,使用nginx -t
查看nginx配置路径及检测语法错误
nginx -t
nginx: the configuration file /etc/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/conf/nginx.conf test is successful
里面说明了nginx默认配置文件的路径是:/etc/nginx/conf/nginx.conf;
然后,确保nginx.conf的同目录下有uwsgi_params文件(/etc/nginx/conf/uwsgi_params),没有的话根据链接获取, 后面要用到。
django + uWSGI 服务搭建
- 检查项目的setting文件中是否配置了 STATIC_URL 与 STATIC_ROOT
static_url 是项目静态文件的在网址中的体现,它是定义了静态文件访问的路径
static_root 是项目静态文件在磁盘上的位置体现,他是定义了静态文件存放的位置 - 上传项目至服务器,并执行
python manage.py collectstatic
收集静态文件(即将项目中的静态文件统一收集到static_root指定的目录下) - 进入项目根目录,创建ini文件,我这里就直接创建 uwsgi.ini 了,名字没有要求。
为省事,以下uwsgi相关文件直接配置在项目根目录下,开发环境不要这样做,配置中的pidfile等最好指定存放路径
[uwsgi]
#socket = 127.0.0.1:8000 # 使用nginx连接时使用,Django程序所在服务器地址
http = 192.168.252.123:8000 # uwsgi 直接做http服务器时使用
chdir=/opt/web_project/ # 项目的根路径
wsgi-file=web_demo/wsgi.py # 项目的wsgi文件 与chdir拼接在一起即wsgi的完整路径
processes=2 # 启用的进程数 不要大于你的cpu核心数
threads=2 # 启用的线程数
master=True # 启用主进程
max-requests=2000 # 最大连接数
pidfile=uwsgi.pid # 存放进程编号的文件,根据此文件停止,重启uwsgi
daemonize=uwsgi.log # 日志文件
# 静态文件映射,不配置这个你的项目可能无法正确寻找到静态文件
static-map=<与static_url保持一致>=<与static_root保持一致>
# virtualenv=<你的虚拟环境路径>
# uid=root 用户名
# gid=root 用户组
- 使用uWSGI启动项目
到这里你就不需要使用python manage.py runserver这个命令了,直接使用uwsgi来控制
启动: uwsgi --ini ‘配置文件路径’
停止: uwsgi --stop ‘uwsgi.pid文件路径’
重新加载: uwsgi --reload ‘uwsgi.pid文件路径’
**如果你的项目有了静态文件的更改,千万记得重新collectstatic,然后reload一下。
**详细配置参考博客园:Ju6y
nginx+uWSGI+django
- uWSGI + NGINX 反向代理
- uwsgi 配置 socket 连接
- nginx配置location设置uwsgi接入
- nginx配置设置静态文件路由
- uWSGI + NGINX 分布式集群
- uwsgi 配置 http 接入
- nginx 配置upstream选项,收集所有分布主机 ip:port
- nginx 配置location接收url转发给upstream
下面将此项目以 uWSGI + NGINX 反向代理模式部署
在自己的工程目录下,建立如project_test.conf的配置文件;复制nginx.conf里面全部的内容,全部写入project_test.conf中(为方便放在项目目录下,开发环境不要这样做)。
然后按照下面写的,把project_test.conf配置文件中的server段部分全部替换掉。
server {
listen 80; # 监听的端口
server_name localhost; # 虚拟域名(即你访问到此的url)
charset utf-8; # 编码
access_log /opt/nginx/nginx_access.log; # 日志文件(访问)
error_log /opt/nginx//nginx_error.log; # 日志文件(错误)
client_max_body_size 75M; # 上传文件大小(根据需要配置)
# 路由配置
# 假设你的static_url是 /static/ 你就配一个/static的路由指向静态文件
location /static {
alias /opt/web_project/projects_static;
}
# 根路由配置
location / {
include /etc/nginx/conf/uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
}
}
对于以上配置的详细解释:
- listen 80 代表监听服务器开放80端口;
- location [目录名] 代表项目路径的引导,即路由;
- access_log 和error_log是定义nginx访问日志和错误日志的存放路径。
- location /static 中的 /static 是自己定义的项目引用静态文件时,浏览器中显示的静态资源所在的根目录名;这样的话,用户在浏览器中查看到的所有image、css或js资源都是处在http://127.0.0.1/static下的。
django静态文件的绝对路径是根据自己的实际情况来确定的,一般在自己的django的app名/static目录下,或自己python manage.py collectstatic后的路径下。 - location / 是指访问项目根目录时,nginx要做的事。其中需要指定 uwsgi_params文件的绝对路径,上面已经提到了;如果还有media文件之类的静态目录,仿照static的写法,自己补充。
- 127.0.0.1:8000是指uWSGI绑定的监听地址,这里使用了8000端口。
- 需要注意的是,请确认自己django的静态文件目录所有者是www用户,如果不是,请用以下命令更改静态目录权限归属者:
sudo chown -R www:www /opt/web_project/
nginx 与 uWSGI 对接
对于上一步的 uwsgi.ini 文件我们要做一点修改
[uwsgi]
socket = 127.0.0.1:8000
chdir=/opt/web_project/
wsgi-file=web_demo/wsgi.py
master = true
processes=2
threads=2
max-requests=2000
chmod-socket=664
daemonize=uwsgi.log
其中的socket字段值”127.0.0.1:8000”必须要和上面写的project_test.conf配置文件中的uWSGI监听地址完全一样;
启动uWSGI
sudo uwsgi --ini uwsgi.ini
启动nginx
如果出现
nginx: [emerg] open() "/**/**/**/mime.types" failed (2: No such file or directory)
检查一下 include mime.types,改成绝对路径
如果nginx已经开启,先关闭nginx(service nginx stop或nginx -s stop),再执行以下命令:
nginx -c project_test.conf
这里的-c 表示加载配置文件启动