##搭建服务器
前公司一直用的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
A P A C H E S C R I P T s t a r t A P A C H E E R R O R = APACHE_SCRIPT start APACHE_ERROR= APACHESCRIPTstart APACHEERROR=?
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脚本利用crontab来定时的检测redmine服务器是否正在运行以及端口是否开放问题。
##!/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服务器目录下,脚本逻辑很简单
1、执行检测脚本,如没有运行则开启服务器
2、如已经在运行,则检测服务器中端口
其中还有读取配置文件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添加方案 。