2023年7月29日土曜日

Windows WSL2 でnginx + CGI

今回の目的だが、初心に戻るため、

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
├── Dockerfile
└── srcs
    ├── cgifiles
    │   └── perl.cgi
    ├── 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の設定を変えたり、
あれこれやることはあります

しかし、やってみることは勉強になるでしょう
攻撃を食らって、ログを見て絶叫してみるとか、
監視してみるとか、
自分の知識を広げることもつながることでしょう

0 件のコメント: