Apache設定

Ubuntuのインストール記事からApacheの箇所だけ抜出し。

インストール

sudo apt-get update
sudo apt-get install apache2

・起動
sudo /etc/init.d/apache2 start

・ファイアーウォール(ufw)の設定が必要なら、
sudo ufw app list (名前確認)
sudo ufw allow apache

設定関連

バージョン
apache2 -v

パス確認
apachectl -S

ロードモジュール
apachectl -M

設定ファイル

設定ファイルは、
/etc/apache2
の中にあるファイル。

***-enabled内の.confや.loadファイルを読み込む。
***-enabledは***-availableへのシンボリックリンクが基本。

/etc/apache2/apache2.conf
基本設定ファイル

/etc/apache2/mods-enabled/
/etc/apache2/mods-available/
モジュール(a2enmod, a2dismod)

/etc/apache2/sites-enabled/
/etc/apache2/sites-available/
サイト設定(a2ensite, a2dissite)

/etc/apache2/ports.conf
ポート番号

/etc/apache2/conf-enabled/
/etc/apache2/conf-available/
設定(a2enconf, a2disconf)

***

モジュールのテストをしてみる。

必要なモジュールをインストールすると、 設定ファイルは
/etc/apache2/mods-available
に書き込まれる。

書き込まれるのは、
モジュール名.load、モジュール名.conf
の2つ。

使えるモジュール一覧
apt search libapache2-mod
(apt-cache search libapache2-mod)

モジュールのインストール
sudo apt install libapache2-mod-xxx

インストール後、使いたいモジュールは、
sudo /usr/sbin/a2enmod xxx
/etc/apache2/mods-enabled に、mods-available への
シンボリックリンクを作ってくれる。

試しにPHPでテストしてみる。
sudo apt install libapache2-mod-php

/etc/apache2/mods-available
の中に
php7.2.conf
php7.2.load
が書き込まれた。
/etc/apache2/mods-enabled
の中にもavailableへの
php7.2.conf
php7.2.load
2つのリンクが作成された。

無効化
sudo /usr/sbin/a2dismod php7.2

ls /etc/apache2/mods-enabled | grep php
出力なし

有効化
sudo /usr/sbin/a2enmod php7.2

ls /etc/apache2/mods-enabled | grep php
php7.2.conf
php7.2.load

再起動
sudo /etc/init.d/apache2 restart

apache2.confについて

・DefaultRuntimeDir ${APACHE_RUN_DIR}
Base directory for the server run-time files

・PidFile ${APACHE_PID_FILE}
デーモンのプロセス ID をサーバが記録するためのファイル

・Timeout 300
各イベントについて、リクエストを失敗させるまでにサーバが 待つ時間を設定

・KeepAlive On
HTTP の持続的な接続を有効にする

・MaxKeepAliveRequests 100
持続的な接続上で許可されるリクエストの数

・KeepAliveTimeout 5
持続的な接続で次のリクエストが来るまでサーバが待つ時間

・User ${APACHE_RUN_USER}
The userid under which the server will answer requests

・Group ${APACHE_RUN_GROUP}
Group under which the server will answer requests

・HostnameLookups Off
クライアントの IP アドレスの DNS ルックアップを 有効にする

・ErrorLog ${APACHE_LOG_DIR}/error.log
サーバがエラーをログ収集する場所

・LogLevel warn
ErrorLog の冗長性を制御する

