WSL で apache を動かす

# WSL で apache を動かす


## 動作環境
``` shell
$ uname -srvmpi
Linux 4.4.0-18362-Microsoft #476-Microsoft Fri Nov 01 16:53:00 PST 2019 x86_64 x86_64 x86_64 GNU/Linux
$ apache2 -v
Server version: Apache/2.4.29 (Ubuntu)
Server built:   2019-09-16T12:58:48
$ perl --version

This is perl 5, version 26, subversion 1 (v5.26.1) built for x86_64-linux-gnu-thread-multi
...
```

## 各種コマンド
### service の状態確認/停止/起動/再起動/設定再読込
``` shell
service apache2 status
sudo service apache2 stop
sudo service apache2 start
sudo service apache2 restart
sudo service apache2 reload
```
### モジュールの有効/無効
``` shell
sudo a2enmod cgid
sudo a2dismod cgid
```
### 設定の有効/無効
``` shell
sudo a2enconf serve-cgi-bin
sudo a2disconf serve-cgi-bin
```


## apache2

### apache2 をインストール
``` shell
sudo apt install apache2
```

### service の起動後にこの辺にアクセスできるかを確認
- [http://localhost/](http://localhost/)
- [http://localhost/server-status](http://localhost/server-status)


## cgid

### 設定の初期値（編集前）
- `cgid` モジュールは最初から有効になっている
- 設定 `mime`, `serve-cgi-bin` は最初から有効になっている

``` conf:【設定-A1】/etc/apache2/mods-available/mime.conf
...
	#
	# AddHandler allows you to map certain file extensions to "handlers":
	# actions unrelated to filetype. These can be either built into the server
	# or added with the Action directive (see below)
	#
	# To use CGI scripts outside of ScriptAliased directories:
	# (You will also need to add "ExecCGI" to the "Options" directive.)
	#
	#AddHandler cgi-script .cgi
...
```

``` conf:【設定-B1】/etc/apache2/conf-available/<strong>serve-cgi-bin</strong>.conf
...
	<IfDefine ENABLE_USR_LIB_CGI_BIN>
		ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
		<Directory "/usr/lib/cgi-bin">
			AllowOverride None
			Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
			Require all granted
		</Directory>
	</IfDefine>
...
```

#### テスト用のCGIプログラムを配置
- 実行権限があること(`chmod +x /usr/lib/cgi-bin/env.cgi`)

``` perl:<strong>/usr/lib/cgi-bin/</strong>env.cgi
#!/usr/bin/perl
use Cwd qw(getcwd);
print "Content-type: text/html\n\n";
print "<html><head><title>ENV</title></head><body>";
print "\n<p>Current Working Directory is ",getcwd(),"</p>\n<table border=1>";
my @keys = qw/MOD_PERL DOCUMENT_ROOT SCRIPT_NAME SCRIPT_FILENAME/;
for my $i (@keys){ print "\n<tr><td>ENV{$i}</td><td>$ENV{$i}</td></tr>"; }
print "\n</table></body></html>";
```

#### service の再起動後にアクセスできるかを確認
- [http://localhost<strong>/cgi-bin/</strong>env.cgi](http://localhost/cgi-bin/env.cgi)

<table border=1>
<tr><td>getcwd()</td><td>/usr/lib/cgi-bin</td></tr>
<tr><td>ENV{MOD_PERL}</td><td></td></tr>
<tr><td>ENV{DOCUMENT_ROOT}</td><td>/var/www/html</td></tr>
<tr><td>ENV{SCRIPT_NAME}</td><td>/cgi-bin/env.cgi</td></tr>
<tr><td>ENV{SCRIPT_FILENAME}</td><td>/usr/lib/cgi-bin/env.cgi</td></tr>
</table>

### 設定 ("ScriptAliase" が指定されていないディレクトリでCGIを有効にする)

``` conf:【設定-A2】/etc/apache2/mods-available/mime.conf
...
	#
	# AddHandler allows you to map certain file extensions to "handlers":
	# actions unrelated to filetype. These can be either built into the server
	# or added with the Action directive (see below)
	#
	# To use CGI scripts outside of ScriptAliased directories:
	# (You will also need to add "ExecCGI" to the "Options" directive.)
	#
	AddHandler cgi-script .cgi
...
```

#### 設定 `serve-mine` を追加し、有効にする

``` conf:【設定-C2】/etc/apache2/conf-available/<strong>serve-mine</strong>.conf
Alias /perl /var/www/perl
<Directory "/var/www/perl">
	Options +ExecCGI
</Directory>
```
``` shell
sudo a2enconf serve-mine
```

#### テスト用のCGIプログラムを配置
- 実行権限があること(`chmod +x /var/www/perl/env.cgi`)

``` perl:<strong>/var/www/perl</strong>/env.cgi
# /usr/lib/cgi-bin/env.cgi と同じ内容
```

#### service の再起動後にアクセスできるかを確認
- [http://localhost/<strong>perl/</strong>env.cgi](http://localhost/perl/env.cgi)

<table border=1>
<tr><td>getcwd()</td><td>/var/www/perl</td></tr>
<tr><td>ENV{MOD_PERL}</td><td></td></tr>
<tr><td>ENV{DOCUMENT_ROOT}</td><td>/var/www/html</td></tr>
<tr><td>ENV{SCRIPT_NAME}</td><td>/perl/env.cgi</td></tr>
<tr><td>ENV{SCRIPT_FILENAME}</td><td>/var/www/perl/env.cgi</td></tr>
</table>

## mod-perl2

### mod-perl2 をインストール
``` shell
sudo apt install libapache2-mod-perl2
```

### 設定 (ModPerl::Registry を使用)
- 【設定-A1】のままで良い

``` conf:【設定-C3A】/etc/apache2/conf-available/<strong>serve-mine</strong>.conf
Alias /perl /var/www/perl
<Directory "/var/www/perl">
	SetHandler perl-script
	PerlResponseHandler ModPerl::Registry
#	PerlResponseHandler ModPerl::RegistryPrefork
	PerlOptions +ParseHeaders
	Options +ExecCGI
</Directory>
```

#### モジュール
- `cgid` を無効にしないと、apache2 が起動しない
- `perl` を有効にする

``` shell
sudo a2dismod cgid
sudo a2enmod perl
```

#### service の再起動後にアクセスできるかを確認
- [http://localhost/<strong>perl/</strong>env.cgi](http://localhost/perl/env.cgi)

<table border=1>
<tr><td>getcwd()</td><td>/</td></tr>
<tr><td>ENV{MOD_PERL}</td><td>mod_perl/2.0.10</td></tr>
<tr><td>ENV{DOCUMENT_ROOT}</td><td>/var/www/html</td></tr>
<tr><td>ENV{SCRIPT_NAME}</td><td>/perl/env.cgi</td></tr>
<tr><td>ENV{SCRIPT_FILENAME}</td><td>/var/www/perl/env.cgi</td></tr>
</table>
カレントディレクトリは、env.cgi の配置場所ではなく、"/" になっている。

### 設定 (ModPerl::RegistryPrefork を使用)
- 【設定-A1】のままで良い

``` conf:【設定-C3B】/etc/apache2/conf-available/<strong>serve-mine</strong>.conf
Alias /perl /var/www/perl
<Directory "/var/www/perl">
	SetHandler perl-script
#	PerlResponseHandler ModPerl::Registry
	PerlResponseHandler ModPerl::RegistryPrefork
	PerlOptions +ParseHeaders
	Options +ExecCGI
</Directory>
```

#### モジュール
- `cgid` を無効にしないと、apache2 が起動しない
- `perl` を有効にする
- `mpm_event` を無効にしないと、アクセス時にエラーとなる
- `mpm_prefork` を有効にする

``` shell
sudo a2dismod cgid
sudo a2enmod perl
sudo a2dismod mpm_event
sudo a2enmod mpm_prefork
```

#### service の再起動後にアクセスできるかを確認
- [http://localhost/<strong>perl/</strong>env.cgi](http://localhost/perl/env.cgi)

<table border=1>
<tr><td>getcwd()</td><td>/var/www/perl</td></tr>
<tr><td>ENV{MOD_PERL}</td><td>mod_perl/2.0.10</td></tr>
<tr><td>ENV{DOCUMENT_ROOT}</td><td>/var/www/html</td></tr>
<tr><td>ENV{SCRIPT_NAME}</td><td>/perl/env.cgi</td></tr>
<tr><td>ENV{SCRIPT_FILENAME}</td><td>/var/www/perl/env.cgi</td></tr>
</table>
カレントディレクトリは、env.cgi の配置場所と同じになっている。