前言
此文章写于2018年9月15日,那是在一个试用期就跑路的公司。
搭建服务器
前公司一直用的JIRA,现在换公司了,规模没有那么大,对于项目BUG的管理没有那么完善,一直用的BUGFREE,最近公司来了个项目总监,想和大公司规范一样,需要搭建redmine的项目管理服务器,小公司嘛没什么人,只有找我们这Android系统工程师来看看,最后这个任务就落到我头上了,刚开始对于服务器的搭建没什么头绪,慢慢从网上找到了解决办法,
一开始以为搭建很是困难,原来是下载别人软件直接运行就OK了,搭建起来很简单 https://bitnami.com/stack/redmine/installer网址下载安装运行即可,困难的是后面的维护,这软件又不是我写的,对于会出什么差错当然就是找我这个搭建人的问题了,于是就开始对于这个redmine进行优化。端口开放问题
通过同局域网内IP和端口访问,果然第二天出现一个问题,不能访问,重启服务器之后只能本机访问,通过ping能够访问到服务器,但是telnet链接端口超时,于是就怀疑是服务器端口的问题,
sudo iptables -I INPUT -p tcp --dport 8081 -j ACCEPT通过上面这个命令开放redmine服务器端口8081,到这问题就解决了,但是过了一天又遇到类似的情况,服务器电脑我不知道重启没有重启,通过ssh链接服务器用脚本查看./ctlscript.sh status,redmine是已经运行的,结果如下:
subversion already running apache already running mysql already running但就是访问不了(除了本地访问),重启redmine服务器再次进行访问,然而还是没有效果;再次运行开放端口命令,恢复正常。于是自己想着在启动的脚本上做一些手脚,自己就对ctlscript.sh这个shell脚本看了看,既然重启redmine服务器没有开放端口,那就在脚本启动后插入开放端口的命令,省得我们每次启动服务器时都要自己开放一次端口。
APACHE_SCRIPT=$INSTALLDIR/apache2/scripts/ctl.sh ... elif [ "x$2" = "xapache" ]; then if test -x $APACHE_SCRIPT; then $APACHE_SCRIPT start APACHE_ERROR=$? fi elif脚本中有大部分类似上面片段这种的,上面片段脚本可知,真正启动服务器脚本是$INSTALLDIR/apache2/scripts/ctl.sh这个路径。跟踪到这个脚本,也不许看别的地方
start_apache() { test_apache_config is_apache_runniredmineng RUNNING=$? if [ $RUNNING -eq 1 ]; then echo "$0 $ARG: httpd (pid $HTTPD_PID) already running" else cleanpid if $HTTPD ; then echo "$0 $ARG: httpd started at port 8080" +echo '123' | sudo -S iptables -I INPUT -p tcp --dport 8080 -j ACCEPT +echo "8080 accept" else echo "$0 $ARG: httpd could not be started" ERROR=3 fi fi }+号后面是自己添加的,成功启动之后开放端口并且打印信息在终端上,这样每次启动的时候应该就可以顺带端口一起开放了
开机自启动
自己也优化了一下,每次开机的时候无需去自己启动redmine服务器脚本,网上也搜索了很多类似的方案,之后就决定用crontab这种方法,之前也研究看了看。
于是自己就新建了redmine.cron文件
@reboot nohup /home/tao/redmine-3.4.6-1/ctlscript.sh start >> /home/tao/crontablist/reboot.log 2>&1 &crontab redmine.cron 添加方案,通过crontab -l 查询,然后重启自行去验证一下,log以及服务器的状态
Python脚本优化
进一步优化,自己写了个Python脚本利用crontab来定时的检测redmine服务器是否正在运行以及端口是否开放问题。
autotest.py
##!/usr/bin/python # -*- coding: UTF-8 -*- import os,sys,ConfigParser,telnetlib,time #import socket print time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) #redmine目录 redminePath = os.path.dirname(os.path.abspath(__file__)) redmineShell = redminePath + '/ctlscript.sh' ##shell 命令行 checkCmd = redmineShell + ' status' stopCmd = redmineShell + ' stop' restartCmd = redmineShell + ' restart' fail = 'echo redmine服务器启动失败' #checkPort = 'telnet 127.0.0.1 port' openPort = "echo '123' | sudo -S iptables -I INPUT -p tcp --dport port_id -j ACCEPT" #Shell命令工具 class ShellUtils: def __init__(self): print "ShellUtils构造函数" @classmethod def getStrOut(cls,cmd): f = os.popen(checkCmd,'r') strout = f.read() f.close() return strout @classmethod def execute(cls,cmd): id = os.system(cmd) return id #配置文件工具类 class ConfigUtils: def __init__(self): pass def addConfigParser(self,filename): self.config = ConfigParser.ConfigParser() self.config.read(filename) def getValue(self,section,option): return self.config.get(section,option) #测试端口是否开放 def testconn( host , port ): #sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #sk.settimeout(1) server = telnetlib.Telnet() try: #sk.connect((host,port)) server.open(host,port) return 1 except Exception: return 0 finally: server.close() #sk.close() #实例配置文件工具类 configUtils = ConfigUtils() configUtils.addConfigParser(redmineShell + '/properties.ini') #执行redmine检测脚本 strOut = ShellUtils.getStrOut(checkCmd) #判断脚本每行输出内容 for line in strOut.splitlines(False): if "not running" in line:#某一服务器没有运行 startid = ShellUtils.execute(restartCmd) break else: port = 0 if "subversion" in line: #subversion服务器运行,从配置文件中取得其端口号 port = configUtils.getValue("Subversion","subversion_port") elif "apache" in line: port = configUtils.getValue("Apache","apache_server_port") elif "mysql" in line: port = configUtils.getValue("MySQL","mysql_port") test_id = testconn("127.0.0.1",port) if test_id == 0: #打开 ShellUtils.execute(openPort.replace("port_id",port)) elif test_id == 1: print ('端口{0}已经是开放状态'.format(port))该脚本放在/home/tao/redmine-3.4.6-1服务器目录下,脚本逻辑很简单
执行检测脚本,如没有运行则开启服务器如已经在运行,则检测服务器中端口其中还有读取配置文件properties.ini获取启动的三个服务端口号,以及python中检测端口的接口,本来想通过“telnet 127.0.0.1 port”命令来检测端口情况的,心想既然用python脚本编写,不想那么“shell化”。其中python语言检测脚本网上查了下可以有两种方法,上面代码中都有。
然后就类似重启的优化,在redmine.cron文件中添加:
*/10 * * * * python /home/tao/redmine-3.4.6-1/autotest.py >> /home/tao/crontablist/autotest.log 2>&1 &意思是每10分钟执行一次autotest.py脚本。crontab redmine.cron添加方案 。