WSL で Apache サーバを立ててみる
MacOS だとデフォルトで Apache サーバがインストールされていて、ちょっとした CGI の検証なんかがやりやすかったりする。Linux の場合も yum
や apt
で httpd
をインストールしてやればすぐ用意できる。しかし、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/
基本的にはコレだけ。続いて設定ファイルを見直していく。
/etc/apache2/apache2.conf
- ドキュメントルートを
/var/www/html/
にしたい - そのドキュメントルートから CGI を扱えるようにしたい
- ドキュメントルートを
# ↓ 以下のような行がデフォルトで存在すると思うので、そこに修正を入れる
<Directory /var/www/>
# 以下1行を追加する
AddHandler cgi-script .cgi .pl .py .rb
# ↓ ExecCGI を追記する
Options Indexes FollowSymLinks ExecCGI
AllowOverride None
Require all granted
</Directory>
+ExecCGI
とプラス記号 +
を付けて書くと構文エラーになっちゃった。この辺、バージョンによって記号を付けろとか付けるなとかあるみたい。テキトーに。
/etc/apache2/conf-available/serve-cgi-bin.conf
- CGI モジュールに対応する設定。
/var/www/
とは全く違うディレクトリ配下がhttp://localhost/cgi-bin/
で扱われるように設定されているので、必要に応じて直す
- CGI モジュールに対応する設定。
こんな感じ。修正したら $ 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」とほぼ同じ構成なようだ。
- 参考 : apachectlコマンドとhttpdの違い - 女子WEBエンジニアのTechメモ
- 同じだよ、とのこと
- 参考 : Debian Apache2の設定(1)
conf-available/
やmods-enabled/
の扱い方
- 参考 : /etc/apache2/apache2.conf
httpd.conf
ではなくapache2.conf
も、内容が結構違うのである
service
コマンドって何
CentOS 7 とかで systemctl
コマンドはよく使っていたけど、service
コマンドって何?
- 参考 : Windows 10 Home(WSL2)のUbuntuでsystemctlを利用する方法(systemdをPID1で動作させる方法) | Snow System
- WSL は
systemctl
非対応。service
コマンドを使うのが定石
- WSL は
- 参考 : Linuxのコマンド実行で使うserviceとsystemctlの違いとは何か? | CodeLog | CodeLog
- 参考 : service — serviceとsystemctlの違いは何ですか?
systemctl
の方が後発なだけあって手軽で高機能らしい
- 参考 : CentOS7系と6系のコマンドの違いについて - Qiita
- CentOS 7 の
service
コマンドはsystemctl
にリダイレクトするシェルスクリプトになっているらしい
- CentOS 7 の
…ということで、systemctl
の方が高機能なんだけど、WSL ではデフォルトでは使えないので、service
コマンドを使ってるってことみたい。
以上
ひとまずこんな形で、WSL 上で Apache を動かして、CGI スクリプトなんかを動かすことはできた。よきよき。