ローカルネットでノートPCをウェブサーバーに

要約

ip addr で得られる 192.168.1.10の様なIPアドレスでアクセス。

表示されるページは/var/www/html/index.htmlで、これを書き換えて良い。

はじめに

今時のLinuxではパッケージ管理システムを使ってapache2をインストールするのは簡単なので、インストール後からの説明にします。

想定するOSはDebianまたはUbuntuで、Debian8 と Ubuntu18.04で検証しています。

Debian系のApache2の設定ファイルはなかなか合理的に分割管理されているのですが、他のディストリビューションでの書き方や、昔の書き方を混ぜて書いてしまっても大抵は動きますので、そのままウェブに解説記事となっていることもあります。ドキュメントはちゃんと読みたいものです。

Wi-FiルーターがDHCPになるローカルネットで、ノートPCをウェブサーバーに仕立てることを想定します。ノートPCを別のネットワークに移動しても働くように、DNSの存在を想定しません。

今回は、IPアドレスだけでアクセスでアクセスし、デフォルトのドキュメントルートを使うという解説です。ドキュメントルートの変更にも触れています。

VirtualHostについては次回。アクセスするホストのhostsファイルを設定できるのであれば、さらに進んでVirtualHostを追加していくのも面白いでしょう。

デフォルトページの表示

Ubuntu 18.04.3 LTS apache2の新規インストール後には、仮の初期設定が済んでいて 「It works!」のページが用意されています。このページに到達するには、ブラウザのアドレス欄に、自ホストをなんらかの手段で指定する必要があります。普通は、

localhost

ですけど、これはあくまで自分自身にアクセスするためで他のPCからはこのホスト名ではアクセスできません。自ホストにアクセスする方法は他にもいくつかあります。/etc/hostsというファイルを見てみます。

adachi@adachi-CF-Y7:~$ cat /etc/hosts
127.0.0.1	localhost
127.0.1.1	adachi-CF-Y7

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

UbuntuやDebianではホスト名はOSインストール時に入力しています。それがadachi-CF-Y7です。このコンピュータではドメイン名を設定しなかったので、ホスト名だけになっています。

hostnameというコマンドでも確認できます。

adachi@adachi-CF-Y7:~$ hostname
adachi-CF-Y7
adachi@adachi-CF-Y7:~$ hostname -i
127.0.1.1
adachi@adachi-CF-Y7:~$ hostname -f
adachi-CF-Y7

127.0.0.0/8 (先頭の8ビットが127であれば後は何でも良い。ただし127.0.0.0 127.255.255.255以外)が自ホストを表すIPアドレス(ver.4)です。localhostで自ホストのことになるのはこのファイルで127.0.0.1に変換されるからです。

adachi-CF-Y7の場合は、単語として検索のキーワードになってしまいますが、http://をつければ自ホストに繋いでくれます。http://が必要かどうかはブラウザの解釈の設計に依ると考えられます。

http://adachi-CF-Y7

IPアドレスを生で書いても接続されます。127で始まるのは特殊なIPアドレスですが。

127.0.0.1

IPv6で指定することもできます。次のどちらでもOKです。

http://ip6-localhost
[::1]

WiFiルータなどがある環境では、DHCPでIPアドレスが自動取得されています。今時のシステムではホスト名は配布されません。WiFiアクセスポイントごとにホスト名が変わるのは不都合だからです。

WiFiルータなどから配布されたIPアドレスがあっても、hostnameコマンドでは教えてくれません。

というわけで、It Works!ページを表すページのアドレスは次のようにできます。

http://adachi-CF-Y7
127.0.1.1

他のホストからのアクセス

127.0.0.1はどのホストでも自分自身を意味しますから、他のコンピュータ(ホスト)からはアクセスできませんし、adachi-CF-Y7もインストール時に勝手にPC内で決めたことですから、他のホストでは理解できない名前です。他のホストからアクセスするためには、外部から見たアドレスが必要です。ip addr で調べます。

必要なところだけ示します。

adachi@adachi-CF-Y7:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 ...
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
    link/ether 00:0b:97:52:17:55 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.44/24 brd 192.168.1.255 scope global ...
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
    link/ether 00:1d:e0:b3:36:d5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.10/24 brd 192.168.1.255 scope global ...

ということで、このPCの場合は、192.168.1.44, 192.168.1.10 のどちらかでアクセスできるということです。このアドレスは番号の範囲から、プライベートIPアドレスで、ローカルなネットワークの中でのみ有効なアドレスです。このIPアドレスをウェブブラウザのアドレス欄に書けば、他ホストからもアクセスできます。厳密に言うと他ホストも同じネットワークに所属していればという条件があります。今の例では192.168.1.までが同じであるIPアドレスを持つホストからという条件です。同じWi-Fiの下にあれば満たされているでしょう。

WiFiルータなどから自動で取得した番号ならば、環境ごとにまたは接続ごとに番号が変わります。これも注意が必要です。

eth0は有線、wlan0は無線の接続口を表します。コンピュータには1台ずつ番号が割り振られると説明されることがありますが、実際には接続の口ごとに番号が割り当てられます。ひとつの口に2つ以上の番号を割り当てることも可能です。接続口の名前もOSにより決め方があります。最近のDebian系ではeth0でなく、enp3s0などと名付けられるようになっています。eth0は起動時に最初に見つかった有線の接続口(NIC)のことでNICの交換や増設などで名前が異なってしまい、混乱するのを避けるための変更だと思います。

