今回の目的だが、初心に戻るため、
KENT-WEBさんのCGIをDocker+nginx+CGIで動かす
という事を目的にしている
したがって、動かすCGIはPerlとなる
ちなみにCGIとSSIについては以下を参照して欲しい
https://serverkurabe.com/cgi-and-ssi/
誰か同じことやってないかと探してみたら、
こちらに発見
https://github.com/dai65527/nginx_cgi_on_docker
ちょっと編集して自分の環境に合わせて使わせていただくことにしました
以下手順
WSL2を起動
適当なフォルダ(~/workにしておく)でDockerfileをつくる
~/work/Dockerfile
FROM debian:buster
RUN apt-get update && apt-get -y upgrade \
&& apt-get -y install \
nginx \
fcgiwrap \
perl \
vim
RUN cp /usr/share/doc/fcgiwrap/examples/nginx.conf /etc/nginx/fcgiwrap.conf
RUN sed -i \
-e s/'\/usr\/lib'/'\/var\/www\/site_a'/ \
/etc/nginx/fcgiwrap.conf
RUN mkdir -p /var/www/site_a/cgi-bin
COPY ./srcs/default /etc/nginx/sites-available/default
RUN chmod 644 /etc/nginx/sites-available/default
COPY ./srcs/cgifiles /var/www/site_a/cgi-bin/
RUN chmod -R 755 /var/www/site_a/cgi-bin/
COPY ./srcs/entrypoint.sh /
RUN chmod 755 /entrypoint.sh
CMD [ "/entrypoint.sh" ]
一応解説
nginxとfcgiwrapとperlとvimも入れておく
fcgiwrapとfastcgiに関しては以下を参照
http://www.pasokuma.net/linux/server/nginx/nginxfcgi.html
fcgiwrapのexampleにあるnginx.conf をfcgiwrap.confにコピーすることで
fcgiwrapを動かす準備をする
fcgiwrap.confの/usr/libを/var/www/site_aにしておく
つづいて、nginxの設定を用意する
nginxの動作としては、/var/wwwにサイトをいくつも動作させることが出来る
例えば、/var/www/ownCloudとか/var/www/Corporatoinとか動かすことが出来るのだが、それらの設定を/etc/nginx/sites-availableに置いておいて、
そこのシンボリックリンクを/etc/nginx/sites-enabledに貼ることで、サイトの設定を有効にする
今回は、/var/www/site_aというサイトを動作させる
~/work/srcs/default
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/site_a;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
include fcgiwrap.conf;
}
つづいて、~/work/cgifilesと言うフォルダを作り
そこにテスト用のCGIを準備しておく
~/work/cgifiles/perl.cgi
#!/usr/bin/perl
print "Content-Type: text/html\n\n";
print "<h1>Hello perl.cgi !!</h1>\n";
print "<p>AUTH_TYPE = \"$ENV{'AUTH_TYPE'}\"</p>\n";
print "<p>CONTENT_LENGTH = \"$ENV{'CONTENT_LENGTH'}\"</p>\n";
print "<p>CONTENT_TYPE = \"$ENV{'CONTENT_TYPE'}\"</p>\n";
print "<p>GATEWAY_INTERFACE = \"$ENV{'GATEWAY_INTERFACE'}\"</p>\n";
print "<p>PATH_INFO = \"$ENV{'PATH_INFO'}\"</p>\n";
print "<p>PATH_TRANSLATED = \"$ENV{'PATH_TRANSLATED'}\"</p>\n";
print "<p>QUERY_STRING = \"$ENV{'QUERY_STRING'}\"</p>\n";
print "<p>REMOTE_ADDR = \"$ENV{'REMOTE_ADDR'}\"</p>\n";
print "<p>REMOTE_IDENT = \"$ENV{'REMOTE_IDENT'}\"</p>\n";
print "<p>REMOTE_USER = \"$ENV{'REMOTE_USER'}\"</p>\n";
print "<p>REQUEST_METHOD = \"$ENV{'REQUEST_METHOD'}\"</p>\n";
print "<p>REQUEST_URI = \"$ENV{'REQUEST_URI'}\"</p>\n";
print "<p>SCRIPT_NAME = \"$ENV{'SCRIPT_NAME'}\"</p>\n";
print "<p>SERVER_NAME = \"$ENV{'SERVER_NAME'}\"</p>\n";
print "<p>SERVER_PORT = \"$ENV{'SERVER_PORT'}\"</p>\n";
print "<p>SERVER_PROTOCOL = \"$ENV{'SERVER_PROTOCOL'}\"</p>\n";
print "<p>SERVER_SOFTWARE = \"$ENV{'SERVER_SOFTWARE'}\"</p>\n";
Dockerfileに記述した通り、/var/www/nginx/site_a/cgi-binにコピーされ、
http://localhost:8080/cgi-bin/perl.cgiにアクセスすると上記が動く
つづいて、entrypoint.shの準備
~/work/srcs/entrypoint.sh
#!/bin/bash
echo 'starting nginx and fcgiwrap'
nginx
/etc/init.d/fcgiwrap start
echo 'done'
これの役割は、fcgiwrapのstart
Dockerfileの最後でこのentrypoint.shを実行する
以上でフォルダ構成は次のようになる
/home/xxx/work
└── srcs
├── cgifiles
├── default
└── entrypoint.sh
いよいよ?ビルドから始める
$ docker build -t nginx_cgi .
続いて起動
$ docker run --rm --name nginx_cgi -d -p 8080:80 nginx_cgi
起動したら、さきほどのhttp://localhost:8080/cgi-bin/perl.cgiにアクセスし、
CGIが起動することを確認する
DockerDesktopを入れていたら、そちらでも確認できる
動くことを確認したら、site_aのフォルダをWSL2にマップし、
VSCodeで編集できるように起動し直す
DockerDesktopでコンテナを削除し、以下でもう一度起動
$ docker run --rm --name nginx_cgi_test -d -v ~/www:/var/www/ -p 8080:80 nginx_cgi
VSCodeを起動し~/wwwにアクセスすると、Dockerの/var/wwwがマップされている状態になる
cgi-binはマップ先に無くなっているので、~/www/site_a/cgi-binを作り、
そこに先ほどのperl.cgiを配置
以下の様に755をつける
$ chmod 755 ~/www/site_a/cgi-bin/perl.cgi
http://localhost:8080/cgi-bin/perl.cgiで表示されることを確認する
kent-webさんのCGIで、今回は、チャットシステムのWindyを動かしてみる
ダウンロードしたZIPを解凍し、WindyフォルダのCGIを~/www/site_a/cgi-binにコピー
index.htmlはkent-webさんのサイトのチャットサンプルから、ソースを表示して丸コピしてつくり、~/www/site-aにコピー
chmodでkent-webさんのページの指示通りに設定
これで動くはずなのだけど、私は先走って、index.htmlからUTF-8化し、
全部のCGIもUTF-8化しまくって文字化けしまくってしまった
まぁ、あれこれやると動くようになるのだけど、丁度こちらのサイトを発見
http://mycc.s33.xrea.com/data/pc/perl_use_utf8.html
こちらを参考にしてあれこれ変えてみたところUTF-8で動くようになりました
申し訳ないけど、どこをどう変えたかは、分かるようにこちらに張り付けるわけにはいきません
KENT-WEBさんは著作権を放棄されているわけではなく、
わたしが修正したからと言って、そのコードをここに張り付けるわけにはいかないのです
ヒントは上記サイトにありますので、そこを参考にしていただきたい
===最後に===
今回は複数のサイトで得た情報をまとめただけで、
わたしが何か新しいことをしたわけでもなんでもありません
情報をWEBに公開されている方々にお礼申し上げます
最近、Javaの仕事が多く、思ったよりJavaが遅いという認識に至りました
WEB技術でクソ重い物をつかわずとも、
CGIの方が早いし開発もしやすいのではないかと、
かつて大変お世話になったKENT-WEBさんのチャットを取り上げさせていただきました
若い人たちに是非ここの内容をトライしていただきたいです
WSL2でなくとも、ご自宅に眠っているラズパイでも動かせると思います
ドメインを取得してDDNSで自宅のサーバを動かすこともできます
つまり、自分で作ったサーバを外部に公開することも出来るという事です
ただし、その場合、LetsEncryptなどで証明書を作ったり、nginxの設定を変えたり、
あれこれやることはあります
しかし、やってみることは勉強になるでしょう
攻撃を食らって、ログを見て絶叫してみるとか、
監視してみるとか、
自分の知識を広げることもつながることでしょう