Python部署手记:django, gunicorn, virtualenv, circus, nginx
手记,以免下次配置再入坑。有些细节未做详细描述,如果有问题,可以评论或私信我。
初次尝试搭python服务器,强撸python3,花样作死。过程中出现各种错误,不停google,搜到的时间大部分在2012年-2014年。让我不禁怀疑,真的没人用py搭服务器嘛?怎么比ruby还少。。。
相关技术点:django, gunicorn, virtualenv, circus, nginx
陆续花了一个月时间,先是折腾flask,完了折腾django,再到部署。感觉身体被掏空。说好的人生苦短,要用python呢。相比之下PHP部署简单多了(主要是傻瓜式的一键安装,很多vps都提供PHP预装环境)。
deploy.png
至少打开了10倍于上图的tabs。简直丧心病狂。
下面记录在部署django中的一些细节。以免以后再google来回折腾。
服务器: 阿里云 ubuntu
创建新用户
在root下创建新的user
→ ~ useradd -d /home/stay4it -s /bin/bash -m stay4it
→ ~ passwd stay4it
→ ~ usermod -a -G admin stay4it
→ ~ vi /etc/sudoers
#在root权限下添加stay4it权限
stay4it ALL=(ALL:ALL) ALL
exit 尝试用新用户登陆。登陆后会发现你所在的根目录为/home/stay4it
python环境
python3.5.2还是python2.7.6?自行安装
要是当初不执着于python3,也就不会出那么多幺蛾子了。
virtualenv (可选)
为每个python app创建一个独立开发环境。(如果确定只用python3|python2,大可不必安装)
stay4it@:~$ pip3 install virtualenv
stay4it@:~$ pip3 install virtualenvwrapper
编辑 .bashrc
vi .bashrc
export WORKON_HOME=/home/stay4it/.virtualenvs
VIRTUALENVWRAPPER_PYTHON='/usr/bin/python3'
source /usr/local/bin/virtualenvwrapper.sh
source .bashrc
创建一个开发环境
stay4it@:~$ mkvirtualenv stay4it
stay4it@:~$ workon stay4it
deactivate
创建出来的虚拟环境在 /home/stay4it/.virtualenvs/stay4it
git 导入项目
安装git
mkdir test
git init
git remote add origin https://git.oschina.net/stay4it/test-deploy.git
git pull
测试run server
workon stay4it
pip3 install -r requirements.txt
python3 manage.py migrate
python3 manage.py runserver 8081
能跑起来就算成功
gunicorn
stay4it@:~$ workon stay4it
pip3 install gunicorn
cd project/
vi gunicorn.conf
修改gunicorn.conf
##指定workers的数目,使用多少个进程来处理请求
workers = 3
##绑定本地端口
bind = '127.0.0.1:8081'
gunicorn testdeploy.wsgi -c gunicorn.conf
能跑起来也算成功
circus 监控端口,自动重启
如果用python2,可以用supervisor,circus是supervisor在python3上的替代品。
退出virtualenv(deactivate) pip3 install circus
vi /etc/circus.ini
[circus]
check_delay = 5
endpoint = tcp://127.0.0.1:5555
pubsub_endpoint = tcp://127.0.0.1:5556
statsd = true
[watcher:test]
working_dir = /home/stay4it/test/
cmd = gunicorn
args = testdeploy.wsgi -c gunicorn.conf
uid = stay4it
numprocesses = 3
send_hup = true
autostart = true
stdout_stream.class = FileStream
stdout_stream.filename = /home/projects/log/test-deploy.log
stdout_stream.max_bytes = 10485760
stdout_stream.backup_count = 4
## 使用virtualenv独立开发环境
copy_env = True
virtualenv = /home/stay4it/.virtualenvs/stay4it/
sudo service circus start|stop
通过启动circus服务,可以自动去跑circus.ini里的watcher。当这个watcher未启动时,自动启动。cmd+args实际上还是用gunicorn来起服务的。
nginx 反向代理
sudo apt-get install nginx sudo service nginx start|stop|restart
向nginx中添加project代理
sudo vi /etc/nginx/sites-available/default
server {
listen 80;
server_name test.stay4it.com;
root /home/stay4it/test/;
error_log /home/stay4it/logs/access.log;
location / {
proxy_pass http://localhost:8081;
}
}
sudo service nginx start
本机自动部署 fabric
ssh到服务器不是那么友好,可以用fabric来完成自动部署。
退出virtualenv(deactivate)
python3版本
pip3 install fabric3
在本机project根目录添加fabfile.py, 你可以把这个py文件当作一个脚本,这样就不用在ssh到服务器去部署。本机直接跑fab就可以部署了。
# -*- coding:utf-8 -*-
from fabric.api import *
# 服务器登录用户名:
env.user = 'stay4it'
# 服务器地址,可以有多个,依次部署:
env.hosts = ['ip', ]
env.passwords = {
'root@[hostname]': '',
}
# 不用密码也可以用ssh登录
# env.key_filename = '~/.ssh/id_rsa'
_REMOTE_BASE_DIR = '/home/stay4it/test'
def deploy():
with cd(_REMOTE_BASE_DIR), prefix("source /home/stay4it/.virtualenvs/stay4it/bin/activate"):
run('git pull')
run('pip3 install -r requirements.txt')
run('python3 manage.py migrate')
# run('gunicorn testdeploy.wsgi -c gunicorn.conf')
run('sudo service circus restart')
# run('sudo service nginx restart')
fab deploy
后续
可以再添加ssh rsa,这样就不用总是用密码登录。
看起来蛮简单的,真正配起来问题多多。身边如果有个python大神就好了(求介绍)。自己折腾太耗时了。
期间很多技术选型都被误导了,很多python2的库在python3上都木有。很多部署都有个人偏好。比如不要django选flask,不要circus选supervisor。同事还给我推荐了ansible,capistranorb。累积的学习成本超高。也不知道当时到底哪个筋搭错了,非用python搭服务器。PHP才是最好的语言啊。
难者不会,会者不难。所有的轻车熟路都是刮蹭来的~
原文链接:http://www.jianshu.com/p/78ec16754924
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python|运算符的运用
- Windows下登录凭证窃取技巧
- 小浩发现这篇浮点数的文章讲的真不错!
- 安全攻击溯源思路及案例
- 图解:「归并排序」
- STM32CubeMX6.0 + HAL + LittleVGL7.6 等学习[最全附工程源码]
- 国庆期间,我造了台计算机
- 编程语言的 IDE 支持
- 独家 | 手把手教你用Python的Prophet库进行时间序列预测
- 【Git】:基础的基础
- windows解决SpringBoot启动时:APPLICATION FAILED TO START
- 【Git】:基础操作篇
- 低光照图像增强算法汇总
- 用Python解决女朋友看电影没字幕的需求
- 【Git】:基础协作篇