使用Nginx+Gunicorn+virtualenv+supervisor来部署django项目

安装Virtualenv

终端下输入 sudo pip3 install virtualenv virtualenvhtml

能够建立一个拥有本身安装目录的环境, 这个环境不与其余虚拟环境共享库, 可以方便的管理python版本和管理python库。 下面是建立python3的虚拟环境python

#建立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.

  看到相似这样的输出说明虚拟环境咱们已经建立成功,下面是使他生效:linux

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 gunicornios

配置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项目名,若是有相似以下输出则说明成功执行: nginx

上面的命令是一个简单的测试,为了真正在生产环境下使用Gunicorn,咱们还须要增长一些配置。咱们把这些配置文件写成一个bash脚本,保存为bin/gunicorn_start(这里我是本身的项目代码文件夹下建立的bin文件夹)django

#!/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 虚拟环境下安装一次,不然将提示缺失模块) vim

若是你在上面的过程当中设置了自定义的参数的话,须要将gunicorn_start脚本中对应的参数改过来。其中,worker的数量推荐设置为2 * CPUs + 1,这样的话,在任什么时候候都有一半的worker在作IObash

 

安装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路径下面。如没有则直接建立app

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内核、版本各不相同,不保证能做用于其它人,但大体流程都是差很少,细节上用好搜索引擎相信均可以解决。

一年前我的网站的搬运过来一下 - -

相关文章
相关标签/搜索