こんにちは、フルスタックエンジニアのryuです。
今回の記事では、Apache2のドキュメントルートについて解説します。LinuxでWebサーバーを構築すると、/var/www/htmlやDocumentRootという言葉を目にしますよね。
ドキュメントルートは、ブラウザへ公開するファイルの基準となるディレクトリです。仕組みを理解せずに変更すると、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を使ったサーバー構築を、実際に操作しながら学習できます。