皆さま、いかがお過ごしでしょうか?歌乃です。

前回(すぐ忘れる自分のためのweb開発環境準備手順)からの続きでございます。

前回は

  • windows で wsl を準備
  • wsl の上に Linux ディストリビューション(Ubuntu)をインストール
  • Ubuntu に webサーバー(Apache2)をインストール
  • webサーバー(Apache2)の動作確認 まで作業しました。

あるぇ?箇条書きにしたら大して作業してないみたいな感じが…(;・∀・)

いやいや、wslの設定とか、ubuntu インストール後のパッケージ更新とか、それなりにやることあったんですよ(たぶん)!




Linux(Ubuntu)でディレクトリ関連の設定

Windowsで作業しているとはあまり意識しませんが、Linuxではユーザーの権限、特にファイルの所有権に関する設計思想に従わなければいけない場面が多々あります。

Ubuntu 上の Apache2 では webサーバーの公開ディレクトリはデフォルトで var/www/html になっていますが、前述のような問題もあって別のディレクトリに変更して運用するのが無難です。

またlinuxはマルチユーザーでの運用を前提に考えられているので、各ユーザーごとにページを公開するといった使い方もできるようになっています。


ユーザーディレクトリの公開準備

apache サーバーの動きを決める設定ファイル httpd.conf(apache.conf) にはいろいろな設定が記述されていますが、ubuntuのapache2にはユーザーディレクトリ配下にファイルを置いて公開するための設定がすでに用意されています。

「/etc/apache2/mods-available/userdir.conf」がそれです。

ファイルの中を覗くと

