DJango部署 Gunicorn+Nginx+Django+supervisor+Virtualenv

这两天部署了一下自己写的django blog 记录一下备忘

  • 系统:Ubuntu 16.04.2

  • 部署方案:Gunicorn+Nginx+Django+supervisor+Virtualenv

  • virtualenv 创建一个python3环境用于运行django blog

安装相关软件

1
2
3
4
5
6
7
apt-get install nginx                            //安装nginx

systemctl enable nginx //设置nginx开机自启动

apt-getinstall python3 python3-pip //安装python3和PIP

python3-m pip install virtualenv //安装virtualenv

创建项目环境

1
2
3
4
5
6
7
8
9
10
11
mkdir  /django                                        //dango相关主目录

mkdir /django/site //用来放网站文件

mkdir /django/env //用来放虚拟环境目录

创建虚拟环境

cd/django/env

virtualenv --python=python3 django //这个用来跑django项目

拉取django项目文件并安装项目依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cd/django/site

git cloneXXXXXXXX(你的项目git仓库地址) //拉取项目

cd Django-project(你的Django项目)

source /django/env/django/bin/activate //激活虚拟环境

pip install -r requirements //安装项目依赖这步不懂的自行百度pip

安装完毕依赖后

python manager.py runserver //测试一下项目和环境在本机能正常访问127.0.0.1:8000表示正常

pip install gunicorn //在虚拟环境下安装gunicorn

pip install gevent//在虚拟环境下安装gevent

django相关配置

1
2
3
4
5
6
7
8
9
10
11
配置项目settings.py

INSTALLED_APPS下添加gunicorn

DEBUG= False //关闭调试模式

ALLOWED_HOSTS= ['*'] //我直接设成所有了也可以根据自己需要设置

STATIC_ROOT= os.path.join(BASE_DIR, 'static') //设置静态文件目录

python manage.py collectstatic //收集静态文件(在django虚拟环境下执行)

测试gunicorn

1
2
3
4
5
6
7
8
9
使用gunicorn替换runserver启动django

激活虚拟环境切换到Django项目根目录

gunicorn --worker-class=gevent blogprject.wsgi:application

//blogprject就是你的项目名称内有setting.py和wsgi.py的那个文件夹的名字

无报错,能正常访问127.0.0.1:8000表示成功

配置 nginx

vim /etc/nginx/sites-available/default //ubuntu下是这个配置文件(记得先备份)其他系统一般是 /etc/nginx/nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {

listen 80;

server_name 127.0.0.1:8000;
access_log /var/log/nginx/django.log;

location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location /static/ { #静态文件引用所有url中带static的都指向下面的目录
root /django/site/Django-project; #Django项目所在目录
}

location /media/ { #同上这个文件我的项目中是放图片和头像的
root /django/site/Django-project;
}

}

测试 先开启nginx 再运行 gunicorn 后 访问服务器外网IP 能正常访问–正常

配置 supervisor

守护进程 作用自行百度我的理解 就是 保证 gunicorn 进程一直存在 方便启动和停止
superisor 不支持python3 不过不影响使用

1
2
3
4
apt-get install python-pip                //安装python2下的pip ubuntu自带python2.7
pip install supervisor //直接在ubuntu中安装 不是虚拟环境
echo_supervisord_conf > supervisor.conf //创建配置文件
vim supervisor.conf //编辑配置文件

激活web页面对比一下原配置文件去掉冒号就行了
image.png

image.png
配置要守护的进程 gunirorn
image.png
说明:/django/env/django/bin/gunicorn 是虚拟目录django的路径

supervisor操作

• supervisord -c supervisor.conf //启动supervisor程序
• supervisorctl //进入交互式界面 输用户名密码(默认 user/123 配置文件里有)
• status //查看APP状态

image.png
• start all start django //启动所有app或者启动指定
• stop 同上
• 测试 能否通过 supervisor 启动或停止 gunicron

设置supervisor开机自启动

创建启动文件 vim /lib/systemd/system/supervisord.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[Unit]

Description=Process Monitoring and Control Daemon

After=rc-local.service


[Service]

Type=forking

ExecStart=/usr/local/bin/supervisord -c /django/supervisor.conf // /django/supervisor.conf配置文件的路径最好使用绝对路径

SysVStartPriority=99


[Install]

WantedBy=multi-user.target

systemctl stop supervisord.service
systemctl start supervisord.service
测试能都通过上述命令 停止和启动 supervisor 如果可以表示成功
systemctl enable supervisord.service 设置开机自启动因为在 配置文件中已经开启了 gunicron app 随supervisor启动后自启
确保nginx也是开机自启动后,尝试 reboot 系统
如重启后能正常访问页面表示成功!!

####使用 Fabric
还可以使用 fabric 进一步自动化部署
更新服务器上代码的步骤一般有这么几个吧?

  • 到github上下载更新的代码
  • 重新收集一下静态文件
  • 重新启动 gunicorn
  • 重新启动 nginx
    最少也要上面四个步骤吧?如果每次更新都这样来一遍页很麻烦吧?

所以该 Fabric 这个神器出场啦。。。。


 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×