终于,自己的第二个项目写完啦,又到了部署上线阶段,犹记得上一个项目传到服务器上只有,自己基础知识太差,捣鼓了好久都没部署成功,于是就让它运行着Django自带的简易服务器(python manage.py runserver)运行着,心里想着,这次怎么都要配置上Nginx和uWSGI,于是花了一晚上加一早上,总算是部署成功了,过程也并不是一帆风顺,遇到了很多坎,查看了很多文档、博客,但是功夫不负有心人,于是打算把这一过程记录一下。
先了解一下大概流程,这对于我们配置这两个软件有很大的帮助,防止自己配置着配置着就迷糊了。(宽容)
一、uWSGI部分
说到uWSGI就不得不说WSGI,后者是python web 服务器网关接口,为一种协议,规定了django如何接收http请求并返回response,但是这仅仅是种协议、规范。uWSGI是实现了WSGI的由C语言编写的软件,通过uWSGI能获得更好的性能,uWSGI实现了WSGI的所有接口,是一个快速、自我修复、开发人员和系统管理员友好的服务器软件。
- uWSGI的安装
pip install uwsgi
启动方式1:命令行模式
启动方式2:配置ini文件通过固定命令启动(还有xml格式)
`uwsgi --ini /路径/uwsgi.ini` #通过ini配置文件启动uwsgi
`uwsgi --stop /路径/uwsgi.pid` #通过.pid(记录uwsgi进程号)来停止uwsgi
`uwsgi --reload /路径/uwsgi.pid` #通过.pid来重载uwsgi
- ini配置文件
[uwsgi]
socket = 本地ip:项目所占端口 #当配合Nginx使用的时候使用socket
http = 本地ip:项目所占端口 # 当只用uwsgi时用http
chdir=/root/home/fog_detect_env/FogDetect # 更改路径到项目目录
wsgi-file=fog_test/wsgi.py # 项目里的wsgi文件位置
processes=4 # 代表启用4个进程
threads=2 # 代表每4个进程使用2个线程
master=true
pidfile=%(chdir)/fog_uwsgi/uwsgi.pid # 存放uwsgi进程号的文件存放位置
daemonize=%(chdir)/fog_uwsgi/uwsgi.log # 存放uwsgi进程日志的文件存放位置
vacuum = true
home = //root/home/fog_detect_env # 若果项目放在虚拟环境中,则这个指向虚拟环境存放路径
max-requests = 5000 # 最大同时连接数
一些其他的常见的配置选项(参考自 http://www.cnblogs.com/fnng/p/5268633.html )
http : 协议类型和端口号
processes : 开启的进程数量
workers : 开启的进程数量,等同于processes(官网的说法是spawn the specified number ofworkers / processes)
chdir : 指定运行目录(chdir to specified directory before apps loading)
wsgi-file : 载入wsgi-file(load .wsgi file)
stats : 在指定的地址上,开启状态服务(enable the stats server on the specified address)
threads : 运行线程。由于GIL的存在,我觉得这个真心没啥用。(run each worker in prethreaded mode with the specified number of threads)
master : 允许主进程存在(enable master process)
daemonize : 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最常用的,还是把运行记录输出到一个本地文件上。
pidfile : 指定pid文件的位置,记录主进程的pid号。
vacuum : 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)
如果是先测试uwsgi, 可以先将socket 改为 http = 本地ip:项目所占端口
uwsgi就好像是连接Nginx与django应用的桥梁。
二、Nginx部分
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,它占有内存少,并发能力强.
- 负载均衡:将接收到的请求按某种算法合理地分配到各个性能不一的服务器上面。
- 反向代理:隐藏真实的服务器。
静态文件处理:将项目的静态文件收集起来,将静态文件的请求交给Nginx处理。
Nginx的安装:
sudo apt-get install nginx
#默认安装到/etc/nginx 下面Nginx的使用:
/etc/init.d/nginx start # 启动Nginx
/etc/init.d/nginx stop # 停止Nginx
/etc/init.d/nginx restart # 重启Nginx
- Nginx的配置:
Nginx的主要配置文件为/nginx/nginx.conf ,我们可以将要配置的项目信息写到这里,但是最新版的nginx配置文件中,将项目配置信息通过include xxx给解耦到同级目录下的sites-enable文件夹下了,这样,我们就可以在sites目录下配置我们每个项目的配置文件了。(跟Django中的urlconf模式一样)
我们先在sites-avaliable目录下创建一个xxx.conf文件存放项目的配置信息,配置信息如下
server {
listen 8080; # 监听端口
server_name fog_detect; # 服务器名称
charset utf-8; #指定字符集
client_max_body_size 75M;
location / {
uwsgi_pass 172.31.135.11:8001; # 重点,这个文件与uwsgi.ini里的socket一样,
include /etc/nginx/uwsgi_params; # 这个就是在nginx目录下自带的,通过着两个配置,将Nginx与uwsgi关联起来
}
location /static {
alias /var/www/fog_detect/static; # 项目的静态文件存放地址(收集静态文件之后的存放地址)
}
location /media {
alias /root/home/fog_detect_env/FogDetect/media; # 上传到项目中的文件存放地址
}
}
三、静态文件收集
其实静态文件可以交给Nginx来处理,而不必再令uwsgi来处理,这样耦合度更低,效率更高。
收集静态文件首先要配置Django里的settings文件。在末尾添加
STATIC_ROOT = '/var/www/项目名/static/'
这里要先在该位置创建对应的文件夹,然后给予读写权限(chmod 777 /xx/xx),至于为什么选择放在这里,我暂时还没有研究过,不知道是不是能随便选个文件目录。总之以后每增加一个项目,都将之收集到这里来。
settings配置完之后,进入到manage.py文件所在目录,如果是有虚拟环境,那么要先进入虚拟环境,运行
python manage.py collectstaic
这样,所有的静态文件(除了自己写的css,js,图片文件,还有django自带的admin后台静态文件)都被收集(复制?)到static_root所指定的路径下了
最后,重新启动uwsgi和Nginx,然后通过浏览器访问自己设置的域名
或者公网ip:server里监听的端口号
就可以看到项目已经被部署好了。
这样,我的项目部署也算是完成了。对于nginx和uwsgi也算是入门了吧。
一些我遇到的坎(待续):
1.nginx安装不成功,错误为nginx-core以及另外两个包安装不成功
原因:之前我已经配置安装过一次,但是没成功,就暂时搁置了,后来有些文件没删除干净,导致产生了冲突,
办法: 将上一次配置的烂摊子全部删除掉
参考办法:https://segmentfault.com/a/1190000014027697?utm_source=tag-newest
2.uwsgi.ini文件配置好后启动不成功
原因未知,删除了uid和pid配置选项后就正常运行了。
3.nginx -t出现错误
原因: .conf配置文件中键值对中间写成了 : (冒号),应该为空格
4.nginx一直启动失败:
我是因为没有意识到我装了两个Nginx,一个是之前编译安装的,一个是我get-apt install nginx
的,两中安装方式文件存放位置不一样,前者默认位置为/usr/local/nginx/
, 后者默认位置为/etc/nginx
,等我意识到这之后,我已经来来回回辗转着两个文件夹n次了
解决办法: 根除上次安装过的Nginx就行了。
我未完成的(待续):
1.一个nginx配置多个项目
- emperor/vassal皇帝/臣子模式
- uwsgi 的vhost模式
一些看了很有帮助的参考文档:
uwsgi官方文档(中文) : https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/index.html
django+nginx+uwsgi部署教程: http://www.cnblogs.com/fnng/p/5268633.html