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。