work.log

エンジニアの備忘録的ブログ

fcgiwrapをインストールしてNginxでCGIを動かす

投稿:2015-09-09 22:13  更新:

Nginx で CGI を動かすメモです。

下記記事で構成した Nginx に CGI を実行できる環境を追加します。

スポンサーリンク

fcgiwrapのインストール

まずは本家から fcgiwarp のソースコードを取ってきます。

外部リンク
GitHub – fcgiwrap

ただ、いつも利用しているのは 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!

スポンサーリンク

コメント

  1. kimipooh より:

    /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

    に変更したらいけました。。

コメントを残す

よく読まれている記事

  • 今日
  • 週間
  • 月間