Nginx で CGI を動かすメモです。
下記記事で構成した Nginx に CGI を実行できる環境を追加します。
スポンサーリンク
fcgiwrapのインストール
まずは本家から fcgiwarp のソースコードを取ってきます。
ただ、いつも利用しているのは 1.1.0-5 なのでそのバージョンのファイルも一応置いておきます。
次に必要なファイルを先にインストールします。
# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm # yum -y install --enablerepo=epel spawn-fcgi fcgi-devel
そして fcgiwrap のインストール。
# tar xfz fcgiwrap-1.1.0-5.tar.gz ; cd gnosek-fcgiwrap-66e7b7d # autoreconf -i # ./configure --prefix=/usr # make ; make install
インストールが終わったら fcgiwrap の設定です。
# mkdir /var/run/fcgiwrap # vi /etc/sysconfig/fcgiwrap
/etc/sysconfig/fcgiwrap の中身はこのように。
FCGI_USER=www FCGI_GROUP=www FCGI_PROGRAM=/usr/sbin/fcgiwrap FCGI_PID=/var/run/fcgiwrap/spawn-fcgi.pid FCGI_SOCKET=/var/run/fcgiwrap/fcgiwrap.sock FCGI_EXTRA_OPTIONS="-M 0700" OPTIONS="-u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -S $FCGI_EXTRA_OPTIONS -F 1 -P $FCGI_PID -- $FCGI_PROGRAM"
ちなみに spawn-fcgi の init スクリプトは起動はできるけどそのままだと停止や再起動ができないので注意。
後で直そうとは思ってましたが、長いこと運用していても別に困らなかったのでずっと放置しています・・・
※ 2016-07-16 追記
kimipoohさんよりコメントをいただき無事解決しました!(他力本願ですみません・・・)
init スクリプトより停止するには下記のように修正が必要です。
# vi /etc/init.d/spawn-fcgi
# Source function library. . /etc/rc.d/init.d/functions #exec="/usr/bin/spawn-fcgi" #prog="spawn-fcgi" #config="/etc/sysconfig/spawn-fcgi" exec="/usr/bin/spawn-fcgi" cgi="/usr/sbin/fcgiwrap" prog=`basename $cgi` config="/etc/sysconfig/$prog" pid="/var/run/fcgiwrap/spawn-fcgi.pid" SOCKET="/var/run/fcgiwrap/fcgiwrap.sock" [ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog lockfile=/var/lock/subsys/$prog
23 – 25行目をコメントアウトもしくは削除して、27 – 32の行を追加。
stop() { echo -n $"Stopping $prog: " #killproc $prog killproc -p $pid $prog # Remove the socket in order to never leave it with wrong ownership [ -n "${SOCKET}" -a -S "${SOCKET}" ] && rm -f ${SOCKET} retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval }
53行目の “killproc $prog” をコメントアウトもしくは削除して、54行目 “killproc -p $pid $prog” のように。
修正済みのファイルは下記に上げておきます。
これで完了なのであとは fcgiwrap を起動します。
# /etc/init.d/spawn-fcgi start # chkconfig spawn-fcgi on ## 念のためプロセスの起動確認 # ps auxw | grep fcgiwrap | grep -v grep www 15469 0.0 0.0 8304 540 ? Ss 10:53 0:00 /usr/sbin/fcgiwrap
Nginxの設定変更
次に Nginx で fcgiwrap を利用する為の設定を追加します。
必要な時に include して使うようにこんな感じに設定ファイルを用意します。
# vi /etc/nginx/conf.d/fcgiwrap.conf
中身はこれ。自分は CGI は Perl で書くので .pl と .cgi に反応するようにしています。
location ~ \.(pl|cgi)$ { include fastcgi_params; fastcgi_pass unix:/var/run/fcgiwrap/fcgiwrap.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }
後は CGI を使いたい場所にこんな感じ include してあげる。
server { listen *:80 default_server; root /home/www/htdocs; access_log /var/log/nginx-access.log main; error_log /var/log/nginx-error.log warn; index index.html index.pl index.cgi; include conf.d/fcgiwrap.conf; }
設定はざっくりな感じですがこれでOK!
/etc/init.d/spawn-fcgiが停止できないのは、
1. /etc/sysconfig/spawn-fcgi –> /etc/syconfig/fcgiwrap へリネ−ム
2. /etc/init.d/spawn-fcgi の最初にexec=”/usr/bin/spawn-fcgi”
cgi=”/usr/sbin/fcgiwrap”
prog=`basename $cgi`
config=”/etc/sysconfig/$prog”
pid=”/var/run/fcgiwrap/spawn-fcgi.pid”
SOCKET=”/var/run/fcgiwrap/fcgiwrap.sock”
のように変更し、
stop()のkillprocを
killproc -p $pid $prog
に変更したらいけました。。
kimipoohさん
ご教授ありがとうございます!