为什么使用nginx和uwsgi? 已经打算做前后端分离,那么对于静态资源等就使用nginx进行部署来,然后对于接口请求,也使用nginx做转发。
说到uwsgi,得先提一下wsgi。
WSGI协议(通讯协议):Python用于Web开发的协议,请求数据,响应数据的封装,开发者只负责处理中途的数据
Django一般都自带wsgi服务器,但是性能并不怎么样,一般自己开发调试,放到线上使用还是使用uwsgi。
uwsgi协议(传输协议,速度很快):uWSGI程序实现的一个自有的协议(采用二进制来存储数据,之前的协议都是使用字符串,所以在存储空间和解析速度上,都更快)
注意
WSGI是一种通信协议。
uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
工作流程 三者工作流程如下图
配置Django 既然要部署在线上,这边只需要更改setting.py的两个配置:allow_host和debug
关闭debug模式
DEBUG = False
设置允许来源为本地
ALLOWED_HOSTS = [“127.0.0.1”, “localhost”]
前者是为来关闭调试模式,防止发生错误的时候,泄漏一些系统的关键信息。
后者是为因为在浏览器访问直接作用于Nginx,因此Django本身端口无需暴露给外网,只留给本地本地,走转发就行来。
配置uwsgi 安装依赖库
1 2 3 4 5 yum install libxml2 yum install gcc yum install python-devel
安装
安装之后在你python的bin目录下就有来uwsgi命令,为来使用方便,可以在/usr/bin目录加一个软链
uwsgi做软链
1 2 sudo ln -s /xxx/xxx/python3/bin/uwsgi /usr/bin/uwsgi # 此处python3之前的目录根据自己的来
在django的项目目录下新增uwsgi.ini文件,配置如下(以下 projectname写自己的项目名**)**
1 2 3 4 5 6 7 8 9 10 11 12 13 14 [uwsgi] socket = 127.0.0.1:8000 # uwsgi本身启动端口 chdir=/xx/xx/projectname # 项目目录 module= projectname.wsgi:application #projectname写自己的 wsgi-file = projectname/wsgi.py # wsgi.py所在projectname名+wsgi,路径相对于chdir而言 callable =projectname # python内用以启动的application名 processes = 2 # 处理器个数,根据cpu来 threads = 2 # 线程数 stats = 127.0.0.1:9000 # 状态检测地址,即django启动的端口 max-requests = 1000 # 最大请求数 limit-as = 512 # 每个uwsgi进程的虚拟内存使用数,大小mb,根据机器配置酌情限制下 buffer-size = 30000 # uwsgi包解析的内部缓存区大小,默认是4k,单位kb。 pidfile =/home/username/projectname/uwsgi.pid # uwsgi的进程pid文件 daemonize = /home/username/projectname/uwsgi.log # uwsgi后台启动,日志存储位置
启动uwsgi
1 2 3 # 依然在django项目根目录 uwsgi uwsgi.ini
查看下
可以看到有三个,其中pid为4528的是主进程,后面4531和23151都是子进程,因为这里processes设置的2。
安装Nginx(openresty) openresty是基于nginx由国人大神春哥开发的开源服务器,是兼容nginx的,加入了lua支持更多复杂的写法,不过暂时用不到,由于项目里使用openresty,这边就安装openresty吧。
安装依赖
1 yum install pcre-devel openssl-devel gc-c++
安装openresty
1 2 3 4 5 6 7 8 9 10 11 # 下载 wget https://openresty.org/download/openresty-1.15.8.2.tar.gz # 解压 tar -zxvf openresty-1.15.8.2.tar.gz # 安装 mkdir -p /usr/local/openresty cd openresty-1.15.8.2 ./configure --prefix=/usr/local/openresty --with-http_ssl_module make && make install
检验是否安装成功
1 2 cd /usr/local/openresty/nginx sbin/nginx -c conf/nginx.conf -t
如果出现下面的内容说明安装成功了。
1 2 nginx: the configuration file /usr/local/openresty/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/openresty/nginx/conf/nginx.conf test success
修改配置文件
1 2 3 4 5 6 7 cd /usr/local/openresty/nginx # 可先把原来的备份下 cp conf/nginx.conf conf/nginx.conf.bak # 修改 vim conf/nginx.conf
配置文件内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 user root; #若要启动80则需要root权限,简单点就写root,安全点单独创建具备免密执行权利的用户 worker_processes 1; #nginx的线程数 error_log logs/error.log; #错误日志地址 events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name xxx.xxx.xxx.xxx #你的公网ip; charset utf-8; location / { include uwsgi_params; #倒入uwsgi配置 uwsgi_pass 127.0.0.1:8000; #uwsig启动地址和端口,跟上面uwsgi.ini中的socket一致 client_max_body_size 35m; } } }
启动openresty
1 sbin/nginx -c conf/nginx.conf
至此,都已安装配置完毕,手动启动的只有openresty和uwsgi,此时访问你的公网地址,就可以访问你的django项目了。