ドキュメントルート

「It Works!」のページは、/var/www/html/index.html なので、これを書き換えていくのが最も手間の省ける方法です。ただし、このページにはサイト管理の要約がありますからざっと読むか名前を変えて残しておくのが良いでしょう。

/var/www/html/をドキュメントルートといいます。IPアドレスや、ホスト名だけでアクセスすると、このルートのindex.htmlが表示されます。ドキュメントルートの下のフォルダにあるファイル以外にはアクセスすることができない仕組みになっています。

今回は、ノートPCをウェブサーバーにして移動先のWiFi環境で使うという想定なので、IPアドレスだけでアクセスできるように、デフォルトの環境にページを作ることにします。

ファイルやディレクトリにはパーミッションと呼ばれる、アクセス権が設定されています。

adachi@adachi-CF-Y7:~$ ls -l /var/www/html
-rw-r--r-- 1 root root 10918 12月 19 02:51 index.html

このままでは、root所有ですから編集できません。これから自分がウェブページの管理者ですから、/var/www/htmlごと自分の所有にしてしまいましょう。自分のユーザー名がadachiで、sudo(一時的な管理者権限取得)はできるとして、

adachi@adachi-CF-Y7:~$ sudo chown adachi: /var/www/html -R

これで、所有者がadachiになり、index.htmlを編集できます。

[sudo] adachi のパスワード:
adachi@adachi-CF-Y7:~$ ls -l /var/www/html
-rw-r--r-- 1 adachi adachi 10918 12月 19 02:51 index.html

そればかりか、htmlフォルダの所有者もadachiになり、ここにファイルを新規に作成できます。

adachi@adachi-CF-Y7:~$ ls -l /var/www/
drwxr-xr-x 1 adachi adachi 4096 12月 19 02:51 html

index.htmlをコピーしてから、index.htmlを編集します。

adachi@adachi-CF-Y7:~$ cd /var/www/html
adachi@adachi-CF-Y7:/var/www/html$ cp index.html indexmoto.html
adachi@adachi-CF-Y7:/var/www/html$ ls -l
-rw-r--r-- 1 adachi adachi   10918  1月 15 16:00 index.html
-rw-r--r-- 1 adachi adachi   10918 12月 19 02:51 indexmoto.html

コピーですから今の所同じファイルです。編集します。

ドキュメントルートの位置だけ変更

少し面倒を背負い込んでもドキュメントルートを変更したいという方は続きをどうぞ。

最近は/srvフォルダ内に/srv/wwwなどのフォルダを作り、そこをドキュメントルートにすることが多くなっています。いろいろな用途に使われる/varの一部に間借りするのではなく、サーバーのデータとして/srv 以下に独立させようという意図なのだと思います。

UbuntuやDebianでドキュメントルートを/srv/wwwにするには2つのことが必要です。

(1)

デフォルトでドキュメントルートを指定しているファイルは、/etc/apache2/sites-available/000-default.conf です。

000-default.confには次のような内容が書かれています(解説部を除いています)。

<VirtualHost *:80>
    #ServerName www.example.com
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

変更するのはDocumentRootの部分だけで

    DocumentRoot /srv/www

とすれば /srv/wwwになります。/var/www/htmlに合わせて

    DocumentRoot /srv/www/html

でもいいでしょう。

設定ファイルがフォルダに入っていて、ファイル名が 000-default.conf なのは、ひとつのサーバーで複数のサーバーであるように見せかけるVirtualHostを管理しやすくするためです。設定ファイルひとつにつきVirtualHostひとつということににすれば管理しやすいということです。000から始まっているのはこのファイルが最初に読み込まれるようにしたいからです。最初に読まれるファイルに書かれているドキュメントルーシがデフォルトということです。

VirtualHost は ServerName で識別しますが、デフォルトはどの名前とも合致しない時のものなので、このファイルの中のServerNameは書いても意味がありません。そこでコメントアウト(#で開始)されています。

IPアドレスだけでアクセスする場合は、ServerNameを指定できませんから、必然的にデフォルトが使用されることになります。

(2)

「It works!」のページの中に、デフォルトでは、/var/www、/usr/share(Webアプリケーション用)以外にあるファイルへのWebブラウザ経由のアクセスを許可ないこと、他の場所(/srvなど)をドキュメントルートとする場合は、/etc/apache2/apache2.confのホワイトリストに登録する必要があることを注意しています。

apache2.conf の中には、親切にも

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

#<Directory /srv/www/>
#        Options Indexes FollowSymLinks
#        AllowOverride None
#        Require all granted
#</Directory>

とありますので、#を削除すれば、/srv/www以下のアクセスを許可することが簡単にできます。

/srv/wwwや/var/wwwまでで止めているのは、/var/www/html /var/www/html2 ...などとVirtualHostごとのドキュメントルートを増やしても、ホワイトリストは変更しなくても良いという意図です。

2つの設定をしたらapache2サーバーに設定を再読込させる必要があります。

adachi@adachi-CF-Y7:/srv/www/html$  systemctl reload apache2

これはsudoを忘れています。でも、ダイアログが出てパスワードを要求されるだけで済みました。

/var/www/html と同様にパーミッションを設定して、編集する必要があります。