Apacheのインストールと初期設定のメモです。

環境

OS は Ubuntu 18.04 LTS です。

インストール

パッケージマネージャーから Apacheをインストール。

sudo apt install apache2 -y

初期設定

セキュリティ対策として以下のを設定します。

  1. CGIを無効化
  2. HTTPレスポンスに極力サーバー情報を表示しないよう設定
  3. Apacheのエラーページに表示されるサーバー情報を非表示に設定
  4. タイムアウト時間の変更
  5. 不要なディレクトリへのアクセス拒否設定
  6. ブラウザにディレクトリを表示しないよう設定
# CGIを無効化
sudo a2disonc

# バックアップを取ってから security.conf を編集
cd /etc/apache2/conf-available
sudo cp security.conf security.conf.bak  # バックアップ
sudo nano security.conf

/etc/apache2/conf-available/security.conf

# HTTPレスポンスのサーバー情報を "Apache" のみにする
ServerTokens Prod
# エラーページにサーバー情報を表示しない    
ServerSignature Off
# apache2.conf を編集
sudo cp apache2.conf apache2.conf.bak  # バックアップ
sudo nano apache2.conf

/etc/apache2/apache2.conf

# タイムアウト時間を変更
Timeout 60

# デフォルトのOptionsは何もつけない (Noneに設定)
<Directory />
  Options None
</Directory>

# 不要なディレクトリへのアクセスを拒否
<Directory /usr/share>
  AllowOverride None
  Require all denied
</Directory>

# ブラウザにディレクトリを表示しないよう設定
<Directory /var/www/>
  Options FollowSymLinks  # "Indexes" を消す
  AllowOverride None
  Require all granted
</Directory>

Webサイトの設定

初期設定が終わったら、Webサイトの設定を行います。
Webサイトのルートディレクトリは “/var/www/mysite” とすることにします。

Apacheでは、Webサイトの設定は VirtualHost という設定項目で行います。Apacheは複数のWebサイト (URLドメインが異なるWebサイト) をホストすることができ、その場合はWebサイトの数だけVirtualHost設定を書くことになります。

VirtualHost設定はファイルに分割して書くことができるため、通常はわかりやすいようにWebサイト1つに対して1つのファイルを作成します。
そしてUbuntu では、VirtualHostを書いた設定ファイルは sites-available フォルダに置くのが慣例となっています。

このフォルダには初めから “000-default.conf” というファイルがあるのですが、このファイルの説明をする前に、VirtualHostについてもう少し詳しく説明します。

VirtualHostには “ServerName” という設定項目があり、ここにWebサイトのドメイン名 (URLのホスト名) を記述します。
ApacheがWebサイトへのアクセスを受け、URLのドメイン名と一致する ServerName が設定された VirtualHost 設定を見つけると、そこに書かれた “DocumentRoot” 項目に書かれたフォルダからWebサイトのファイルを読み込み、ブラウザへレスポンスを返します。

複数のWebサイトをホストする時は、それぞれのVirtualHostの “ServerName” 項目に、ホストするWebサイトのドメイン名を記述します。

ここで、もしIPアドレスを直書きした場合など、ドメイン名と一致する ServerName が見つからなかった場合、Apacheは一番初めに読み込んだVirtualHost設定を使用します。

設定ファイルは名前順に読み込まれますので、この “000-default.conf” というファイルが一番初めに読み込まれる VirtualHost となります。

意図したドメイン名以外のURLでアクセスされた場合は、アクセスを拒否するのがセキュリティ的にも好ましいため、この “000-default.conf” には全てのアクセスを拒否する設定を記述します。

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

# "http" アクセスのための VirtualHost 設定
<VirtualHost *:80>
    ServerName default  # "ServerName" はドメイン名として存在しない名前を設定

    # ルートディレクトリ "/" へのアクセスを全て拒否
    <Location /> Require all denied </Location>  

    # ログの設定: ほとんどの場合デフォルトのままでOK
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

# "https" アクセスのための VirtualHost 設定
<VirtualHost _default_:443>
    ServerName default
    <Location /> Require all denied </Location>

    # SSL証明書ファイルは Apache インストール時に作られる自己証明書を設定
    SSLCertificateKeyFile /etc/ssl/private/selfsigned.key
    SSLCertificateFile /etc/ssl/certs/selfsigned.crt

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

続いてWebサイト用の VirtualHost 設定を書きます。
ファイルを分けておいた方がわかりやすいので、”mysite.conf” というファイルに記述することにします。

sudo touch /etc/apache2/sites-available/mysite.conf
sudo nano /etc/apache2/sites-available/mysite.conf

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

# Webサイトの設定
<VirtualHost *:80>
    ServerName example.com  # Webサイトのドメイン名
    DocumentRoot /var/www/mysite  # Webサイトのファイルを配置したディレクトリ

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<VirtualHost _default_:443>
    ServerName example.com  # Webサイトのドメイン名
    DocumentRoot /var/www/mysite  # Webサイトのファイルを配置したディレクトリ

    # SSL証明書の作成に使った秘密鍵
    SSLCertificateKeyFile /etc/ssl/private/mysite.key
    # 認証局から受け取ったSSL証明書
    SSLCertificateFile /etc/ssl/certs/mysite.crt

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

SSL証明書の秘密鍵と証明書は、認証局から証明書を購入すると通知されますので、それをファイルに保存して設定します。

最後に、必要なモジュールと上記で作成した mysite.conf ファイルを有効にします。
モジュールは、SSLモジュールの他にRewriteもよく使いますので、初めに有効にしておくと良い思います。
Ubuntuでは、モジュールや .conf ファイル の有効化は、a2enXXX というコマンドで行うことができます。

sudo a2enmod ssl  # SSLモジュールを有効化
sudo a2enmod rewrite  # Rewriteモジュールを有効化
sudo a2ensite mysite  # mysite.conf を有効化。コマンドでは .conf は不要です。
sudo systemctl restart apache2  # Apacheを再起動して設定を反映

以上でApacheのインストールと初期設定は完了です。