svn + nginx unit + python3自动化发布web服务方法

  本周将python web服务管理更换成nginx unit以后发现接口性能有了明显的提升,访问速度快了不少。不过有个很大的问题就是使用svn自动化发布以后,服务并没有刷新使用新的代码运行,而又不懂得如何将它弄成服务自动重启,只能用迂回救国的方式来想办法处理。

  试过用kill命令将unit进程杀死,然后启动服务方式,操作后发现会引发很多问题,最后放弃了。而unit有的特点就是配置文件更新以后会自动重启对应的服务,从而达到更新代码服务的效果,针对于这个特点所以想出了一个办法,那就是写个脚本,当代码发布成功以后,通过svn的勾子执行该脚本,从而改变unit配置从而达到想要重启服务的效果。

  要实现这个功能,脚本必须具体以下功能:

  1.读取原始配置文件内容(也可以直接放在脚本代码中)

  2.接收要重启服务的application名称

  3.使用字符串替换操作,将配置中的application名称替换成添加了随机数的新名称

  4.将新配置写入到文件中

  5.执行配置刷新命令,重启unit服务

  下面是完成的脚本代码update_unit_json.py

#!/usr/bin/env python # coding=utf-8 """ 更新unit配置,重启Python web服务 """ import logging import os import sys import random # 获取本脚本所在的路径 pro_path = os.path.split(os.path.realpath(__file__))[0] sys.path.append(pro_path) # 定义日志输出格式 logging.basicConfig(level=logging.INFO, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', filename="/data/logs/service/update_unit_json.log", filemode='a') # unit配置信息 unit_json = """{ "listeners": { "*:51000": { "application": "test_app_application" } }, "applications": { "test_app_application": { "type": "python", "processes": { "max":20, "spare": 2 }, "path": "/data/www/test_app", "module": "main" } }, "access_log": "/data/logs/www/access.log" } """ def save_file(file_path, content, mode='a', encoding='utf-8'): """保存内容到文件里""" try: file_object = open(file_path, mode, encoding=encoding) file_object.write(content) file_object.close() return True except Exception as e: print(str(e.args)) return False def get_random(): """ 获取指定长度的随机字符 """ return str(random.randint(1000, 9999)) if __name__ == "__main__": if len(sys.argv) == 1: print('缺少必要参数') sys.exit() # 获取服务名称 application = sys.argv[1] print(application) try: # 设置配置文件存储地址 file_path = '/data/unit/unit.json' # 替换json中的application串 unit_json = unit_json.replace(application, application + get_random()) print(unit_json) # 写入配置文件 save_file(file_path, unit_json, 'w') # 设置unit配置重载命令(unit.json存储位置可以放到自己喜欢的任何地方; # control.unit.sock会根据在不同路径输入unitd启动命令,而直接在该路径下创建该文件,如果想要正常启动必须在build目录下运行unitd启动,另外不同服务器安装方式build位置可能不一样) command = 'curl -X PUT -d @/data/unit/unit.json --unix-socket /usr/local/unit/build/control.unit.sock ' print(command) os.system(command) print('成功') except Exception as e: print('服务出现异常,异常信息:' + str(e.args))

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxxps.html