InfraAcademy

InfraAcademy Blog

Apache2のドキュメントルートとは?変更方法と403エラーの対処法を解説

| #Linux #Linux初心者 #apache

こんにちは、フルスタックエンジニアのryuです。

今回の記事では、Apache2のドキュメントルートについて解説します。LinuxでWebサーバーを構築すると、/var/www/htmlDocumentRootという言葉を目にしますよね。

ドキュメントルートは、ブラウザへ公開するファイルの基準となるディレクトリです。仕組みを理解せずに変更すると、403 Forbiddenやデフォルトページが消えない問題につながります。

結論から言うと、Ubuntu・Debian系のApache2では、デフォルトのドキュメントルートは/var/www/htmlです。サイト設定のDocumentRootを変更し、必要に応じて<Directory>によるアクセス許可を追加します。

この記事では、ドキュメントルートの意味、安全な変更手順、設定の確認方法、よくあるエラーまで初心者向けに解説します。

ドキュメントルートとは?

まず初めにドキュメントルートについて解説します。

ドキュメントルートとは、Webサーバーで公開する文書や画像、動画などを公開するためのディレクトリです。

Webサーバーでは、ブログページや動画など、さまざまなコンテンツを公開しています。これらのコンテンツは、ドキュメントルート配下のディレクトリ構造で管理されます。

ドキュメントルートについての画像

ドキュメントルートは、直訳すると文書の根っこという意味です。Webサーバーが公開するファイルの、出発点となるディレクトリだとイメージしてください。

URLとファイルの対応関係

ドキュメントルートが/var/www/htmlの場合、URLのパスはこのディレクトリを起点に対応します。

たとえば、http://192.0.2.10/sample.htmlへアクセスすると、Apache2は次のファイルを探します。

/var/www/html/sample.html

URLが/images/logo.pngなら、対応するファイルは/var/www/html/images/logo.pngです。

URLのパス Apache2が探すファイル
/ /var/www/html/内のインデックスファイル
/sample.html /var/www/html/sample.html
/images/logo.png /var/www/html/images/logo.png

この対応関係を理解すると、ファイルを置いたのに表示されない原因を切り分けやすくなります。

公開してよいファイルだけを置く

ドキュメントルート配下には、.env、秘密鍵、データベースのバックアップなどを置かないでください。

Apache2にはAliasなど、DocumentRootの外をURLへ割り当てる機能もあります。DocumentRootだけでなく、Apache2全体の設定を確認することが大切です。

Apache2のデフォルトは/var/www/html

続いて、Ubuntu・Debian系におけるApache2のデフォルト設定を確認します。

Apache2をインストールしてデフォルトサイトを有効にすると、/var/www/htmlが公開ディレクトリとして使われます。

デフォルト設定を確認する

設定内容は、次のコマンドで確認できます。

grep -n "DocumentRoot" /etc/apache2/sites-available/000-default.conf

一般的な初期設定では、次の行が表示されます。

DocumentRoot /var/www/html

では、この設定はどこに書かれているのでしょうか。/etc/apache2/sites-enabled/000-default.conf ファイルの以下の部分がドキュメントルートの設定です。

このように、Apache2インストール時からドキュメントルートは、/var/www/html と設定されているのです。

画像は以前のUbuntu環境ですが、DocumentRootの考え方は現在も同じです。編集するときは、通常sites-enabledのリンク先であるsites-available側を開きます。

sites-availableとsites-enabledの違い

Ubuntu・Debian系のApache2では、サイト設定を有効・無効に分けて管理します。

ディレクトリ 役割
/etc/apache2/sites-available/ サイト設定ファイルの実体を置く
/etc/apache2/sites-enabled/ 有効な設定へのシンボリックリンクを置く

設定を有効にするときはa2ensite、無効にするときはa2dissiteを使います。

sudo a2ensite example.conf
sudo a2dissite example.conf

Ubuntu系とRed Hat系の違い

