WSL で Apache サーバを立ててみる

MacOS だとデフォルトで Apache サーバがインストールされていて、ちょっとした CGI の検証なんかがやりやすかったりする。Linux の場合も yumapthttpd をインストールしてやればすぐ用意できる。しかし、Windows での Apache HTTP Server のインストールはいつもなんだか面倒臭い感じがしていた。

最近は WSL が進歩してきているので、WSL だったらすぐに Apache サーバがインストールできるかな?と思って、やってみた。

目次

WSL に Apache をインストールする

# Apache2 をインストールする
$ sudo apt install apache2
# バージョン確認
$ apache2 -v

# CGI モジュールと設定を有効にする
$ sudo a2enmod cgid
$ sudo a2enconf serve-cgi-bin

# 設定を反映するためサービスを再起動する
$ sudo service apache2 restart
# 状態を確認する
$ service apache2 status

# 自分自身でアクセスして確認してみる
$ curl http://localhost/

基本的にはコレだけ。続いて設定ファイルを見直していく。

# ↓ 以下のような行がデフォルトで存在すると思うので、そこに修正を入れる
<Directory /var/www/>
    # 以下1行を追加する
    AddHandler cgi-script .cgi .pl .py .rb
    # ↓ ExecCGI を追記する
    Options Indexes FollowSymLinks ExecCGI
    AllowOverride None
    Require all granted
</Directory>

+ExecCGI とプラス記号 + を付けて書くと構文エラーになっちゃった。この辺、バージョンによって記号を付けろとか付けるなとかあるみたい。テキトーに。

こんな感じ。修正したら $ sudo service apache2 restart コマンドで再起動して設定ファイルの変更を反映させてやる。

テスト用に簡単な CGI スクリプトでも書いてやって、実行権限を付けてちゃんと動作するか見てやると良いだろう。

Windows ホスト側で閲覧する

WSL 上の80番ポートで Apache サーバが起動しているので、WSL の CUI コンソールで $ curl http://localhost/ と叩く分には、Apache サーバからのレスポンスがちゃんと得られるはずだ。しかし、Windows ホスト側では localhost では扱えない。

そこで、ifconfig で WSL の Private IP (恐らく 172. で始まる IP) を確認し、その IP を指定して Windows ホスト側からアクセスしてやれば、ブラウザなどから WSL Apache サーバの内容が閲覧できる。

Apache2 の設定ファイルがちょっと違う気がする

これまで自分が触ってきた Apache と比べると、設定ファイルの位置やディレクトリ構成なんかが奇妙に感じたので、ちょっと整理してみた。以下は自分が扱ったことのある環境の情報を再確認してまとめ直したもの。

OS コマンド バージョン表記 設定ディレクトリ 配下の構成
MacOS httpd v2.4.33 (Unix) /etc/apache2/ conf-available/ などは存在しない
CentOS 7 httpd v2.4.6 (CentOS) /etc/httpd/ modules/ などがある
Ubuntu 18.04 apache2 v2.4.29 (Ubuntu) /etc/apache2/ conf-available/ などがある

…ほう。気持ち悪いな。w 実行コマンドも httpd だったり apache2 だったりするし、設定ファイルがあるディレクトリのルートもまちまち。さらには配下の設定ファイルの構成も異なっていて、なんなんだか。大まかなバージョンとしてはどれも「Apache HTTP Server v2.4 系」なのだろうが、その後ろにカッコで書かれている「(Unix)」とか「(CentOS)」とか「(Ubuntu)」とかいうところがキモになっているっぽい。ディストリビューションごとに Apache サーバのデフォルトの提供の仕方が異なるようである。

WSL 環境は Ubuntu なだけあって、最後の「Ubuntu 18.04」とほぼ同じ構成なようだ。

service コマンドって何

CentOS 7 とかで systemctl コマンドはよく使っていたけど、service コマンドって何?

…ということで、systemctl の方が高機能なんだけど、WSL ではデフォルトでは使えないので、service コマンドを使ってるってことみたい。

以上

ひとまずこんな形で、WSL 上で Apache を動かして、CGI スクリプトなんかを動かすことはできた。よきよき。