搜狐开源的 Python 项目自动化多服务器布置的东西

项目地点在:https://github.com/SohuTech/essay

项目背景和前因后果可浏览来自搜狐工程师的博文

引见:

essay是我们团队在过去两年Python项目延续布置上履历的总结,中心功用是打包和多Server布置。这个东西的重要功用是简化从开辟到布置的流程,轻易效劳器的扩大。除了打包和布置功用以外,essay还供应了其他的东西,在背面的接口形貌中有细致引见。

essay是基于Fabric开辟,在运用上依赖于pypi Server和github/Gitlab。

疾速最先

这里运用本身搭建的pypiserver作为pypi server,github作为代码堆栈。

  1. 装置essay: pip install essay
  2. github上建立项目:essay_demo_webpy
  3. 建立项目。终端上实行: es create essay_demo_webpy ,依据提醒输入你新建立的git堆栈地点,回车终了你会发明你的github上已有了初始化好的一个项目构造

    .
    └── essay_demo_webpy
        ├── MANIFEST.in
        ├── README.md
        ├── conf
        │   └── supervisord.conf
        ├── essay_demo
        │   ├── __init__.py
        │   ├── log.py
        │   ├── main.py
        │   └── settings.py
        ├── fabfile
        │   └── __init__.py
        └── setup.py
    
    4 directories, 9 files
    
  4. 打包项目。此时你能够在当地的essay_demo_webpy目次下实行: fab -l 敕令检察哪些敕令可用。然后实行 fab build.build 敕令,会帮你打包成tar的源码包,并增加版本后缀,如:essay_demo_webpy-3.11.20.1.tar.gz,以后会被上传到上面说到得pypiserver上。

    关于build.build有四个可选参数,fab build.build:name=fixbug,version=0.1,commit=451a9a2784f,branch=master,也能够运用位置参数: fab build.build:fixbug,0.1,451a9a2784f,master 。个中commit和branch不能同时设置,commit优先于branch起作用。

    各参数详解:

    name, 版本的后缀,如上例的结果是: essay_demo_webpy-0.1-fixbug.tar.gz
    varsion, 版本号,假如为空则会发生:essay_demo_webpy-3.11.20.1-fixbug.tar.gz。规则是:年.月.日.次
    commit, 是要打包的commit节点
    branch, 要打包的分支,默以为fabfile下__init__.py中的设置
    
  5. 布置项目。这时刻在pypiserver上已有了打好的包,假定为: essay_demo_webpy-3.11.20.1.tar.gz 。然后最先装置,实行: fab -R dev deploy:3.11.20.1,a,test 把项目装置到fabfile里设置的dev这个role的效劳器上,能够是一个或许多个server。

    deploy参数诠释:

    deploy背面有三个参数,离别示意:版本号,虚拟环境目次名,profile(会通报到supervisord.conf中)
    版本号在上面已提到,不赘述。
    虚拟环境目次名:依赖于fabfile中设置的 env.VIRTUALENV_PREFIX='~/essay_demo_webpy' ,这里参数为a,示意将在效劳器家目次下得essay_demo_webpy目次下建立一个目次为 a 的virtualenv环境。
    profile:用来控制顺序处于什么状况,比方能够通报debug进去,须要顺序本身处置惩罚。参数会被通报到supervisord.conf中。
    

deploy的内部的历程是:登录-R指定的效劳器,在设置的VIRTUALENV_PREFIX目次下建立a虚拟环境,以后在此环境中经由过程pip装置已打包好的项目,末了经由过程supervisord来启动顺序历程。

能够参考Demo:https://github.com/SohuTech/essay_demo_webpy 中的一些设置

设置文件详解

引见重要的两个设置文件fabfile和supervisord

fabfile设置

myproject/fabfile/init.py

