!!!OpenBSD Webサーバ (httpd+slowcgi on OpenBSD ==6.8== 7.0) {{category OpenBSD,nolink}}OpenBSD の Webサーバ httpd(relayd) で、[slowcgi(8)|https://man.openbsd.org/slowcgi.8] を使い CGI (Common Gateway Interface) を動かす。 slowcgi は、CGI を実行する FastCGIプロトコルを処理する。httpd で、CGI を実行して表示できるようにする。 httpd 自体を動かす設定は、[[OpenBSD/httpd/68(relayd)]] を参照。 * 関連 man → [httpd(8)|https://man.openbsd.org/httpd.8], [httpd.conf(5)|https://man.openbsd.org/httpd.conf.5], [slowcgi(8)|https://man.openbsd.org/slowcgi.8] !!! slowcgi の起動設定 !! 自動起動 サーバが起動したときに slowcgi も実行されるように、'''/etc/rc.conf.local''' に '''slowcgi_flags''' を指定する。 # FastCGI to CGI wrapper server slowcgi_flags= または、'''rcctl enable slowcgi''' で有効にする( /etc/rc.conf.local に slowcgi_flags= が記載される)。 !! デバッグ root ユーザのコンソールで、'''-dv''' オプションをつけて実行すると、処理の内容が表示される。 # slowcgi -dv slowcgi: sock_user: www slowcgi: socket: /var/www/run/slowcgi.sock slowcgi: slowcgi_user: www slowcgi: chroot: /var/www !!! Webサーバ(httpd) の設定 '''/etc/httpd.conf''' に設定する。サンプルが /etc/examples/httpd.conf にある。 OpenBSD の httpd および slowcgi は、デフォルトで '''/var/www''' に chroot されるようになっている。 そのため、動的リンクされているプログラムや sh や perl などのスクリプトを実行する場合は、chroot されるディレクトリ /var/www 以下に必要なファイルを配置しておく必要がある。 !! 動的ドキュメント '''/var/www/cgi-bin''' 以下のプログラムを実行し結果を表示させる(/var/www に chroot されるので、パスは /cgi-bin)。 server "default" { # :中略 location "/cgi-bin/*" { fastcgi socket "/run/slowcgi.sock" directory no index root "/" #request strip 1 } } !!! CGI動作確認サンプル !! スタティックリンクプログラム スタティックリンクされたプログラムを実行させる(ダイナミックリンクされたプログラムの場合、必要なライブラリも配置する必要があるため、ファイルサイズが大きくなるがスタティックリンクで作成する)。 下記の C言語プログラムを保存する。 「hello world」という文字と動いた時刻を表示させる。 #include #include #include int main(){ time_t now; puts("Content-Type: text/plain"); puts(""); puts("hello world"); now = time(NULL); puts(ctime(&now)); return (0); } スタティックリンクでコンパイルする。 # clang -o test_cgi -static test_cgi.c chroot して実行できるか確認する。 # chroot -u www /var/www/ /cgi-bin/test_cgi Content-Type: text/plain hello world Tue Nov 23 07:03:11 2021 curl でローカルホストに接続して確認する。 # curl -sv http://localhost/cgi-bin/test_cgi * Trying 127.0.0.1:80... * Connected to localhost (127.0.0.1) port 80 (#0) > GET /cgi-bin/test_cgi HTTP/1.1 > Host: localhost > User-Agent: curl/7.72.0 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < Connection: keep-alive < Content-Type: text/plain < Date: Tue, 23 Nov 2021 07:07:24 GMT < Server: OpenBSD httpd < Transfer-Encoding: chunked < hello world Tue Nov 23 07:07:24 2021 * Connection #0 to host localhost left intact !!シェルスクリプト sh シェルスクリプトを実行する。 下記の sh シェルスクリプトを保存する。 「hello world」という文字とリクエスト元のホスト名/IPアドレスを表示させる。 #!/bin/sh echo "Content-Type: text/plain\n\n"; echo "hello world\n"; echo "HOST is $HTTP_HOST"; シェルスクリプトが動くように /bin/sh をコピーする。 # cp -p /bin/sh /var/www/bin/ chroot して実行できるか確認する。 # chroot -u www /var/www/ /cgi-bin/test_sh.cgi Content-Type: text/plain hello world HOST is curl でローカルホストに接続して確認する。 # curl -sv http://localhost/cgi-bin/test_sh.cgi * Trying 127.0.0.1:80... * Connected to localhost (127.0.0.1) port 80 (#0) > GET /cgi-bin/test_sh.cgi HTTP/1.1 > Host: localhost > User-Agent: curl/7.72.0 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < Connection: keep-alive < Content-Type: text/plain < Date: Tue, 23 Nov 2021 07:20:13 GMT < Server: OpenBSD httpd < Transfer-Encoding: chunked < hello world HOST is localhost * Connection #0 to host localhost left intact !!perl スクリプト perl スクリプトを実行する。