最近由于因为课程要求,使用nginx部署一个基于Django的网站。部署流程官网上写的很详细了,但由于刚开始对nginx不太熟悉,在部署的时候还是遇到一些坑的,于是在这里做一总结与分享。
0x00 What is nginx?
第一个坑就是什么是nginx,nginx是一个反向代理服务器(Reverse Proxy),那么问题来了,什么是反向代理服务器呢?大家可能对代理服务器都不陌生,比如当你需要访问一些不(bei)存(qiang)在的网站的时候,可能就会用到代理服务器,绕过阻碍,到达目的地。在这个过程中,代理服务器是代替客户访问网站的服务器,也许称作「代理客户」更容易理解,客户是在「代理客户」的后面。而反向代理则是代替网站服务器最先接受客户的访问,网站服务器是在「代理服务器」的后面。上图非常直观说明了反向代理服务器的原理。
0x01 Why nginx?
简单来说,使用反向代理服务器的优势除了安全上的考虑之外,主要就是性能上的考虑。nginx主要负责处理静态文件,当客户频繁访问静态文件的时候就会影响后端服务器的响应,这里就可以考虑使用nginx作为静态文件的缓存服务器,之前被客户访问过的静态文件就可以由nginx服务器直接返回给客户,从而减少对后端服务器的http请求,达到提高整体性能的目的。
0x02 uWSGI vs WSGI
首先,WSGI是python定义的Web服务器网管接口(Web Service Gateway Interface),它定义了web服务器如何跟web框架(如Django)交互规则,而uWSGI则是WSGI规则下的一个实现,同样在WSGI规则下的实现还有CherryPy等,简单来说,WSGI是一套协议,而uWSGI则是协议的实现。在这里,uWSGI扮演了nginx与Django之间通信的通道:
client <-> nginx <-> uWSGI <-> Django
0x03 Tips
Virtualen
Virtualenv是一个非常好用的工具,可以让你的某个项目的python依赖环境与主机的环境隔离。使用virtualenv有助于不同项目之间依赖的隔离,同时也方便项目复用以及团队协作。常用的命令如下:
创建一个新的环境(在当前目录下):
$ virtualenv env
激活某个环境:
$ source env/bin/activate
将当前依赖文件导出:
$ pip freeze > requirement.txt
依赖文件导入:
$ pip install -r requirement.txt
更加详细的使用可以参见官方文档。
Shell Script
启动配置网站的参数太难记了,程序员都是懒人,懒人就要有懒人的方法,干脆就写一个脚本自动化部署吧。脚本很简单易用,在这里共享给大家:
if [ ! -n "$1" ]
then
echo "Usages: sh uwsgiserver.sh [start|stop|restart]"
exit 0
fi
if [ $1 = start ]
then
psid=`ps aux | grep "zh" | grep -v "grep" | wc -l`
if [ $psid -gt 4 ]
then
echo "uwsgi is running!"
exit 0
else
uwsgi --ini /path/to/your/uwsgi.ini
echo "Start uwsgi service [OK]"
fi
elif [ $1 = stop ];then
killall -s INT /home/ubuntu/.virtualenvs/zh/bin/uwsgi
echo "Stop uwsgi service [OK]"
elif [ $1 = restart ];then
killall -s INT uwsgi
uwsgi --ini /path/to/your/uwsgi.ini
echo "Restart uwsgi service [OK]"
else
echo "Usages: sh uwsgiserver.sh [start|stop|restart]"
fi
Error.log
nginx提供了非常强大的日志功能,通过查看日志可以迅速发现问题,例如:
$ tail -1 /var/log/nginx/error.log
2015/11/17 23:30:44 [crit] 13983#0: *86821 connect() to unix:///tmp/website.sock failed (2: No such file or directory) while connecting to upstream, client: 61.160.213.32, server: 128.199.67.228, request: "GET http://zc.qq.com/cgi-bin/chs/numreg/init? HTTP/1.0", upstream: "uwsgi://unix:///tmp/website.sock:", host: "zc.qq.com"
这里可以发现.sock文件的路径出错导致网站无法访问。
nginx还可以配置日志的路径已经格式,更多资料可以参看nginx官网
0x04 总结
虽然是个简单的课程作业,简单使用nginx部署Django,但在这个过程中学习了很多有关运维的知识,深深体会到运维工程师工作的艰辛。虽然将来不会从事运维方面的工作,但作为一个有追求的程序员还是要了解服务器的工作原理,典型的网络框架,以及部署网站的一些技巧。生命不息,折腾不止~