一切env设置项,可依据本身营业删除/增加

    1. git效劳器

        env.GIT_SERVER = 'https://github.com/' # ssh地点只须要填:github.com

    2. 项目名(与git上项目名保持一致) 

        env.PROJECT = 'project_name'

    3. 项目在打包效劳器上的途径,会在此目次下实行打包操纵

        env.BUILD_PATH = '/opt/deploy/'

    4. 项目一切者(与git保持一致)

        env.PROJECT_OWNER = 'EssayTech'

    5. git默许分支

        env.DEFAULT_BRANCH = 'master'

    6. pypi-server地点

        env.PYPI_INDEX = 'http://pypi.python.org/simple/'

    布置相干:

    7. 布置启动历程数量

        env.PROCESS_COUNT = 2 #布置时启动的历程数量, 会通报到supervisord.conf中

    8. 效劳器角色, 打包或布置时经由过程 ``-R`` 参数指定效劳器角色, 每一个角色能够定义多组效劳器

        env.roledefs = {
        'build': ['username@buildserverip:port'], # 打包效劳器设置
        'dev': ['eassay@127.0.0.1:2202'],   #布置效劳器设置
        }

    9. 虚拟环境目次, 布置时会在效劳器上此目次下建立虚拟环境

        env.VIRTUALENV_PREFIX = '/home/SohuTech/project_name'

    12. supervisor设置文件地点, PROJECT_ROOT为项目根目次

        env.SUPERVISOR_CONF_TEMPLATE = os.path.join(PROJECT_ROOT, 'conf', 'supervisord.conf')

    13. 依据工程肯定项目编号, 差别虚拟环境监听差别的端口,用来设置一个统一机械多个虚拟环境。经由过程port参数传到supervisord.conf中。

        PROJECT_NUM = 88
        env.VENV_PORT_PREFIX_MAP = {
        'a': '%d0' % PROJECT_NUM,
        'b': '%d1' % PROJECT_NUM,
        'c': '%d2' % PROJECT_NUM,
        'd': '%d3' % PROJECT_NUM,
        'e': '%d4' % PROJECT_NUM,
        'f': '%d5' % PROJECT_NUM,
        'g': '%d6' % PROJECT_NUM,
        'h': '%d7' % PROJECT_NUM,
        'i': '%d8' % PROJECT_NUM,
        }


    nginx设置用于启动、住手、重启、修正设置文件:

    14. nginx实行文件地点

        env.NGINX_BIN = '/usr/local/nginx/bin/nginx'

    15. nginx设置文件地点

        env.NGINX_CONF = '/usr/local/nginx/conf/nginx.conf'

    16. 切换nginx环境(关于此项,请看下方essay高等功用用法)

        env.NGINX_SWITCH_CONF = '/etc/nginx/nginx.conf'

supervisord设置

myproject/conf/supervisor.conf

几个被替代的字段

    以下参数在fab deploy的时刻会替代为fabfile里设置的字段

    1. {{ run_root }}  虚拟环境地点,对应于fabfile/__init__.py里的env.VIRTUALENV_PREFIX

    2. {{ username }}   essay.task.util自动天生用户名

    3. {{ password }}   essay.task.util自动天生暗码

    4. {{ project }}    项目名,对应于fabfile/__init__.py里的env.PROJECT

    5. {{ port }}  取env.VENV_PORT_PREFIX_MAP对应虚拟环境的端口号

    6. {{ process_count }}  对应于fabfile设置中的PROCESS_COUNT

详细设置

    #项目名(被自动替代)
    [program:{{ project }}]     

    #运转敕令
    command={{ venv_dir}}/bin/{{ project }} --profile={{ profile }}     

    #历程名,示例:test_2
    process_name=%(program_name)s_%(process_num)d   

    #设置历程umask,即权限为755
    umask=022   

    #启动后10秒内没有非常则以为启动胜利
    startsecs=10        

    #守候0秒退出
    stopwaitsecs=0  

    #重定向日记输出地点
    redirect_stderr=true    


    #日记输出地点
    stdout_logfile={{ run_root }}/logs/process_%(process_num)02d.log


    #启动历程数
    numprocs={{ process_count }}    

    #假如开启历程数大于1,则指定从序号为0的历程最先
    numprocs_start=0    

可用敕令清单及详解

1. 建立当地工程,然后同步到git效劳器(须要git堆栈地点)

    用默许模板建立

    1. 先在gitlab/github上建立库:myprojecti,拿到git地点

    2. es create myproject (后边不加-t参数会运用默许模板建立项目)

    3. 输入项目git地点

    用django模板建立

    es create myproject -t django

2. 建立当地工程,建立时不须要衔接git效劳器,后期须要本身git init

#####用法一:

    天生全新项目

    1. es init myproject

    2. cd myproject

    3. git init

    4. git remote add origin [git库地点]

    5. 然后就能够commit和push了    

#####用法二:

    在已存在项面前目今

    1. cd myproject

    2. es init

    会为项目天生fabfile, conf, setup.py, MANIFEST.in, README.md

3. 打包

    1. fab build.build

4. 猎取项目最新版本号

    1. cd myproject

    2. fab build.get_latest_version

5. 盘算项面前目今一版本号

    1. cd myproject

    2. fab build.get_next_version

6. 布置(参数: 项目版本号, 虚拟环境名, profile)

    1. cd myproject

    2. fab deploy:3.11.18.2,virtualenv_name,test 

7. 重启指定虚拟环境的supervisor(参数: 虚拟环境名)

    1.cd myproject

    2.fab supervisor.reload:virtualenv_name

8. 重启虚拟环境的项目的特定历程(参数: 历程名, 虚拟环境名)

    1. cd myproject

    2. fab supervisor.restart_process:process_name,virtualenv_name