同じApache HTTP Serverでも、Linuxの系統によって名前と設定場所が異なります。

項目 Ubuntu・Debian系 RHEL・Rocky Linux系
パッケージ・サービス名 apache2 httpd
主な設定場所 /etc/apache2/ /etc/httpd/
サイト設定 sites-available/ conf.d/
一般的なDocumentRoot /var/www/html /var/www/html

Web上の手順を使うときは、自分のLinuxと同じ系統か確認してください。この記事ではUbuntu・Debian系を前提に進めます。

Apache2のドキュメントルートを変更する手順

ここからは、デフォルトの/var/www/html/var/www/exampleへ変更します。

流れは、新しいディレクトリの作成、テストページの配置、設定編集、構文確認、設定反映です。

設定ファイルをバックアップする

最初に、編集対象をバックアップします。

sudo cp /etc/apache2/sites-available/000-default.conf \
  /etc/apache2/sites-available/000-default.conf.bak

本番環境では、変更前の設定と変更内容を記録しておくことが大切です。

新しい公開ディレクトリを作成する

新しいドキュメントルートを作ります。

sudo mkdir -p /var/www/example

動作確認用のindex.htmlを配置します。

echo '<h1>Apache2 DocumentRoot Test</h1>' \
  | sudo tee /var/www/example/index.html

静的ファイルを公開するだけなら、ディレクトリ全体の所有者をwww-dataへ変更する必要はありません。

次のように、Apache2が読み取れる権限を設定します。

sudo chown -R root:root /var/www/example
sudo find /var/www/example -type d -exec chmod 755 {} \;
sudo find /var/www/example -type f -exec chmod 644 {} \;

CMSなどがファイルを書き込む場合は、必要なディレクトリだけへ個別に書き込み権限を付けましょう。

DocumentRootを変更する

設定ファイルを開きます。

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

DocumentRootを次のように変更します。

<VirtualHost *:80>
    DocumentRoot /var/www/example
</VirtualHost>

DocumentRootには、公開ディレクトリの絶対パスを指定します。

viの操作に慣れていない方は、次の記事も参考にしてください。

【関連記事】viコマンドの使い方を初心者向けに解説

/var/wwwの外へ置く場合はDirectoryも設定する

/var/www/exampleのように/var/www配下を使う場合、Ubuntuの標準設定でアクセスが許可されています。

一方、/srv/exampleなどへ変更する場合は、<Directory>でファイルシステム上のアクセスを許可します。

<Directory /srv/example>
    Options FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

DocumentRootはURLの基準となる場所を指定し、<Directory>はそのディレクトリへ適用する許可や設定を決めます。

設定 意味
Options FollowSymLinks シンボリックリンクをたどる
AllowOverride None .htaccessによる上書きを禁止
Require all granted すべてのアクセス元を許可

必要がない場合はOptions Indexesを付けない方が安全です。インデックスファイルがないときに、ファイル一覧が表示される可能性があります。

構文を確認して設定を反映する

設定変更後は、いきなり再起動してはいけません。

構文ミスがあるとApache2が起動できなくなるため、先にチェックします。

sudo apache2ctl configtest

問題がなければ、次のように表示されます。

Syntax OK

VirtualHostの対応も確認できます。

sudo apache2ctl -S

構文に問題がなければ、設定を再読み込みします。

sudo systemctl reload apache2

必要に応じてsudo systemctl restart apache2で再起動します。

エンジニア歴10年以上の私も、Apache2の設定変更では、configtestを通してから反映するという順番を崩しません。

ドキュメントルートが変更されたか確認する

設定を反映したら、サーバー自身からアクセスします。

curl -i http://localhost/

本文にApache2 DocumentRoot Testが表示されれば成功です。

外部のパソコンから確認する場合は、ブラウザでサーバーのIPアドレスやドメインへアクセスしてください。

古いページが表示される場合

以前のページが表示される場合は、apache2ctl -Sで有効なVirtualHostを確認します。

