使用Nginx+Gunicorn+virtualenv+supervisor来部署django项目
安装Virtualenv
终端下输入 sudo pip3 install virtualenv virtualenv
可以创建一个拥有自己安装目录的环境, 这个环境不与其他虚拟环境共享库, 能够方便的管理python版本和管理python库。 下面是创建python3的虚拟环境
#创建ENV目录 root@dev:~# cd ~ && mkdir ENV && cd ENV root@dev:~/ENV# ls #创建python3虚拟环境,实际路径要看自己的python3安装目录 root@dev:~/ENV# virtualenv -p /usr/local/python3/bin/python3.6 python3 Running virtualenv with interpreter /usr/bin/python3 Using base prefix '/usr' New python executable in /root/ENV/python3/bin/python3 Also creating executable in /root/ENV/python3/bin/python Installing setuptools, pip, wheel...done.
看到类似这样的输出说明虚拟环境我们已经创建成功,下面是使他生效:
root@dev:~/ENV# source python3/bin/activate (python3) root@dev:~/ENV#
注意,在虚拟环境生效之后前面会有(python3)的提示,来指示现在所生效的虚拟环境名。 在创建虚拟环境的时候,如果加上--system-site-packages的话会集成系统现有的包。 这样,虚拟环境就生效了,我们就可以使用pip来安装包而不会和系统的包发生冲突。 关闭可以使用如下命令来退出现在的虚拟环境:
(python3) root@dev:~/ENV# deactivate root@dev:~/ENV#
可以看到,在退出之后前面的(python3)就会消失掉。 接下来就是安装gunicorn和django等包,直接使用pip安装即可。注意是在之前创建的虚拟环境生效的前提下来安装。下面会介绍gunicorn。pip install django gunicorn
配置gunicorn
Gunicorn (独角兽)是一个高效的Python WSGI Server,通常用它来运行 wsgi application(由我们自己编写遵循WSGI application的编写规范) 或者 wsgi framework(如Django,Paster),地位相当于Java中的Tomcat。 在我们要部署的Django项目中执行如下命令来尝试运行: gunicorn DjangoBlog.wsgi:application -b 0.0.0.0:6666 DjangoBlog为要运行的Django项目名,如果有类似如下输出则说明成功执行:
上面的命令是一个简单的测试,为了真正在生产环境下使用Gunicorn,我们还需要增加一些配置。我们把这些配置文件写成一个bash脚本,保存为bin/gunicorn_start(这里我是自己的项目代码文件夹下创建的bin文件夹)
#!/bin/bash NAME="DjangoBlog" DJANGODIR=/root/test/DjangoBlog #Django project directory SOCKFILE=/root/test/DjangoBlog/run/gunicorn.sock # we will communicte using this unix socket USER=root # the user to run as GROUP=root # the group to run as NUM_WORKERS=2 # how many worker processes should Gunicorn spawn DJANGO_SETTINGS_MODULE=DjangoBlog.settings # which settings file should Django use DJANGO_WSGI_MODULE=DjangoBlog.wsgi # WSGI module name echo "Starting $NAME as `whoami`" # Activate the virtual environment cd $DJANGODIR source /root/ENV/python3/bin/activate export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE export PYTHONPATH=$DJANGODIR:$PYTHONPATH # Create the run directory if it doesn't exist RUNDIR=$(dirname $SOCKFILE) test -d $RUNDIR || mkdir -p $RUNDIR # Start your Django Unicorn # Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon) #gunicorn目录(刚刚创建的虚拟环境的bin目录中) exec /root/ENV/python3/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \ --name $NAME \ --workers $NUM_WORKERS \ --user=$USER --group=$GROUP \ --bind=unix:$SOCKFILE \ --log-level=debug \ --log-file=-
添加可执行权限: sudo chmod u+x bin/gunicorn_start 然后就可以尝试执行这个脚本了: ./bin/gunicorn_start 如果看到类似下面对输出说明已经成功了: (请注意,项目所需要的所有包与模块,还有刚刚安装的gunicorn,都必须在Virtualenv 虚拟环境下安装一次,否则将提示缺失模块)
如果你在上面的过程中设置了自定义的参数的话,需要将gunicorn_start脚本中对应的参数改过来。其中,worker的数量推荐设置为2 * CPUs + 1,这样的话,在任何时候都有一半的worker在做IO
安装Supervisor
Superviosr是一个进程监管的工具。简而言之,Superviosr可以保证你的程序在服务器开机时自动启动以及程序意外终止时重新启动。通过下面的命令即可安装:
下载supervior源文件
wget https://pypi.python.org/packages/31/7e/788fc6566211e77c395ea272058eb71299c65cc5e55b6214d479c6c2ec9a/supervisor-3.3.3.tar.gz tar xvf supervisor-3.3.3.tar.gz cd supervisor-3.3.3/ # 由于supervior不支持python3,这里我们暂时退出虚拟环境,使用python2安装 deactivate python setup.py install
1.Superviosr通过配置文件来设置被监管的程序。一般配置文件都放置在/etc/supervisor/conf.d路径下面。如没有则直接创建
mkdir -m 755 -p /etc/supervisor/ mkdir -m 755 conf.d echo_supervisord_conf > /etc/supervisor/supervisord.conf
2.此处我们创建一个名为djaogoblog.conf的配置文件,内容如下:
[program:djangoblog] # django项目下,刚刚创建的gunicorn文件路径 command = /root/test/DjangoBlog/bin/gunicorn_star user = root autostart=true autorestart=true redirect_stderr = true stdout_logfile = /root/logs/blog/robot.log stderr_logfile=/root/logs/blog/err.log
日志目录还需要手动创建下: mkdir -p /root/logs/blog,也可以顺便把2个文件创建了
3.添加配置文件到主配置文件 打开/etc/supervisor/supervisord.conf 文件,到最后一行可以看到
;[include] ;files = /relative/dictory/*.ini
删除这里的分号,然后添加我们配置文件/etc/supervisor/conf.d/djangoblog.conf,修改后如下
[include] files = /etc/supervisor/conf.d/djangoblog.conf
多个路径用空格隔开就可以了
4.启动supervisor
supervisor有两个命令,supervisord和supervisorctl,通过supervisord管理启动和配置supervisor本身,通过supervisorctl来管理使用supervisor启动和管理的自身的一些应用,如我们的这里的app.py 启动supervisor 用命令 supervisord -c /etc/supervisor/supervisord.conf 关闭supervisor 用命令 supervisorctl shutdown 如果先建的djangoblog.conf(控制文件),在使用启动命令后这些经过配置的程序也会启动 启动程序 supervisorctl start program_name 这里的program的name是配置文件ini中的[program:name],所以这里的program_name是djangoblog 关闭程序 supervisorctl stop program_name 刷新配置文件 如果启动后,修改了ini文件,可以通过reload命令来刷新 supervisorctl reload 查看supervisor的运行状态 ps -efH|grep supervisor
这里提醒一下如果按以上操作出现以下error:
Error: .ini file does not include supervisorctl section For help, use /usr/local/bin/supervisorctl -h
切换到/etc/supervisor目录执行以上的命令
执行supervisorctl start APP_NAME 或者执行 supervisorctl 的相关命令,如果出现
unix:///tmp/supervisor.sock no such file
说明 Supervisord 服务还没有启动,检查你的 supervisord.conf 文件最后的注释 ; 取消,files 路径没有问题
[include] files = ./conf.d/*.ini ./conf.d/*.conf
之后在目录 /etc/supervisor 下重新运行 supervisord -c /etc/supervisor/supervisord.conf
重新 read 配置文件: supervisorctl reread
重启服务: supervisorctl reload
关闭服务: supervisorctl shutdown
完成supervisor配置并启动后,收到监管的Gunicorn会随之启动,并运行Django配置好的Django项目,无需单独启动Gunicorn
Nginx配置
通过whereis nginx确认你的nginx安装目录,以我的/usr/local/nginx/为例
切换到配置文件目录下
cd /usr/local/nginx/conf/ # 备份配置文件 cp nginx.conf nginx.conf.cp # 修改配置文件 vim nginx.conf
删除http{}中的server{}项,添加如下代码:
upstream djangoblog { # 自动生成的gunicorn端口文件位置 server unix:/root/test/DjangoBlog/run/gunicorn.sock fail_timeout=0; } server { server_name blog.weibn.me; # 你的django项目主目录 root /root/test/DjangoBlog; listen 80; keepalive_timeout 70; #access_log /var/log/nginx/django_access.log; #error_log /var/log/nginx/django_error.log; location /static/ { expires max; # static目录 alias /root/test/DjangoBlogcollectedstatic/; } location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; if (!-f $request_filename) { proxy_pass http://djangoblog; break; } } }
保存并退出。 由于我的Nginx环境没有配好,为了确保读取到此配置文件,图省事,我在Django项目下创建一个 nginx_start.sh脚本文件:
service nginx stop; cd /usr/local/nginx/sbin/; ./nginx -c /usr/local/nginx/conf/nginx.conf
需要重启nginx时, ./nginx_start.sh 运行脚本即可,同理supervisor也可如此设置,当然这是比较蠢的方法。
完结
到此,整个项目的部署基本完成。由于每个人linux内核、版本各不相同,不保证能作用于其它人,但大致流程都是差不多,细节上用好搜索引擎相信都可以解决。
一年前个人网站的搬运过来一下 - -