<IfModule mod_userdir.c>
        UserDir public_html
        UserDir disabled root

        <Directory /home/*/public_html>
                AllowOverride FileInfo AuthConfig Limit Indexes
                Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
                Require method GET POST OPTIONS
        </Directory>
</IfModule>

ユーザーディレクトリの配下に「public_html」というディレクトリを作ってそこを利用すればいいようです。

ただし、このユーザーディレクトリモジュールはデフォルトでは読み込まれていません。なので読み込まれるように設定します。

以下のコマンドを実行します。

$ sudo a2enmod userdir

このコマンドの実行で userdir 関連のファイルが「/etc/apache2/mods-enabled/」配下にシンボリックリンクされてapacheの起動時に読み込まれるようになります。

設定を変更したので、忘れずにサービスを再起動しておきましょう。

$ sudo systemctl restart apache2



ユーザーディレクトリ配下に公開用ディレクトリを作成します。confの設定に合わせて「public_html」で作成します。

$ cd /home/utano/
$ mkdir public_html

utanoの部分は自分のユーザー名に置き換えてください。


VirtualHost ディレクティブを編集する

apache にはさまざまな設定ファイルがありますが、公開ディレクトリの設定は virtual host の設定情報の中に記述されています。

virtual host はwebサーバーにアクセス(リクエスト)があった場合に、host名(大抵はサイト名≒ドメインorサブドメイン)ごとにアクセス先(webサーバー上のディレクトリ)を切り替えることで、webサーバーへのアクセス(リクエスト)が host へのアクセスのように見せかけるための仕様です。

virtual host を利用することで一台のwebサーバーで複数のhost(サイトやドメイン)の運用が可能になります。

ubuntuのapache2の場合 VirtualHost の記述は「/etc/apache2/sites-available/000-default.conf」にあります。vi や nano を使ってターミナル上からファイルを編集します。

$ sudo vi /etc/apache2/sites-available/000-default.conf

conf内で変更する箇所は2つ。
「DocumentRoot」と「Directory ディレクティブ」です。

DocumentRoot ディレクティブに関しては

~~
    DocumentRoot /var/www/html
~~

となっている箇所を

~~
    # DocumentRoot /var/www/html *コメントアウトする
    DocumentRoot /home/utano/public_html
~~

新しく設定したい公開ディレクトリに変更します。ディレクトリ末尾のスラッシュの有無に関してはapacheのドキュメントに「末尾にスラッシュ付けないでね」と書いてあるのでそれに従います。

Directory ディレクティブも

~~
    <Directory /var/www/html>
         Require all granted
~~

となっているところを

~~
    <Directory /home/utano/public_html>
         Require all granted
~~

新しく設定したい公開ディレクトリに変更しておきます。

ユーザーディレクトリ配下のpublic_htmlに関しては、前述した「userdir.conf」内に記述があるので、ぶっちゃけVirtualHostディレクティブ内に記述が無くても動作します。


目的の httpd.conf(apache.conf) が見つからない場合の対処

Linuxというかapacheの設定ファイルは細分化されているためかなり大量にあります。
管理者や開発者ですら「迷走しているのでは?」と思わせるようなファイルのとっちらかりようです。

良くあるのは http.conf、httpd.conf、apache.conf あたりですが、conf ファイルの中で別の conf ファイルを読み込んだりしているので、苦労して見つけた後は「ユリーカ!」と叫んでしまうくらいです。

さてそんな conf ファイルの探し方ですが、まずは「systemctl list-units --type=service」コマンドでサービスの一覧を表示して、サーバー上で動いているhttpサービスを探します。

$ systemctl list-units --type=service
  UNIT                                                   LOAD   ACTIVE SUB     DESCRIPTION                          >
  apache2.service                                        loaded active running The Apache HTTP Server
  apport.service                                         loaded active exited  LSB: automatic crash report generation
  console-getty.service                                  loaded active running Console Getty
~~

HTTP サーバーとしてapache2 が動いていることが判ります。

apache2 の情報を確認します。

$ apache2 -V
Server version: Apache/2.4.52 (Ubuntu)
Server built:   2024-07-17T18:57:26
~~
 -D HTTPD_ROOT="/etc/apache2"
 -D SUEXEC_BIN="/usr/lib/apache2/suexec"
 -D DEFAULT_PIDLOG="/var/run/apache2.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="mime.types"
 -D SERVER_CONFIG_FILE="apache2.conf"

確認した情報から、apacheのルートディレクトリが「/etc/apache2」であることとサーバー設定ファイルが「apache2.conf」であることが判ります。

「/etc/apache2/apache2.conf」を確認します。

~~
# It is split into several files forming the configuration hierarchy outlined
# below, all located in the /etc/apache2/ directory:
#
#       /etc/apache2/
#       |-- apache2.conf
#       |       `--  ports.conf
#       |-- mods-enabled
#       |       |-- *.load
#       |       `-- *.conf
#       |-- conf-enabled
#       |       `-- *.conf
#       `-- sites-enabled
#               `-- *.conf
#
~~
# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf

コメントでconf ファイルの配置概要が示されており、目的のvirtual host 関連ディレクティブが「sites-enabled/*.conf」という形で追加で読み込まれているのではあるまいか、ということが推察できます。

「/etc/apache2/sites-enabled」配下を確認します。

$ ls -l /etc/apache2/sites-enabled/
total 0
lrwxrwxrwx 1 root root 35 Jul 27 21:16 000-default.conf -> ../sites-available/000-default.conf

ファイルの実体は存在せず、シンボリックリンクとして「/sites-available/000-default.conf」がリンクされているのが判ります。

この時点でやっと前述の設定ファイル「/etc/apache2/sites-available/000-default.conf」にたどり着きます。


public_html 配下にファイルを置いて動作確認

public_html 配下に適当なファイルをつくって動作確認をおこないます。

echo "hogehoge" > index.html

ファイルにアクセス(表示)可能かどうかが判別できればいいので、ファイル内容は適当で(htmlタグなどでなくても)OKです。

linuxで新規ファイルを作るにはいくつか方法があります。よくあるのは $ touch new.txt といった touch コマンドを使う方法です。touch はファイルのタイムスタンプを更新する目的で使用されますが、存在しないファイルにアクセスするとファイルを作成(タイムスタンプを更新)します。もし同一のファイル名があったとしても内容は書き換わらず、タイムスタンプが更新されるだけなので安全な手法といえます。

echo コマンドをリダイレクトすることでもファイルを作成することができます。この場合echo した内容がファイルの内容になるため、既存のファイル名を指定した場合はそのファイルの中身が書き換わるので注意が必要です。

その他にはエディターであるvi を使う手もあります。vi で存在しないファイルを指定して編集し、保存することでファイルが作成されます。

localhost(http://localhost)にアクセスしてファイル内容が表示されれば成功です。


memo-webdev-local2-001


サイトが見れない場合の対処

memo-webdev-local2-002

何らかの問題でサイトが見れない場合は以下の項目を確認してみてください。

  • public_html に置いたファイルのパーミッション
    第三者から読み取り可能になっているかどうか。0644(-rw-r--r--)のような状態であればOK。
  • public_html 自体のパーミッション 第三者が読み取り実行可能になっているかどうか。0755(drwxr-xr-x)のような状態であればOK。読み取り可能だけじゃなく実行可能もつけないと×。
  • /etc/apache2/sites-available/000-default.conf の記述ミス
    DocumentRoot や Directory のパスがあっているかどうか。タイプミスなど。
  • Directory ディレクティブの設定ミス
    書き方が旧い場合(過去の設定をそのままコピーしたときなど)
<Directory /home/hoge/public_html>
~~
    Order allow,deny
    Allow from all
</Directory>
上のような記述があれば
<Directory /home/hoge/public_html>
~~
    Require all granted
</Directory>
のように書き直す。
  • SELinux による動作制限
    SELinux をインストールして運用している場合はそちらの設定も確認(もしくはSELinuxの制限に沿った設定に変更する)してください。

それでも改善しない場合は根本的に調査するしかありません。apache のエラーログを確認しましょう。

エラーログは(ubuntuのapache2の場合は)以下の場所にあります。

$ cat -n /var/log/apache2/error.log

error.log を確認してどこでなにが問題を起こしているかを突き止めてください。




まだ続くかも。(`・ω・´)
続きです。すぐ忘れる自分のためのweb開発環境準備手順その3 - wsl -

Post If you feel like it, I would be happy if you could post it.