・IncludeOptional mods-enabled/*.load
・IncludeOptional mods-enabled/*.conf
Includes other configuration files from within the server configuration files

・Include ports.conf
サーバ設定ファイル中から他の設定ファイルを取り込む

<Directory /> … </Directory>
指定のファイルシステムのディレクトリとサブディレクトリとのみに 適用されるディレクティブを囲む

以下Directoryの中について。

・Options FollowSymLinks

Options xxx
ディレクトリに対して使用可能な機能を設定する

xxxの部分については以下。

None:何もなし。
All:MultiViews以外の機能が有効。Optionsを設定しない場合と同じ。
ExecCGI:cgiの実行を許可。
FollowSymLinks:シンボリックリンクをたどれる。
Includes:SSI の使用を許可。
IncludesNOEXEC:SSIを許可。SSIから外部cgiを呼び出すのは禁止。
Indexes:DirectoryIndexで指定したファイルが存在しない場合、一覧を表示する。
MultiViews:コンテントネゴシエーションを有効。
SymLinksIfOwnerMatch:シンボリックリンクのリンク先がシンボリックリンクと同じオーナーのある場合、みたどれる。

・AllowOverride None

AllowOverRide xxx
.htaccessで使用できるディレクティブを指定。

xxxの部分については以下。

None:.htaccess では何も設定できない。
All:.htaccess で設定可能なものは全て有効。
AuthConfig:認証関連のディレクティブの使用を許可。
FileInfo:ドキュメントタイプやドキュメントのメタデータを制御するディレクティブの使用を許可。
Indexes:ディレクトリインデックス関連のディレクティブの使用を許可。
Limit:アクセス制御関連のディレクティブの使用を許可。
Options:Optionsディレクティブの使用を許可。

・Require xxx

xxxの部分については以下。

Require all granted:全てのアクセスを許可。
Require all denied:全てのアクセスを拒否。
Require [not] env env-var [env-var]:指定した環境変数が定義されていれば(not指定時は環境変数が定義されていなければ)アクセスを許可。
Require method http-method [http-method]:Pメソッドが指定されたものである場合はアクセスを許可。
Require valid-user:有効なユーザーの場合はアクセスを許可。
Require ip xxx.xxxx.xxx.xxx:クライアントのIPアドレスが指定されたものである場合はアクセスを許可。

ここまでDirectoryの中について。

・AccessFileName .htaccess
リクエストを処理するとき、サーバはディレクトリに対して分散設定ファイルが有効になっていれば、そのドキュメントへのパス上にある全てのディレクトリから、ここで指定された名前の一覧の中で最初に見つかったファイルをそれぞれ設定ファイルとして読み込みます。

・<FilesMatch> … </FilesMatch>
正規表現にマッチするファイル名に適用される ディレクティブを囲む。

・LogFormat “%h %l %u %t \”%r\” %>s %O” common
LogFormat “フォーマット” “フォーマット名”

サイトの設定

正しく処理の流れとして、
sites-available/000-default.conf
がテンプレートなので、それをコピーして編集する。

000-default.conf
が有効になっているので以下で無効化。
sudo a2dissite 000-default.conf

コピーしたファイルを有効化。
sudo a2ensite xxx.conf

sites-available/xxx.confについて

<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
これが初期設定となっていた。

ちなみに、バーチャルホストの設定はなくてもOKなので、
apache2.conf
の中の、
IncludeOptional sites-enabled/*.conf
をコメントアウトして、apache2.confの中にDocumentRootを記入してもOK。

VirtualHost使う場合、
DocumentRoot,ServerNameが必須。

ここでは使っていないけど、複数のドメインを運用する場合、
ドメイン分のVirtualHostを作成し、ServerNameで指定する。
<VirtualHost *:80>
DocumentRoot /var/www/xxx
ServerName domain.com
ServerAlias www.domain.com
(ServerAliasでアクセスしてきたらServerNameへリダイレクトという感じ)

</VirtualHost>

アクセスの振り分けとしては、
・IPアドレス
・ポート番号
・ドメイン名(ServerName)
で振り分けることができる。
<VirtualHost addr:[port]></VirtualHost>

サブドメインを指定する場合、
<VirtualHost *:80>
DocumentRoot /var/www/xxx
ServerName sub.domain.com
ServerAlias www.sub.domain.com
</VirtualHost>

セキュリティ関連

/etc/apache2/conf-available/security.conf
には、もともと
ServerTokens OS
ServerSignature On
TraceEnable Off
とあった。

もともとのsecurity.confをバックアップし以下を追加。

バージョン情報を隠す(変更)
ServerTokens Prod
ServerSignature Off

トレースメソッドを無効化(そのままでOK)
TraceEnable Off

PHPのバージョンを隠す
Header unset X-Powered-By

ファイルの一覧を表示しない(/etc/apache2/apache2.confを更新)
<Directory /var/www/html>
Options -Indexes
</Directory>

リクエストを制限する(/etc/apache2/apache2.confを更新)
<Directory xxx>
Require method GET POST
</Directory>

他のサイトにframeで埋め込まれないように
Header append X-Frame-Options DENY

ダミーのVirtualHost(先頭に書く)
<VirtualHost *:80>
ServerName dummy
Redirect 404 /
</VirtualHost>

conf-availableの方がsites-availableより先に読み込まれるが、sites-availableにある<VirtualHost>…</VirtualHost>にはServerNameがなかったので、ダミーを作る場合、sites-availableにServerNameが必要。

HTTP_PROXYの書換え禁止
RequestHeader unset Proxy

ブラウザがXSSをブロック
Header set X-XSS-Protection “1; mode=block”

ブラウザがContent-Typeを無視することを禁止
Header set X-Content-Type-Options nosniff

リクエストボディのサイズ指定 (10MB)
LimitRequestBody 10485760

***

設定ファイルのエラーチェック
apachectl configtest

Invalid command ‘Header’, perhaps misspelled or defined by a module not included in the server configuration
というエラーがでたら。
sudo a2enmod headers
sudo /etc/init.d/apache2 restart

PHP関連

・MPM

apachectl -V
worker, preforkがあり基本preforkとなっている。
mod_phpはpreforkなので、workerにしたい場合、PHPはFastCGIで利用。