最近线上部署运维工单系统,使用django+uwsgi+nginx部署,发现这篇文章,很详细,觉得不错,转载一下:
写了那么长时间的django,一直没跟nginx结合一下,访问的时候老是得加端口号,觉得不爽。故想到部署到nginx上面。
环境:python:2.7.6
nginx:1.0.5 (yum直接安装的,版本好低的说,需要高版本的可以自行编译安装这都不是重点)
uWSGI: 2.0.10 (pip install uwsgi直接安装的,安装完成会提示你安装到哪了,我的是/usr/local/python27/bin/uwsgi,将uwsgi复制到/usr/bin/下面,方便直接运行)
django : 1,7,1
环境介绍完毕,开搞。
首先要有一个django项目,至于怎么创建就不赘述了,既然能找这篇文章看,对django肯定是了得的差不多了。
一。编辑nginx的配置文件
由于我是yum安装的,我的配置文件在/etc/nginx/目录下,自行编译的根据自己实际情况查找。为了方便管理我就放在了/etc/nginx/conf.d/,没错就是放vhosts配置文件的目录里面。
稍微话唠一下:由于yum安装的nginx 会在/etc/nginx/conf.d/
目录下生成default.conf配置文件,防止冲突就把它重命名好了.编辑django.conf(任意起名)
django.conf
server { listen 80; server_name localhost; location / { root /djangoproject/cmdb04; #这个是我django项目所在的绝对路径,cmdb04是我的项目名,下同 include uwsgi_params; uwsgi_pass 127.0.0.1:9000; #这个要跟之后配置的uwsgi配置文件保持一致 uwsgi_param UWSGI_CHDIR /djangoproject/cmdb04; #这个也是我django项目所在的绝对路径 uwsgi_param UWSGI_SCRIPT django_wsgi;#这个要和uwsgi配置文件里module的内容一致,嗯,应该是这样 #access_log off; access_log /var/log/nginx/access.log; #日志存放目录,当然前提是这个目录要事先存在,不然启动nginx会报错,手动创建就好了。 } location /statics/ { #这个statics名称要跟django setting文件里静态目录的配置保持一致,不然的话css等静态文件会找不到。 alias /djangoproject/cmdb04/statics/; #这个就是statics所在的目录 index index.html; } }
二。配置uWSGI。
在nginx目录创建一个uwsgi配置文件(当然了这个配置文件放在哪都行,只要你能找到的就行,那小弟先放/etc/nginx/下了哈)
uwsgi.xml <uwsgi> <socket>127.0.0.1:9000 </socket> #和nginx配置一致 <listen>80</listen> <master>true </master> <pidfile>/usr/local/nginx/uwsgi.pid </pidfile> <processes>8 </processes> <pythonpath>/djangoproject/cmdb04 </pythonpath> #我的django项目路径 <module>django_wsgi</module> #和nginx里配置一致 <profiler>true </profiler> <memory-report>true </memory-report> <enable-threads>true </enable-threads> <logdate>true </logdate> <limit-as>6048 </limit-as> <daemonize>/tmp/uwsgi.log</daemonize> #日志存放位置 </uwsgi>
uwsgi.xml里其他一些配置暂且保持一致就行了,可根据自己要求修改。
三。创建django应用模块。
1.情况一:如果你的django项目是使用IDE创建的,那么在你的项目下应该会有wsgi.py这个文件,我的是在/djangoproject/cmdb04/cmdb04/(就是两个cmdb04,cmdb04是我的项目名),
直接复制到项目的根目录下,并重命名为django_wsgi.py。为什么是这个文件名呢,因为你在nginx配置文件和uwsgi配置文件的module都是写的这个文件名。如果没找到wsgi.py这个文件,那么别费劲了,直接看情况二吧。
2.情况二:就是没找到那个wsgi.py,那就手动创建吧。在django项目根目录下创建django_wsgi.py文件。
uwsgi.py
i
mport os os.environ['DJANGO_SETTINGS_MODULE'] = 'cmdb04.settings' #注意cmdb04要改成你的项目名 from django.core.wsgi import get_wsgi_application application = get_wsgi_application()
四。写一个uwsgi的启动脚本,方便start,stop,restart
uwsgi #!/bin/bash # uwsgi script # it is v.0.0.1 version. # chkconfig: - 89 19 # description: uwsgi script # processname: uwsgi PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH uwsgi_config=/etc/nginx/uwsgi.xml #这里要配置对刚才写的uwsgi.xml路径 uwsgi_pn=`ps aux|grep -v "grep"|grep -c "uwsgi"` uwsgi_pid=`ps -eo pid,comm|grep uwsgi|sed -n 1p|awk '{print $1}'` uwsgi_PID=/usr/local/nginx/logs/uwsgi.pid uwsgi=/usr/bin/uwsgi #最开始就让你复制到这里了,啥?找不到了?那自己用locate命令找吧 RETVAL=0 prog="uwsgi" # Source function library. . /etc/rc.d/init.d/functions if [ $(id -u) != "0" ]; then printf "Error: You must be root to run this script!\n" exit 1 fi # Start nginx daemons functions. start() { if [ $uwsgi_pn -gt 5 ];then action "uwsgi is running!" /bin/true exit 0 fi daemon $uwsgi -x ${uwsgi_config} action "uwsgi start ..." /bin/true } # Stop nginx daemons functions. stop() { if [ $uwsgi_pn -gt 5 ] then kill -9 `ps -eo pid,comm|grep uwsgi|sed -n 1p|awk '{print $1}'` RETVAL=$? action "uwsgi stopping ..." /bin/true else action "uwsgi not running!" /bin/false fi } # See how we were called. case "$1" in start) start ;; stop) stop ;; reload) reload ;; restart) stop start ;; *) echo $"Usage: $prog {start|stop|restart}" exit 1 esac exit $RETVAL
五.万事大吉了,可以启动测试了
server nginx start
server uwsgi start
注意查看端口中是否存在uwsgi的9000端口
linuxcmd: netstat -antpl | grep uwsgi
linuxout: tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 6780/uwsgi
六。如果没成功,请从头排查一遍。