搭建服務(wù)器
前公司一直用的JIRA估脆,現(xiàn)在換公司了,規(guī)模沒有那么大座云,對于項目BUG的管理沒有那么完善疙赠,一直用的BUGFREE,最近公司來了個項目總監(jiān)朦拖,想和大公司規(guī)范一樣圃阳,需要搭建redmine的項目管理服務(wù)器,小公司嘛沒什么人璧帝,只有找我們這Android系統(tǒng)工程師來看看捍岳,最后這個任務(wù)就落到我頭上了,剛開始對于服務(wù)器的搭建沒什么頭緒裸弦,慢慢從網(wǎng)上找到了解決辦法祟同,
- 一開始以為搭建很是困難,原來是下載別人軟件直接運行就OK了理疙,搭建起來很簡單 https://bitnami.com/stack/redmine/installer網(wǎng)址下載安裝運行即可晕城,困難的是后面的維護(hù),這軟件又不是我寫的窖贤,對于會出什么差錯當(dāng)然就是找我這個搭建人的問題了砖顷,于是就開始對于這個redmine進(jìn)行優(yōu)化。
端口開放問題
通過同局域網(wǎng)內(nèi)IP和端口訪問赃梧,果然第二天出現(xiàn)一個問題滤蝠,不能訪問,重啟服務(wù)器之后只能本機(jī)訪問授嘀,通過ping能夠訪問到服務(wù)器物咳,但是telnet鏈接端口超時,于是就懷疑是服務(wù)器端口的問題蹄皱,
sudo iptables -I INPUT -p tcp --dport 8081 -j ACCEPT
通過上面這個命令開放redmine服務(wù)器端口8081览闰,到這問題就解決了,但是過了一天又遇到類似的情況巷折,服務(wù)器電腦我不知道重啟沒有重啟压鉴,通過ssh鏈接服務(wù)器用腳本查看./ctlscript.sh status,redmine是已經(jīng)運行的锻拘,結(jié)果如下:
subversion already running
apache already running
mysql already running
但就是訪問不了(除了本地訪問)油吭,重啟redmine服務(wù)器再次進(jìn)行訪問击蹲,然而還是沒有效果;再次運行開放端口命令婉宰,恢復(fù)正常歌豺。于是自己想著在啟動的腳本上做一些手腳,自己就對ctlscript.sh這個shell腳本看了看心包,既然重啟redmine服務(wù)器沒有開放端口世曾,那就在腳本啟動后插入開放端口的命令,省得我們每次啟動服務(wù)器時都要自己開放一次端口谴咸。
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
腳本中有大部分類似上面片段這種的,上面片段腳本可知骗露,真正啟動服務(wù)器腳本是$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
}
+號后面是自己添加的萧锉,成功啟動之后開放端口并且打印信息在終端上珊随,這樣每次啟動的時候應(yīng)該就可以順帶端口一起開放了
開機(jī)自啟動
自己也優(yōu)化了一下,每次開機(jī)的時候無需去自己啟動redmine服務(wù)器腳本柿隙,網(wǎng)上也搜索了很多類似的方案叶洞,之后就決定用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以及服務(wù)器的狀態(tài)
檢測服務(wù)器端口
進(jìn)一步優(yōu)化艺晴,自己寫了個Python腳本利用crontab來定時的檢測redmine服務(wù)器是否正在運行以及端口是否開放問題。
- 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服務(wù)器啟動失敗'
#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構(gòu)造函數(shù)"
@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')
#執(zhí)行redmine檢測腳本
strOut = ShellUtils.getStrOut(checkCmd)
#判斷腳本每行輸出內(nèi)容
for line in strOut.splitlines(False):
if "not running" in line:#某一服務(wù)器沒有運行
startid = ShellUtils.execute(restartCmd)
break
else:
port = 0
if "subversion" in line: #subversion服務(wù)器運行掸屡,從配置文件中取得其端口號
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}已經(jīng)是開放狀態(tài)'.format(port))
該腳本放在/home/tao/redmine-3.4.6-1服務(wù)器目錄下封寞,腳本邏輯很簡單
1、執(zhí)行檢測腳本仅财,如沒有運行則開啟服務(wù)器
2狈究、如已經(jīng)在運行,則檢測服務(wù)器中端口
其中還有讀取配置文件properties.ini獲取啟動的三個服務(wù)端口號盏求,以及python中檢測端口的接口抖锥,本來想通過“telnet 127.0.0.1 port”命令來檢測端口情況的,心想既然用python腳本編寫风喇,不想那么“shell化”宁改。其中python語言檢測腳本網(wǎng)上查了下可以有兩種方法,上面代碼中都有魂莫。
然后就類似重啟的優(yōu)化还蹲,在redmine.cron文件中添加:
*/10 * * * * python /home/tao/redmine-3.4.6-1/autotest.py >> /home/tao/crontablist/autotest.log 2>&1 &
意思是每10分鐘執(zhí)行一次autotest.py腳本。crontab redmine.cron添加方案 。