Ubuntu下redmine搭建及优化

##搭建服务器

前公司一直用的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服务器是否正在运行以及端口是否开放问题。

  • 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服务器目录下,脚本逻辑很简单

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添加方案 。

你可能感兴趣的:(学习)