python部署手记:django, gunicorn, virtualenv, circus, nginx
admin
2023-07-30 21:24:13
0

手记,以免下次配置再入坑。有些细节未做详细描述,如果有问题,可以评论或私信我。

初次尝试搭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才是最好的语言啊。

难者不会,会者不难。所有的轻车熟路都是刮蹭来的~

上一篇:python中的装饰器

下一篇:Django学习笔记

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...