Ubuntuの下でredmineの構築と最適化

5900 ワード

サーバの構築
前の会社はずっと使っていたJIRA、今会社を変えて、规模はそんなに大きくなくて、プロジェクトのBUGの管理に対してそんなに完备していないで、ずっと使っていたBUGFREE、最近会社はプロジェクトの総监に来て、大きい会社の规范と同じように、redmineのプロジェクトの管理サーバーを建てる必要があると思って、小さい会社は何人もなくて、私达のこのAndroidシステムの技师を探して见て、最后にこの任务は私の头の上に落ちて、最初はサーバーの構築について何の見当もつかず、徐々にネット上から解決策を見つけました.
  • 最初は構築が難しいと思っていたが、他人のソフトウェアをダウンロードして直接実行すればOKだったので、構築が簡単だった.https://bitnami.com/stack/redmine/installerウェブサイトのダウンロードはインストールして運行することができて、困難なのは後のメンテナンスで、このソフトウェアは私が書いたのではありませんて、どんな間違いが発生することに対してもちろん私のこの構築者の問題を探して、そこでこのredmineに対して最適化を行います.
  • ポートオープンの問題
    ローカルエリアネットワーク内のIPとポートへのアクセスを通じて、やはり翌日に1つの問題が発生して、アクセスできなくて、サーバーを再起動した後に本機でしかアクセスできなくて、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/apache 2/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
    }
    
    +番号の後ろは自分で追加したもので、正常に起動した後にポートを開放し、印刷情報を端末に印刷することで、起動するたびにポートと一緒に開放できるはずです.
    POST
    自分でも最適化して、電源を入れるたびに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は起動した3つのサービスポート番号とpythonでポートを検出するインタフェースを取得し、もともと「telnet 127.0.0.1 port」コマンドでポートの状況を検出したいと思っていたが、pythonスクリプトで書く以上、「shell化」したくないと思った.ここでpython言語検出スクリプトは、上のコードに2つの方法があります.
    再起動の最適化と同様に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はシナリオを追加します.