Ubuntu Apache(PHP+MySQL) 設定

Apache

・インストールされているかどうか
dpkg -l | grep apache

・インストール
sudo apt update
sudo apt install apache2

・起動
sudo systemctl start apache2

(インストール後、起動+自動起動するようになっている)

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

・名前確認
sudo ufw app list

・バージョン確認
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)

***

PHP

PHP セキュリティメモ

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

・apache(PHP)のエラー確認
sudo vim /var/log/apache2/error.log

・PDO(MySQL)の有効化

php.ini
sudo vim /etc/php/7.4/apache2/php.ini
以下のコメントアウトを外す。
extension=pdo_mysql

・モジュール(PHP)のテスト

必要なモジュールをインストールすると、 設定ファイルは
/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(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

apache設定

ドキュメントルート変更
sudo vim /etc/apache2/apache2.conf
した場合、パーミッションを変更する。
chown -R ubuntu:ubuntu /var/www/html/

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で利用。