どどんとふをdebian+nginxで動かすやり方(fcgi編)@公式鯖3rdシリーズ

第1回:OS編

第2回:nginxセットアップ編

今回:fcgi編

続いて、fastcgiのセットアップです。
まずは、Dodontofを動かすディレクトリに、以下のfcgi呼び出し用のコードを配置します。(このコードは、むせる鯖運営者であるくまかば氏からの提供されたものをベースにしています)
Permissonは、www-dataが実行できる権限で、rubyのPATHなどはOS編で導入したバージョンとあわせてください。


#!/usr/bin/ruby2.2 -Ku
#–*-coding:utf-8-*–
Encoding.default_external=’utf-8′ if defined?(Encoding) && Encoding.respond_to?(‘default_external’)

require ‘rubygems’
require ‘cgi’
require ‘fcgi’
require ‘logger’

$logger = Logger.new(‘/srv/hdd/log/dodontof/fcgilog_srv1.log’)
$logger.level = Logger::WARN

$logger.info(” load”)
load ‘DodontoFServer.rb’

$logger.info(“### FCGI.each start”)
FCGI.each do |fcgi|
$logger.info(“do”)
begin
$logger.info(” begin”)
$stdout = fcgi.out
$stdin = fcgi.in
ENV.replace(fcgi.env)

$logger.info(” execute”)
executeDodontoServerCgi()

fcgi.finish
$logger.info(” finish”)
rescue Exception => e
$logger.fatal(e)
end
$logger.info(“end”)
end
$logger.info(“### FCGI.each end”)


で、次は/etc/init.d/dodontof_srv1に以下の起動スクリプトを登録し、instsrvコマンドでinitなりsystemdに登録します。
SERVERDIR、BIND_PORTなどの変数は、nginx編で設定したポート番号とあわせてください。NUMCHILDは常駐させるCGIプロセスの数です。
ここでは40プロセスを確保していますが、おおよそ同時ログイン人数が200人程度のリクエスト捌くと2GB程度のメモリーを食います。
メモリーが少ない場合などは、BACKLOGとNUMCHILDを減らしてみてください。

#!/bin/sh
### BEGIN INIT INFO
# Provides: dodontof_srv1
# Required-Start: $local_fs $remote_fs $network $syslog $named nginx
# Required-Stop: $local_fs $remote_fs $network $syslog $named nginx
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: spawn-fcgi dodontof server process
# Description:
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin
. /lib/init/vars.sh
BASENAME=`basename $0`
SERVERDIR=/srv/ssd/www/DodontoF_srv1
SERVERPROCESS=${SERVERDIR}/dodontoF-fcgi-nginx.rb
PIDFILE=/var/run/${BASENAME}.pid
RUN_USER=www-data
RUN_GRP=www-data
BIND_PORT=9001
NUMCHILD=40
BACKLOG=2048

do_start () {
spawn-fcgi -d ${SERVERDIR} -f ${SERVERPROCESS} -F ${NUMCHILD} -p ${BIND_PORT} -u ${RUN_USER} -P ${PIDFILE} -b ${BACKLOG}
}

do_status () {
if [ -f ${PIDFILE} ] ; then
return 0
else
return 4
fi
}

do_stop () {
cat ${PIDFILE} | xargs kill
sleep 2
cat ${PIDFILE} | xargs kill -9
rm -f ${PIDFILE}
}

case “$1” in
start)
do_start
;;
reload|force-reload)
echo “Error: argument ‘$1’ not supported” >&2
exit 3
;;
restart)
do_stop
sleep 1
do_start
;;
stop)
do_stop
;;
status)
do_status
exit $?
;;
*)
echo “Usage: ${BASENAME} [start|stop|status|restart]” >&2
exit 3
;;
esac


ちなみに、systemdを使う場合は、クリエイターズネットワークさんの技術部ブログの記事のほうが本来のやり方です。
それから、nginxとspawn-fcgi間の通信は、TCP/IP Socketを利用していますが、UNIX Domain Socketを利用したほうが処理は高速になると思います。