9. 启动虚拟环境的项目的特定历程(参数: 历程名, 虚拟环境名)

    1. cd myproject

    2. fab supervisor.start_process:process_name,virtualenv_name

10. 封闭虚拟环境的项目的特定历程(参数: 历程名, 虚拟环境名)

    1. cd myproject

    2. fab supervisor.stop_process:process_name,virtualenv_name

11. 启动nginx(参数: nginx实行敕令地点, nginx设置文件地点)

    注重: nginx_bin, nginx_conf 可在myproject/fabfile/__init__.py中设置
    比方: env.NGINX_BIN = '/usr/local/nginx/sbin/nginx'
          env.NGINX_CONF = '/usr/local/nginx/conf/nginx.conf'

    1. cd myproject

    2. fab nginx.start

    假如不设置__init__.py

    fab nginx.start:nginx_bin,nginx_conf

12. 重启nginx(参数: nginx实行敕令地点, nginx设置文件地点)

    1. cd myproject

    2. fab nginx.reload:nginx_bin,nginx_conf

13. 封闭nginx(参数: nginx实行敕令地点, nginx设置文件地点)

    1. cd myproject

    2. fab nginx.stop:nginx_bin,nginx_conf

14. 修正nginx设置文件并重启(参数: 源文本, 目的文本, nginx实行敕令令, nginx设置文件地点)

    1. cd myproject

    2. fab nginx.switch:src_pattern,dst_pattern,nginx_bin,nginx_conf

15. 猎取协助

    es -h

16. 从内部pypi装置包,pypi效劳器地点在project/init.py中可设置

    es pinstall xxx

17. 从官方pypi装置包(支撑pip其他敕令)

    es install xxx

高等功用引见

引见nginx效劳器设置以及a,b环境切换的处置惩罚

功用:

1. 保证新代码上线时,重启某一虚拟环境中的web效劳,不会对用户接见形成中缀。
2. 新上线代码涌现bug时,实时回滚到上一次的版本。

场景引见

假定如今有server1和server2两台效劳器,ip离别为ip1、ip2。两台效劳器均布置了两个虚拟环境a和b。a环境运转的项目监听在端口8801,b环境运转的项目监听在端口8811。

下面是简朴的nginx示例:

nginx.conf

    user nginx;
    worker_processes 1;

    #error_log /var/log/nginx/error.log warn;
    pid /var/run/nginx.pid;

    events {
        worker_connections 1024;
    }

    http {
        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        log_format main '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" "$http_x_forwarded_for"';

        #access_log /var/log/nginx/access.log main;

        sendfile on;
        #tcp_nopush on;

        keepalive_timeout 65;

        #gzip on;


        include extra/essay_demo.conf;
        include extra/upstreamA.conf;
    }

extra/essay_demo.conf

    server {
        listen 80;
        server_name localhost;
        access_log /var/log/nginx/essay.access.log main;
        location / {
            proxy_pass http://essay_demo;
            proxy_intercept_errors on;
            proxy_redirect off;
            proxy_connect_timeout 60;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            set $cookiesize '0';
            if ($http_cookie ~ "_"){
                set $cookiesize 1;
            }
        }
    }

extra/upstreamA.conf

    upstream essay_demo {
        server ip1:8801;
        server ip2:8801;
    }

extra/upstreamB.conf

    upstream essay_demo {
        server ip1:8811;
        server ip2:8811;
    }

如今nginx中设置的是upstreamA.conf,此时用户的接见会被反向代理到ip1和ip2的8801端口上。如今宣布新版本上线,运用敕令: fab -R dev deploy:<版本号>,b,test ,宣布到b环境。

以后经由过程敕令: fab -R nginx nginx.switch:upstreamA,upstreamB 把nginx中的upstreamA替代为upstreamB,并reload nginx,如许用户的接见就会被反向代理到ip1和ip2的8811端口上,也就是适才宣布到b环境中的新布置的项目。

switch完全敕令
fab -R nginx nginx.switch:src_pattern,dst_pattern,root,nginx_bin,nginx_conf

switch参数诠释:

    src_pattern: 原文本 (必填)

    dst_pattern: 目的文本 (必填)

    root: 是不是运用root用户,  是:root 否:None (可选项,默以为None)

    nginx_bin: nginx实行敕令途径,能够在fabfile/__init__.py下设定 (可选项)

    nginx_conf: nginx设置文件途径,能够在fabfile/__init__.py下设定 (可选项)

图示

《搜狐开源的 Python 项目自动化多服务器布置的东西》

fab -R dev nginx.switch: upstreamA.conf, upstreamB.conf

《搜狐开源的 Python 项目自动化多服务器布置的东西》

    原文作者:JeOam
    原文地址: https://segmentfault.com/a/1190000000344159
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