这两天部署了一下自己写的django blog 记录一下备忘
系统:Ubuntu 16.04.2
部署方案:Gunicorn+Nginx+Django+supervisor+Virtualenv
virtualenv 创建一个python3环境用于运行django blog
1.安装相关软件
apt-get install nginx //安装nginx
systemctl enable nginx //设置nginx开机自启动
apt-getinstall python3 python3-pip //安装python3和PIP
python3-m pip install virtualenv //安装virtualenv
2.创建项目环境
mkdir /django //dango相关主目录
mkdir /django/site //用来放网站文件
mkdir /django/env //用来放虚拟环境目录
创建虚拟环境
cd/django/env
virtualenv --python=python3 django //这个用来跑django项目
3.拉取django项目文件并安装项目依赖
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
4.django相关配置
配置项目settings.py
INSTALLED_APPS下添加gunicorn
DEBUG= False //关闭调试模式
ALLOWED_HOSTS= ['*'] //我直接设成所有了也可以根据自己需要设置
STATIC_ROOT= os.path.join(BASE_DIR, 'static') //设置静态文件目录
python manage.py collectstatic //收集静态文件(在django虚拟环境下执行)
5.测试gunicorn
使用gunicorn替换runserver启动django
激活虚拟环境切换到Django项目根目录
gunicorn --worker-class=gevent blogprject.wsgi:application
//blogprject就是你的项目名称内有setting.py和wsgi.py的那个文件夹的名字
无报错,能正常访问127.0.0.1:8000表示成功
默认用的是8000端口 如果要在一台服务器上部署多个网站可以指定别的端口
-b 127.0.0.1:8080 这个参数可以指定别的端口
6.配置 nginx
vim /etc/nginx/sites-available/default //ubuntu下是这个配置文件(记得先备份)其他系统一般是 /etc/nginx/nginx.conf
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 能正常访问--正常
7.配置 supervisor
守护进程 作用自行百度我的理解 就是 保证 gunicorn 进程一直存在 方便启动和停止
superisor 不支持python3 不过不影响使用
apt-get install python-pip //安装python2下的pip ubuntu自带python2.7
pip install supervisor //直接在ubuntu中安装 不是虚拟环境
echo_supervisord_conf > supervisor.conf //创建配置文件
vim supervisor.conf //编辑配置文件
激活web页面对比一下原配置文件去掉冒号就行了
配置要守护的进程 gunirorn
说明:/django/env/django/bin/gunicorn 是虚拟目录django的路径
supervisor操作
• supervisord -c supervisor.conf //启动supervisor程序
• supervisorctl //进入交互式界面 输用户名密码(默认 user/123 配置文件里有)
• status //查看APP状态
• start all start django //启动所有app或者启动指定
• stop 同上
• 测试 能否通过 supervisor 启动或停止 gunicron
设置supervisor开机自启动
创建启动文件 vim /lib/systemd/system/supervisord.service
[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上下载更新的代码
git pull # 抓取github上最新的代码
git checkout . && git clean -xdf #上一步可能会失败 执行该命令丢弃本地所有未提交的代码后重试
- 安装最新的依赖库
pip install -r requirements.txt
- 检查一下setting.py 文件中服务器部署相关配置还在不在
- 重新收集一下静态文件
- 重新启动 gunicorn或supervisor
- 重新启动 nginx
最少也要上面j几个步骤吧?如果每次更新都这样来一遍页很麻烦吧?