Nginx では CGI は動かない。サポートしてないんだそうだ。まあ、いまどき CGI ってのも……という気はするけど、ちょっと古い CGI プログラムが必要になったのでやってみた。
参考にしたページはここ。
cf. NginxでCGIを動かそうと頑張った話 – Qiita
これによると、fcgiwrap というのを使えば、CGI を FCGI にラップしてくれて、CGI プログラムを動かせるようだ。ラップするといってもインターフェイスの話で、中身はあくまで CGI なので FCGI なみに早く動作するわけではない。
とにかくやってみよう。
まずは fcgiwrap のインストール。apt でインストールできる。
takatoh@wplj $ sudo apt install fcgiwrap
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
libllvm3.8 libllvm4.0 libllvm5.0 libmircommon5 libpango1.0-0 libpangox-1.0-0
libqmi-glib1 libqpdf17 linux-headers-4.4.0-101
linux-headers-4.4.0-101-generic linux-headers-4.4.0-103
linux-headers-4.4.0-103-generic linux-headers-4.4.0-104
linux-headers-4.4.0-104-generic linux-headers-4.4.0-109
linux-headers-4.4.0-109-generic linux-headers-4.4.0-112
linux-headers-4.4.0-112-generic linux-headers-4.4.0-116
linux-headers-4.4.0-116-generic linux-headers-4.4.0-119
linux-headers-4.4.0-119-generic linux-headers-4.4.0-121
linux-headers-4.4.0-121-generic linux-headers-4.4.0-122
linux-headers-4.4.0-122-generic linux-headers-4.4.0-124
linux-headers-4.4.0-124-generic linux-headers-4.4.0-127
linux-headers-4.4.0-127-generic linux-headers-4.4.0-128
linux-headers-4.4.0-128-generic linux-headers-4.4.0-130
linux-headers-4.4.0-130-generic linux-headers-4.4.0-131
linux-headers-4.4.0-131-generic linux-headers-4.4.0-21
linux-headers-4.4.0-21-generic linux-headers-4.4.0-64
linux-headers-4.4.0-64-generic linux-headers-4.4.0-66
linux-headers-4.4.0-66-generic linux-headers-4.4.0-67
linux-headers-4.4.0-67-generic linux-headers-4.4.0-70
linux-headers-4.4.0-70-generic linux-headers-4.4.0-71
linux-headers-4.4.0-71-generic linux-headers-4.4.0-72
linux-headers-4.4.0-72-generic linux-headers-4.4.0-75
linux-headers-4.4.0-75-generic linux-headers-4.4.0-77
linux-headers-4.4.0-77-generic linux-headers-4.4.0-78
linux-headers-4.4.0-78-generic linux-headers-4.4.0-79
linux-headers-4.4.0-79-generic linux-headers-4.4.0-81
linux-headers-4.4.0-81-generic linux-headers-4.4.0-83
linux-headers-4.4.0-83-generic linux-headers-4.4.0-87
linux-headers-4.4.0-87-generic linux-headers-4.4.0-89
linux-headers-4.4.0-89-generic linux-headers-4.4.0-91
linux-headers-4.4.0-91-generic linux-headers-4.4.0-92
linux-headers-4.4.0-92-generic linux-headers-4.4.0-93
linux-headers-4.4.0-93-generic linux-headers-4.4.0-96
linux-headers-4.4.0-96-generic linux-headers-4.4.0-97
linux-headers-4.4.0-97-generic linux-headers-4.4.0-98
linux-headers-4.4.0-98-generic linux-image-4.4.0-101-generic
linux-image-4.4.0-103-generic linux-image-4.4.0-104-generic
linux-image-4.4.0-109-generic linux-image-4.4.0-112-generic
linux-image-4.4.0-116-generic linux-image-4.4.0-119-generic
linux-image-4.4.0-121-generic linux-image-4.4.0-122-generic
linux-image-4.4.0-124-generic linux-image-4.4.0-127-generic
linux-image-4.4.0-128-generic linux-image-4.4.0-130-generic
linux-image-4.4.0-131-generic linux-image-4.4.0-21-generic
linux-image-4.4.0-64-generic linux-image-4.4.0-66-generic
linux-image-4.4.0-67-generic linux-image-4.4.0-70-generic
linux-image-4.4.0-71-generic linux-image-4.4.0-72-generic
linux-image-4.4.0-75-generic linux-image-4.4.0-77-generic
linux-image-4.4.0-78-generic linux-image-4.4.0-79-generic
linux-image-4.4.0-81-generic linux-image-4.4.0-83-generic
linux-image-4.4.0-87-generic linux-image-4.4.0-89-generic
linux-image-4.4.0-91-generic linux-image-4.4.0-92-generic
linux-image-4.4.0-93-generic linux-image-4.4.0-96-generic
linux-image-4.4.0-97-generic linux-image-4.4.0-98-generic
linux-image-extra-4.4.0-101-generic linux-image-extra-4.4.0-103-generic
linux-image-extra-4.4.0-104-generic linux-image-extra-4.4.0-109-generic
linux-image-extra-4.4.0-112-generic linux-image-extra-4.4.0-116-generic
linux-image-extra-4.4.0-119-generic linux-image-extra-4.4.0-121-generic
linux-image-extra-4.4.0-122-generic linux-image-extra-4.4.0-124-generic
linux-image-extra-4.4.0-127-generic linux-image-extra-4.4.0-128-generic
linux-image-extra-4.4.0-130-generic linux-image-extra-4.4.0-131-generic
linux-image-extra-4.4.0-21-generic linux-image-extra-4.4.0-64-generic
linux-image-extra-4.4.0-66-generic linux-image-extra-4.4.0-67-generic
linux-image-extra-4.4.0-70-generic linux-image-extra-4.4.0-71-generic
linux-image-extra-4.4.0-72-generic linux-image-extra-4.4.0-75-generic
linux-image-extra-4.4.0-77-generic linux-image-extra-4.4.0-78-generic
linux-image-extra-4.4.0-79-generic linux-image-extra-4.4.0-81-generic
linux-image-extra-4.4.0-83-generic linux-image-extra-4.4.0-87-generic
linux-image-extra-4.4.0-89-generic linux-image-extra-4.4.0-91-generic
linux-image-extra-4.4.0-92-generic linux-image-extra-4.4.0-93-generic
linux-image-extra-4.4.0-96-generic linux-image-extra-4.4.0-97-generic
linux-image-extra-4.4.0-98-generic linux-signed-image-4.4.0-101-generic
linux-signed-image-4.4.0-103-generic linux-signed-image-4.4.0-104-generic
linux-signed-image-4.4.0-109-generic linux-signed-image-4.4.0-112-generic
linux-signed-image-4.4.0-116-generic linux-signed-image-4.4.0-119-generic
linux-signed-image-4.4.0-121-generic linux-signed-image-4.4.0-122-generic
linux-signed-image-4.4.0-124-generic linux-signed-image-4.4.0-127-generic
linux-signed-image-4.4.0-128-generic linux-signed-image-4.4.0-130-generic
linux-signed-image-4.4.0-131-generic linux-signed-image-4.4.0-64-generic
linux-signed-image-4.4.0-66-generic linux-signed-image-4.4.0-67-generic
linux-signed-image-4.4.0-70-generic linux-signed-image-4.4.0-71-generic
linux-signed-image-4.4.0-72-generic linux-signed-image-4.4.0-75-generic
linux-signed-image-4.4.0-77-generic linux-signed-image-4.4.0-78-generic
linux-signed-image-4.4.0-79-generic linux-signed-image-4.4.0-81-generic
linux-signed-image-4.4.0-83-generic linux-signed-image-4.4.0-87-generic
linux-signed-image-4.4.0-89-generic linux-signed-image-4.4.0-91-generic
linux-signed-image-4.4.0-92-generic linux-signed-image-4.4.0-93-generic
linux-signed-image-4.4.0-96-generic linux-signed-image-4.4.0-97-generic
linux-signed-image-4.4.0-98-generic snap-confine ubuntu-core-launcher
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
libfcgi0ldbl spawn-fcgi
以下のパッケージが新たにインストールされます:
fcgiwrap libfcgi0ldbl spawn-fcgi
アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 28 個。
193 kB のアーカイブを取得する必要があります。
この操作後に追加で 665 kB のディスク容量が消費されます。
続行しますか? [Y/n] Y
取得:1 http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 libfcgi0ldbl amd64 2.4.0-8.3 [161 kB]
取得:2 http://jp.archive.ubuntu.com/ubuntu xenial/universe amd64 spawn-fcgi amd64 1.6.4-1 [14.5 kB]
取得:3 http://jp.archive.ubuntu.com/ubuntu xenial/universe amd64 fcgiwrap amd64 1.1.0-6 [17.5 kB]
193 kB を 0秒 で取得しました (1,165 kB/s)
以前に未選択のパッケージ libfcgi0ldbl を選択しています。
(データベースを読み込んでいます ... 現在 1351986 個のファイルとディレクトリがインストールされています。)
.../libfcgi0ldbl_2.4.0-8.3_amd64.deb を展開する準備をしています ...
libfcgi0ldbl (2.4.0-8.3) を展開しています...
以前に未選択のパッケージ spawn-fcgi を選択しています。
.../spawn-fcgi_1.6.4-1_amd64.deb を展開する準備をしています ...
spawn-fcgi (1.6.4-1) を展開しています...
以前に未選択のパッケージ fcgiwrap を選択しています。
.../fcgiwrap_1.1.0-6_amd64.deb を展開する準備をしています ...
fcgiwrap (1.1.0-6) を展開しています...
man-db (2.7.5-1) のトリガを処理しています ...
systemd (229-4ubuntu21.2) のトリガを処理しています ...
ureadahead (0.100.0-19) のトリガを処理しています ...
ureadahead will be reprofiled on next reboot
libfcgi0ldbl (2.4.0-8.3) を設定しています ...
spawn-fcgi (1.6.4-1) を設定しています ...
fcgiwrap (1.1.0-6) を設定しています ...
insserv: warning: script 'K01tonzlr' missing LSB tags and overrides
insserv: warning: script 'K01bruschetta' missing LSB tags and overrides
insserv: warning: script 'K01ellie' missing LSB tags and overrides
insserv: warning: script 'tonzlr' missing LSB tags and overrides
insserv: warning: script 'ellie' missing LSB tags and overrides
insserv: warning: script 'bruschetta' missing LSB tags and overrides
libc-bin (2.23-0ubuntu10) のトリガを処理しています ...
systemd (229-4ubuntu21.2) のトリガを処理しています ...
ureadahead (0.100.0-19) のトリガを処理しています ...
Nginx の設定。/etc/nginx/sites-available/default ファイルに以下を追記。
location ~ \.cgi$ {
root /var/www/html;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
これで .cgi 拡張子を持つファイルがすべて CGI プログラムとして認識されるはず。
/var/run/fcgiwrap.socket は fcgiwrap を apt でインストールすると自動的に作られている。
fcgiwrap の設定。/etc/init.d/fcgiwrap ファイルを編集する。
# FCGI_APP Variables
FCGI_CHILDREN="1"
FCGI_SOCKET="/var/run/$NAME.socket"
FCGI_USER="www-data"
FCGI_GROUP="www-data"
# Socket owner/group (will default to FCGI_USER/FCGI_GROUP if not defined)
FCGI_SOCKET_OWNER="www-data"
FCGI_SOCKET_GROUP="www-data"
デフォルトで上のようになっているのを下のように変えた。
# FCGI_APP Variables
FCGI_CHILDREN="1"
FCGI_SOCKET="/var/run/$NAME.socket"
FCGI_USER="www-data"
FCGI_GROUP="www-data"
# Socket owner/group (will default to FCGI_USER/FCGI_GROUP if not defined)
FCGI_SOCKET_OWNER="root"
FCGI_SOCKET_GROUP="root"
変えたのは FCGI_SOCKET_OWNER と FCGI_SOCKET_GROUP だ。
これで設定は終了のはず。fcgiwrap と Nginx を再起動しよう。
takatoh@wplj $ sudo systemctl restart fcgiwrap
takatoh@wplj $ sudo systemctl restart nginx
最後にテスト。/var/www/html ディレクトリにつぎのような hello.cgi ファイルを作って実行権限をつけた。
#!/usr/bin/ruby
print "Content-Type: text/html\n\n"
print ""
print ""
print ""
print "Hello CGI world!"
print ""
print ""
ブラウザでアクセスしてみると、ちゃんと Hello CGI world! と表示されたので OK。