sudo grep -RIn "^[[:space:]]*DocumentRoot" /etc/apache2/

複数のVirtualHostがあると、ホスト名によって別の設定が選ばれます。curlでもアクセスし、ブラウザのキャッシュと設定の問題を切り分けましょう。

403 Forbiddenが表示される原因

ドキュメントルート変更後の代表的なトラブルが、403 Forbiddenです。

403はApache2へ到達しているものの、対象ファイルへのアクセスを許可できなかった状態です。

主な原因 確認方法
<Directory>の許可がない Require all grantedを確認
親ディレクトリをたどれない namei -lで権限を確認
ファイルを読み取れない ls -lで権限を確認
インデックスファイルがない index.htmlなどを作成
別のVirtualHostへ接続している apache2ctl -Sで確認
設定が未反映 configtest後にreload

エラーログを確認する

原因がわからないときは、エラーログを確認します。

sudo tail -n 50 /var/log/apache2/error.log

リアルタイムで確認する場合は、次のコマンドを使います。

sudo tail -f /var/log/apache2/error.log

ブラウザからアクセスし、同じ時刻に記録されたエラーを読みましょう。

【関連記事】Linuxのログを監視する方法を解説

親ディレクトリの権限も確認する

Apache2がファイルを読むには、ファイル自体の読み取り権限だけでなく、親ディレクトリをたどる権限も必要です。

次のコマンドを使うと、パス上の権限をまとめて確認できます。

namei -l /var/www/example/index.html

chmod -R 777で無理やり解決するのは避けてください。誰でも書き換えられる危険な状態になります。

index.htmlがない場合

URLでファイル名を省略すると、Apache2はDirectoryIndexで指定されたファイルを探します。

index.htmlなどがなく、ディレクトリ一覧も許可されていない場合は403になることがあります。

grep -RIn "DirectoryIndex" /etc/apache2/

トップページとして使うファイルを作るか、必要に応じてDirectoryIndexを変更してください。

VirtualHostごとにDocumentRootを分ける

1台のApache2で複数サイトを公開する場合は、サイトごとにVirtualHostを作成します。

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example

    <Directory /var/www/example>
        Require all granted
    </Directory>
</VirtualHost>

設定をsites-availableへ保存し、a2ensiteで有効化してから構文確認とreloadを行います。

【関連記事】Apache2をLinuxへインストールする方法

Apache2のドキュメントルートまとめ

Apache2のドキュメントルートは、URLから公開するファイルの基準となるディレクトリです。

Ubuntu・Debian系では、デフォルトサイトのDocumentRoot/var/www/htmlに設定されています。

変更するときは、新しいディレクトリを作り、VirtualHostのDocumentRootを書き換えます。/var/wwwの外を使う場合は、<Directory>によるアクセス許可も確認してください。

設定後は、次の順番で確認します。

sudo apache2ctl configtest
sudo apache2ctl -S
sudo systemctl reload apache2
curl -i http://localhost/

403が出たら、権限を闇雲に広げるのではなく、<Directory>、親ディレクトリ、VirtualHost、エラーログを順番に確認しましょう。

InfraAcademyでは、LinuxコマンドやApache2を使ったサーバー構築を、実際に操作しながら学習できます。

サーバー構築講座を見る

参考資料

Next Action

記事で読んだ内容を、講座で実装してみましょう

InfraAcademyでは、ブラウザ上でLinuxやネットワークの実践環境を使いながら学習できます。無料で始められる講座から、学習の流れを試せます。

この記事を書いた人

ryu

InfraAcademy運営 / エンジニア

エンジニア歴10年。Linux、ネットワーク、クラウドを中心に、実務で役立つインフラ技術を初心者にもわかりやすく解説しています。

X: @ryu63614894

Related

関連記事

ブログ一覧へ

Roadmap

まずはこの4講座から

ログインすれば無料で始められる講座です。気になったテーマから手を動かして学べます。

講座一覧を見る