opamp_sando's blog

クソザコが割りと適当なことを書くためにある備忘録です。あとたまに普通の日記も書きます

nginx + fcgiwrapを使ってみた

php-fpmを以前設定してphpの実行はサポートしていたがその他cgiの実行ができなかったのでfcgiwrapを使ってcgiを使えるようにしてみた。
もちろんOSはArchLinux

必要なパッケージをインストールする

fcgiwrapをインストールする。

$ sudo pacman -S fcgiwrap 

依存関係も一緒にインストールされる。

fcgiwrapを起動する

特に設定ファイルがないので、systemdのserviceファイルを記述する。

$ (sudo) cp /usr/lib/systemd/system/fcgiwrap.service /etc/systemd/system/fcgiwrap.service

として設定ファイルを/etc/systemd/system以下にコピー(こちらの設定は/usr/lib/systemd/systemよりも優先される)
で、適当なエディタで開いて中身をちょっと書き換える。

$ sudoedit /etc/systemd/system/fcgiwrap.service 

参考までに...

[Unit]
Description=Simple CGI Server
After=nss-user-lookup.target

[Service]
ExecStart=/usr/sbin/fcgiwrap -c 4 -s tcp:127.0.0.1:9999
User=fcgiuser
Group=fcgiuser

[Install]
Also=fcgiwrap.socket

ここではtcpを用いてプロセス間通信を行わせる。ここで設定したポートにサーバー外部からアクセスできてしまうとかなりまずいと思うのでFWでここに外部からアクセスできないようにしておく。
なお、実行するユーザー及びグループも権限のないユーザーを指定する。

うまくできてたら

$ (sudo) systemctl start fcgiwrap

で、起動。

$ ps axu | grep fcgiwrap
fcgiuser     30533  0.0  0.0  14808   976 ?        Ss   19:31   0:00 /usr/sbin/fcgiwrap -c 4 -s tcp:127.0.0.1:9999
fcgiuser     30535  0.0  0.0  14808   144 ?        S    19:31   0:00 /usr/sbin/fcgiwrap -c 4 -s tcp:127.0.0.1:9999
fcgiuser     30536  0.0  0.0  14808   144 ?        S    19:31   0:00 /usr/sbin/fcgiwrap -c 4 -s tcp:127.0.0.1:9999
fcgiuser     30537  0.0  0.0  14808   144 ?        S    19:31   0:00 /usr/sbin/fcgiwrap -c 4 -s tcp:127.0.0.1:9999
fcgiuser     30538  0.0  0.0  14808   144 ?        S    19:31   0:00 /usr/sbin/fcgiwrap -c 4 -s tcp:127.0.0.1:9999

という感じ。

nginx.confに設定

nginx.confのserver以下適当な場所に

location ~ \.cgi$ {
    fastcgi_pass 127.0.0.1:9999;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

という感じで記述する。

include fastcgi_params;

fastcgi_paramsというファイルをincludeしている。環境によってはPATHが異なる可能性があるので記述する際は注意。

で、nginxを(再)起動する。

確認

拡張子cgiとしたファイルのみ上記設定では読み込むようにしているので、適当に拡張子が.cgiのファイルを用意してアクセスして実行できたら成功。
うまくできたらおk.

おまけ

nginxで似非userdirをしてる人向けにuserdir以下でも.cgiを読み込む際の記述は

location ~ ^/~(.+?)/(.+\.cgi)$ {
    fastcgi_pass 127.0.0.1:9999;
    fastcgi_param SCRIPT_FILENAME /home/$1/public_html/$2;
    include fastcgi_params;
}

これはWebサーバーに「/username/xxx.cgi」へのアクセスがきた際にOS上の「/home/username/public_html/xxx.cgi」を読み込んで「127.0.0.1:9999」に投げて実行してもらう感じの設定。

終わりに

nginxで似非userdirをやってる人はapacheのsuphpみたいにユーザー毎に実行ユーザーを変えるという技をこの方法では実現できない。
ので、serviceで指定したユーザーですべてのcgiは実行されるため、ここの設定を誤るとユーザーに本来許可していないファイルの内容を変更したり読み込んだりできるようになる可能性がある。
ので、この辺の設定は割と注意したほうがいいかもしれない。

あと、私はクソザコなのでsystemd周りなんかの理解がすごく浅いです。なので、上記serviceの記述はかなり適当に書いたものなのであんまり参考にしないほうがいいかもです。
はい、今後勉強しますorz

間違い等ご指摘がある方は遠慮なくコメント等でお願いします。

Firefox ブラウザ無料ダウンロード