Redmine + Nginx

หลังจากใช้ Teambox มาได้ครึ่งปีและคอยตามอัพเกรดพบว่า Teambox นั้นยังไม่ Stable เท่าไหร่แถมทรัพยากรที่ใช้ก็มากพอดู เมื่อวานเลยมองหาทางเลือกอื่นอีกครั้งเพื่อเอา Teambox ออกจากระบบ เริ่มแรกคิดว่าจะย้ายไปใช้ Service นอกอย่าง Flow แต่คิดไปคิดมาทำไมต้องเสียตังด้วย เลยมาจบลงที่ Redmine นี่แหละ

วิธีลง Redmine บน Nginx ถ้าค้นหาตัวไม่ส่วนใหญ่จะให้ใช้กับ Phusion Passenger™ ซึ่งถ้าเป็น Apache จะลงแล้วทำตามทันที แต่สำหรับ Nginx ความยากมันมีเพิ่มขึ้นมาเมื่อต้อง compile Nginx ใหม่เลยเปลี่ยนทางเลือกเป็น FastCGI แทน

สำหรับสิ่งที่ต้องเตรียมลงก่อนล่วงหน้าคือ nginx, spawn-fcgi (ถ้าใช้ Debian 5.0 ต้องลงจาก lighttpd), redmine (จะใช้จาก apt หรือดาวโหลดมาขยายลงแฟ้มซักแฟ้มก็ได้)

script สำหรับ start redmine ผ่าน spawn-fcgi ใน init.d

#! /bin/sh
#
# fcgi-hg     Startup script for the nginx HTTP Server
#
# chkconfig: - 84 15
# description: Loading php-cgi using spawn-cgi
#	       HTML files and CGI.
#
# Author:  Ryan Norbauer <ryan.norbauer@gmail.com>
# Modified:     Geoffrey Grosenbach http://topfunky.com
# Modified:     David Krmpotic http://davidhq.com
# Modified:	Kun Xi http://kunxi.org
export RAILS_ENV=production
export LANG=en_US.UTF-8

PATH=/opt/python/bin:$PATH
DAEMON=/usr/local/bin/spawn-fcgi
FCGIHOST=127.0.0.1
FCGIPORT=9001
FCGIUSER=www-data
FCGIGROUP=www-data
FCGIAPP=/var/redmine/public/dispatch.fcgi
PHPCHILD=3
PIDFILE=/var/run/fcgi-redmine.pid
DESC="Redmine in FastCGI mode"

# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0
test -x $FCGIAPP || exit 0

start() {
	$DAEMON -a $FCGIHOST -p $FCGIPORT -C $PHPCHILD -u $FCGIUSER -g $FCGIGROUP -f $FCGIAPP -P $PIDFILE 2> /var/log/redmine.err || echo -en "\n already running\n"
}

stop() {
	kill -QUIT `cat $PIDFILE` || echo -en "\n not running"
}

restart() {
	kill -HUP `cat $PIDFILE` || echo -en "\n can't reload"
}

case "$1" in
  start)
    echo -n "Starting $DESC: "
    start
  ;;
  stop)
    echo -n "Stopping $DESC: "
    stop
  ;;
  restart|reload)
    echo -n "Restarting $DESC: "
    stop
    # One second might not be time enough for a daemon to stop,
    # if this happens, d_start will fail (and dpkg will break if
    # the package is being upgraded). Change the timeout if needed
    # be, or change d_stop to have start-stop-daemon use --retry.
    # Notice that using --retry slows down the shutdown process somewhat.
    sleep 1
    start
  ;;
  *)
    echo "Usage: $SCRIPTNAME {start|stop|restart|reload}" >&2
    exit 3
  ;;
esac

exit $?

ตามด้วย nginx config

server {

    listen 80;
    server_name redmine.local;
    root /var/redmine/public;
    gzip on;

    location ~ \.fcgi$ {
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9001;
    }

    location / {
        root /var/redmine/public;
	index dispatch.fcgi;

        if (!-e $request_filename) {
	    rewrite ^/(.+)$ /dispatch.fcgi last;
        }
    }

}

เวลา start redmine ก็ตามด้วยสองคำสั่งคือ

#/etc/init.d/nginx start
#/etc/init.d/fcgi-redmine start

หลังจากทำเสร็จลองเปรียบเทียบ memory ที่ใช้ระหว่าง Teambox กับ Redmine พบว่า Redmine ใช้น้อยกว่ามาก น่าประทับใจ คงได้อยู่กับ Redmine ไปอีกพอสมควร

About llun

Just a programmer

, ,

  • http://check-host.net bzero

    Thank you for init script!