9. Webサーバとプロキシサーバ
9.1. Webサーバの設定
9.1.1. Apache
Apache(Apache HTTP Server)はOSSのWEBサーバの1つ。 Apacheの2.0系ではMPMへの対応やIPv6への対応が行われた。 また、2.2系ではキャッシュの改善や負荷分散機能の追加などが行われた。
MPM(Multi Processing Module):MPMにはprefork, worker, perchild, eventがある。
- preforkは1.3系と同じマルチプロセスモデルでリクエストごとにプロセスを割り当てる
- workerはスレッド対応モデルでクライアントのリクエストを子プロセスで処理し、処理増大で子プロセスを増やす
- perchildはバーチャルホスト向けのスレッド対応で子プロセスを固定し負荷に応じてスレッドを増減する
- eventはworkerと似た機能であるがkeepaliveの処理が異なる
なおCentOS7系の場合はApacheのMPMはpreforkとなる。
Apacheのインストール方法
Apacheのインストール方法は2通り。
- ディストリビューションごとのパッケージを利用する方法
- RedHat系:
yum install httpd
- Debian系:
apt-get install apache2
- RedHat系:
- ソースからコンパイルして使用する方法
configure
make
make install
またconfigure
の役立つオプションは以下の通り。
オプション | 説明 |
---|---|
--prefix=ディレクトリ | インストール先のディレクトリ |
--sysconfdir=ディレクトリ | 設定ファイルのディレクトリ |
--enable-module=モジュール | 標準モジュールの組み込む |
--disable-module=モジュール | 標準モジュールを組み込まない |
--enable-shared=モジュール | 標準モジュールをDSOで組み込む |
--diable-shared=モジュール | 標準モジュールをDSOで組み込まない |
使用例は以下の通り。
9.1.2. Apacheの基本設定
Apacheのメイン設定ファイルはhttpd.confとなる。 Apacheの主な設定ファイルのディレクトリは以下の通り。
ソースからインストールした場合
ファイル/ディレクトリ | 説明 |
---|---|
/usr/local/apache2/conf/httpd.conf | メインの設定ファイル |
/usr/local/apache2/conf/extra | 補助の設定ファイルを保存するディレクトリ |
httpd-language.conf | 言語/文字コードの設定 |
httpd-userdir.conf | 一般ユーザのホームディレクトリ設定 |
httpd-info.conf | server-info, server-statusの設定 |
httpd-vhosts.conf | バーチャルホストの指定 |
httpd-default.conf | デフォルトのサーバ全般設定 |
httpd-ssl.conf | SSL/TLSの設定 |
Red Hat系でインストールした場合
ファイル/ディレクトリ | 説明 |
---|---|
/etc/httpd/conf/httpd.conf | メインの設定ファイル |
/etc/httpd/conf.d/ | 補助の設定ファイルを保存するディレクトリ |
ssl.conf | SSL/TLS設定ファイル |
php.conf | PHPモジュールの設定 |
perl.conf | Perlモジュールの設定 |
Debian系でインストールした場合
ファイル/ディレクトリ | 説明 |
---|---|
/etc/apache2/apache2.conf | メインの設定ファイル |
/etc/apache2/ | 補助の設定ファイルを保存するディレクトリ |
/etc/apache2/ports.conf | ポートの設定 |
/etc/apache2/sites-enabled/ | サイト定義ファイルのリンク |
/etc/apache2/sites-avaiable/ | サイト定義ファイル |
httpd.confの設定項目
httpd.confの設定項目はディレクティブと呼ばれ以下のように設定する。
また適用範囲は以下のように指定できる。
大まかな設定項目は以下の通り。
# Apacheの設定ファイル/ログファイルの起点となるトップディレクトリ
ServerRoot "/usr/local/apache2"
# 待ち受けポート
Listen 80
# ロードモジュール
LoadModule authn_file_module modules/mod_authn_file.so
# 実行ユーザと実行グループ
User apache
Group apache
# バージョン情報の出力設定
ServerSignature On
ServerTokens Full
# 管理者のメールアドレス
ServerAdmin root@localhost
# Webサーバーとして公開するホスト名を指定
# ホスト名は FQDN(Fully Qualified Domain Name) で記述
ServerName www.example.com:80
# /ディレクトリ以下の設定
<Directory />
# AllowOverride は 上位のディレクトリ(この場合は/(root)ディレクトリ)でした設定を下位のディレクトリで設定を上書きできるかどうか(オーバーライドできるかどうか)を設定。none → 下位での変更が無効。all → 下位での変更が有効。
AllowOverride none
# アクセス制限に関する設定。デフォルトではすべて拒否する設定になっている。
Require all denied
</Directory>
# ドキュメントルート(DocumentRoot)は、Webサーバーのトップディレクトリ
DocumentRoot "/var/www/html"
# ドキュメントルート以下の設定
<Directory "/var/www/html">
# シンボリックリンクをたどれるようにする
Options Indexes FollowSymLinks
AllowOverride None
# /var/wwwディレクト配下へのアクセスは全員が可能(Webサイトを閲覧することができる)
Require all granted
</Directory>
# dirモジュールが有効時にディレクトインデックスの指定
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
# ディレクトリに「.htaccess」ファイルや「.htpasswd」ファイルがあった場合、ユーザーに表示するかどうかを設定
<Files ".ht*">
Require all denied
</Files>
# エラーログの場所を指定
ErrorLog "logs/error_log"
# ログレベルの指定
LogLevel warn
# emerg:緊急、システムが利用できないレベル
# alert:今すぐに対処が必要なレベル
# crit:致命的な状態
# error:エラーレベル
# warn:(デフォルト) 警告レベル
# notice:注意すべき重要な情報
# info:一般的な情報
# debug:デバッグレベル
<IfModule log_config_module>
# ログのフォーマットを指定。ログフォーマットのニックネームを「combined」と名付ける。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
# ログのフォーマットを指定。ログフォーマットのニックネームを「common」と名付ける。
LogFormat "%h %l %u %t \"%r\" %>s %b" common
# カスタムログの場所とフォーマットを指定。フォーマットは、ニックネーム「combined」の形式にする。
CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
# 【例】http://sample.ne.jpの場合、「/var/www/cgi-bin/」ディレクトリを「http://sample.ne.jp/cgi-bin」に割り当てます。つまりどのディレクトリを「cgi-bin」に割り当てるのか設定する。エイリアス定義
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
# cgi-binディレクトリの動作について設定
<Directory "/var/www/cgi-bin">
AllowOverride None
# オプションは何もなし
Options None
# 全員がアクセス可能
Require all granted
</Directory>
# エラーとエラーページの設定
ErrorDocument 500 "The Server mode a boo boo."
ErrorDocument 404 /missing.html
# 他の設定ファイルの読み込み
IncludeOptional conf.d/*.con
9.1.3. httpd.confの主要な設定
ServerTokens Prod|Major|Minor|MinOS|Full
HTTPヘッダ内に出力されるバージョン情報(バナー情報)を指定する。 クライアントに返信する応答ヘッダにどのような情報を含めるかということを決めれる。
セキュリティの関係で通常は「Prod」で良い。
設定値 | 出力 |
---|---|
Prod | Server: Apache |
Major | Server: Apache/2 |
Minor | Server: Apache/2.4 |
MinOS | Server: Apache/2.4 (CentOS) |
Full | Server: Apache/2.4 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16 |
ServerRoot パス
httpdが利用するトップディレクトの指定。 設定ファイルなどを格納する。
ServerName サーバのホスト名
ホスト名の指定。
ServerAdmin メールアドレス
サーバ管理者のメールアドレスを指定。
ServerSignature on|off
エラーメッセージなどのフッタ表示の有効無効化を指定。
TraceEnable on|off
TRACEメソッドの使用の有無の指定。
プロセス系の設定項目
Apacheでは複数のプロセスが処理を分担する。 仕組みとしては以下の通り。
- 親プロセスがクライアントからの接続を待ち受ける
- 個々のクライアントの対応は子プロセスが処理する
なお、待機している子プロセス数よりもクライアント数が多くなれば、子プロセス数を新たに不足分起動するのでレスポンスが低下する。 また待機している子プロセス数が多いほどメモリの使用量は多くなる。
# 起動時の子プロセス数の数
StartServers 子プロセス数
# 待機子プロセスの最小数
MinSpareServers 子プロセス数
# 待機子プロセスの最大数
MaxSpareServers 子プロセス数
# 生成される子プロセスの上限の指定
ServerLimits 子プロセス数
# 最大同時接続数の指定
MaxClients 同時接続数
MaxRequireWorkers 同時接続数
# クライアント接続がタイムアウトになる時間を秒数指定
Timeout タイムアウト時間
# KeepAlive(TCP接続のキープ)の設定(パフォーマンス向上が見込める)
KeepAlive on | off
KeepAliveRequires 上限リクエスト数
KeepAliveTimeout タイムアウト時間
Listen [IPアドレス:]ポート番号
待ち受けポート番号の指定。
User/group
httpd子プロセスの実行ユーザと実行グループの指定。
DocumentRoot ディレクトリ
ドキュメントルートとなるディレクトリの指定
UsrDir 公開ディレクトリ|disabled
一般ユーザの公開ディレクトリの指定。
DirectoryIndex インデックスファイル
ディレクトリのインデックスとして返すファイル名の指定。
ErrorLog ログファイルのパス
エラーログを記録するログファイルの指定。
Loglevel ログレベル
エラーログのログレベルの指定。
LogFormat "フォーマット" 書式名
ログを記録する項目と書式名を指定する。
フォーマット文字列は以下の通り。
フォーマット文字列 | 説明 |
---|---|
%a | リモート IP アドレス |
%A | ローカル IP アドレス |
%B | レスポンスのバイト数。HTTP ヘッダは除く。 |
%b | レスポンスのバイト数。HTTP ヘッダは除く。CLF 書式。 すなわち、1 バイトも送られなかったときは 0 ではなく、 '-' になる |
%f | ファイル名 |
%h | リモートホスト |
%H | リクエストプロトコル |
%l | リモートログ名。 これは mod_ident がサーバに存在して、 IdentityCheck ディレクティブが On に設定されていない限り、 - になる。 |
%m | リクエストメソッド |
%r | リクエストの最初の行 |
%t | リクエストを受付けた時刻。 CLF の時刻の書式 (標準の英語の書式) |
%T | リクエストを扱うのにかかった時間、秒単位 |
%u | リモートユーザ (認証によるもの。ステータス (%s) が 401 のときは意味がないものである可能性がある) |
%U | リクエストされた URL パス。クエリ文字列は含まない |
%>s | サーバがクライアントに返すステータスコード |
%{Referer}i | リクエスト内のrefererヘッダの内容 |
%{User-agent}i | リクエスト内のUserAgentヘッダの内容 |
Custom ログファイル名 ログ書式名
出力するログの指定を行う。
HostnameLookups on|off
DNSの逆引きを行いアクセス元IPアドレスからホスト名を取得する ログにホスト名やホスト名でアクセス制御を行う場合に使用する。
Alias ディレクトリ パス
ドキュメントルートツリー以外の参照できるようにする際に使用する。
Redirect ディレクトリ|ファイル 転送先URL
指定したURLにリダイレクトを行う
ScriptAlias ディレクトリ CGI格納ディレクトリ
CGIスクリプト用ディレクトリを指定する。
ErrorDocument エラーコード ファイル|ディレクトリ
エラーが発生した際の処理をエラーコードに続けて指定する。
Options オプション
ディレクトリごとにオプションを指定できる。
オプション | 説明 |
---|---|
All | MultiViews 以外のすべての機能を有効にする(デフォルト) |
None | すべての機能を無効にする |
ExecCGI | CGI スクリプトの実行を許可する |
FollowSymLinks | シンボリックリンクをたどることを許可する |
Includes | SSI を有効にする |
Indexes | ファイル一覧の表示を行う |
MultiViews | コンテントネゴシエーションを有効にする |
9.1.4. 外部設定のファイル
httpd.conf以外に設定ファイルを記述し、httpd.confを上書きして設定することもできる。
外部設定のファイル名はhttpd.confのAccsessFileName
ディレクティブで指定できる。
AccsessFileName
外部設定のファイルを指定できる。
AllowOverride パラメータ
AllowOverride
ディレクティブは外部ファイルの利用許可ができる。
複数パラメータの指定。
Directoryセクションで指定できる。
パラメータ | 説明 |
---|---|
AuthConfig | 認証に関する設定を有効にする |
indexes | DirectoryIndexなどの設定の有効にする |
FileInfo | ファイルタイプの制御設定を有効にする |
Limit | Order, Allow, Denyによる設定を有効にする |
Options | Opitionsの設定を有効にする |
None | .htaccessでの変更を無効にする |
All | .htaccsessで変更可能なすべての設定を有効にする |
9.1.5. Apacheの制御
Apacheの起動方法は以下の通り。
# SysVinitを採用したシステムでのApacheの起動
/etc/init.d/httpd start
# Systemdを採用したシステムでのApacheの起動
systemctl start httpd.conf
# Ubuntuの場合
systemctl start apache2.service
# Apachectlによる起動
apachectl start
apachectlコマンド
apacheの操作/情報参照できるコマンド。
サブコマンド | 説明 |
---|---|
start | Apacheを起動 |
stop | Apacheの終了 |
restart | Apacheの再起動 |
graceful | Apacheを安全に再起動 |
reload | 設定ファイルの再読み込み |
configtest | 設定ファイルの構文チェック |
9.1.6. モジュールの使用
Apacheではモジュールによって様々な機能を提供できる。 機能追加などもApacheのインストールのし直しの必要はなく、モジュールのロード/アンロードで行える。
Apacheの主要なモジュールは以下の通り。
モジュール名 | 説明 |
---|---|
mod_accsess_compat | ホストベースのアクセス制御 |
mod_authz_host | ホストベースのアクセス制御(Requireディレクティブ) |
mod_authz_user | ユーザベースのアクセス制御(Requireディレクティブ) |
mod_auth_basic | 基本認証 |
mod_auth_digest | Digest認証 |
mod_authn_file | .htaccsessファイルによるユーザ認証 |
mod_alias | エイリアス機能の利用 |
mod_cgi | CGIスクリプトの実行 |
mod_dir | ディレクティブのインデックス実行 |
mod_info | サーバの設定情報表示 |
mod_log_config | リクエストログの生成 |
mod_mime | 拡張子に応じたファイルタイプの指定 |
mod_negotiation | クライアントごとの自動判別機能の提供 |
mod_perl | Perlの利用 |
mod_php | PHP5の利用 |
mod_proxy | プロキシ機能 |
mod_so | モジュールを読み込むDSO機能の提供 |
mod_ssl | SSL/TLS機能の利用 |
mod_status | サーバステータスの表示 |
mod_unixd | 実行ユーザ/グループのChroot機能 |
mod_userdir | ユーザディレクリの公開 |
mod_version | バージョン依存の設定 |
モジュールは/usr/lib/httpd/modules
などにインストールされ、LoadModule
ディレクティブで読み込む。
またApacheのインストール後にモジュールを読み込むには以下のように実施する方法もある。
aspx
コマンドによるコンパイルhttpd.conf
にLoadModules
ディレクティブを追加
aspxコマンド
Apacheのインストール後にモジュールをDSOとしてインストールするコマンド。
httpdコマンド
組み込み済みのモジュールの確認や一覧の表示を行えるコマンド。
# 組み込み済みモジュールの確認
httpd -l
# Debian/Ubuntuの場合
apache2 -l
# 組み込みモジュール/DSOモジュールの一覧表示と設定ファイルの文法チェック
httpd -M
またDebian/Ubuntuの場合はa2enmod
コマンドにより対話的にモジュールを有効化できる。
9.1.7. クライアントのアクセス認証
指定したディレクトリにアクセスするときにユーザ/パスワードがないときにアクセス制限をかけることができる。 認証にはBasic認証とDigest認証を使うことができる。
Basic認証
Basic認証の実装手順はhttpd.conf
にユーザ認証設定を実装することで可能。
なおBasic認証では平文で認証情報が流れる。
設定例は以下の通り。
<Directory "/var/www/html/private">
# 認証タイプの指定
AuthType Basic
# 認証ダイアログのメッセージ
AuthName "Please Enter Your ID and PassWord!"
# パスワードファイル名
AuthUserFile /etc/httpd/conf/passwd
# AuthGroupFile
# アクセス可能なユーザ(user ユーザ または valid-user)
Require valid-user
</Directory>
valid-user
にすると、パスワードファイルにエントリあるすべてのユーザがアクセスが許可される。
認証に用いるユーザ名とパスワードの設定はhtpasswd
コマンドを用いる。
オプション | 説明 |
---|---|
-c | パスワードファイルを新規に作成 |
-m | MD5で暗号化する |
-s | SHA1で暗号化する |
-D | ユーザを削除する |
注意点としてドキュメントルート以下のブラウザからアクセスできる場所にパスワードファイルを設置する際にアクセスできないようにする必要がある。
Digest認証
Digest認証ではチャレンジ/レスポンス形式で認証を行うので認証情報が盗聴されてもパスワードがすぐに漏洩しない特徴がある。 設定は以下の通り。
Digest認証ではAuthName
では認証領域を指定する。
<Directory "/var/www/html/private">
# 認証タイプの指定
AuthType Digest
# ユーザ認証の領域を指定
AuthName "private"
# パスワードファイル名
AuthUserFile /etc/httpd/conf/passwd
# AuthGroupFile
# アクセス可能なユーザ(user ユーザ または valid-user)
Require valid-user
</Directory>
認証に用いるユーザ名とパスワードの設定はhtdigest
コマンドを用いる。
オプション | 説明 |
---|---|
-c | パスワードファイルを新規に作成 |
ホストベースのアクセス認証
order, Allow,Deny
ディレクティブによりIPアドレス/ホスト名によるアクセス制御ができる。
なおこの制御の使用は非推奨になっているため、Require
ディレクティブを代用が推奨されている。
# Allow Denyの評価順の指定
Order allow | Deny, allow | Den
# 接続許可するホストの指定
Allow from IPアドレス | ホスト名/ドメイン名
# 接続を許可しないホストの指定
Deny from IPアドレス | ホスト名/ドメイン名
なお現在推奨であるRequire
ディレクティブを使用する場合の書式は以下の通り。
指定するエンティティ例は以下の通り。
エンティティ | 説明 |
---|---|
ip IPアドレス | IPアドレス |
ip 192.168 172.16 | 192.168.0.0/24, 172.16.0.0/24のみ |
host ドメイン名 | ドメイン名のホストのみ |
group admin | adminグループのみ |
all granted | すべてのホストを許可 |
all denied | すべてのホストを拒否 |
local | ローカルホストのみ |
また以下のディレクティブを使用して複数条件の指定も可能
ディレクティブ | 説明 |
---|---|
RequireAll | すべての条件にマッチで真 |
RequireAny | 1つ以上の条件にマッチで真 |
RequireNone | いずれにマッチしなければ真 |
またApache2.4以降ではorder, Allow,Deny
ディレクティブを使用する方法ではなく、Require
ディレクティブを使用する形が推奨されている。
設定 | Order Deny,Allow | Order Allow,Deny |
---|---|---|
デフォルト | 全て許可 | すべて拒否 |
一部のアクセスのみ許可 | Order Deny,Allow Deny from all Allow from IPアドレス/ホスト名 |
Order Allow,Deny Allow from all Deny from IPアドレス/ホスト名 |
一部のアクセスのみ拒否 | Order Deny,Allow Deny from IPアドレス/ホスト名 |
Order Allow.Deny Allow from IPアドレス/ホスト名 |
すべて許可 | Order Deny,Allow | Order Allow,Deny Allow from all |
すべて拒否 | Order Deny,Allow Deny from all |
Order Allow,Deny |
またアクセス制御をLimit
、LimitExcept
ディレクティブ内に設定して、特定のHTTPメソッドに適用することもできる。
<Limit DELETE POST PUT>
Require vaild-user
</limit>
<LimitExcept DELETE POST PUT>
Require All Deny
</limitExcept>
9.1.8. バーチャルホスト
バーチャルホストは1台のサーバで複数のWebサイトを管理する機能のこと。 バーチャルホストには以下の2種類がある。
- 名前ベースバーチャルホスト ... 1台のホストに1つのIPと複数のドメイン名を指定する方法
- IPベースバーチャルホスト ... 1台のホストに複数のIPアドレスと複数のドメインを指定する方法
名前ベースのバーチャルホスト
設定例は以下の通り。 下記設定の上でDNSを適切に設定するとWebサイトを複数1つのホストで運用できる。
NameVirtualHost *:80
<VirtualHost *:80>
ServiceName web.hogehoge.jp
ServerAdmin webmaster@web.hogehoge.jp
DocumentRoot /var/www/virtual/hogehoge
</VirtualHost>
<VirtualHost *:80>
ServiceName www.test.jp
ServerAdmin webmaster@www.test.jp
DocumentRoot /var/www/virtual/test
</VirtualHost>
IPベースのバーチャルホスト
設定例は以下の通り。
Listen 192.168.1.10:80
Listen 192.168.1.11:80
<VirtualHost 192.168.1.10:80>
ServiceName web.hogehoge.jp
ServerAdmin webmaster@web.hogehoge.jp
DocumentRoot /var/www/virtual/hogehoge
</VirtualHost>
<VirtualHost 192.168.1.11:80>
ServiceName www.test.jp
ServerAdmin webmaster@www.test.jp
DocumentRoot /var/www/virtual/test
</VirtualHost>
9.1.9. SSL/TLS
SSL/TLSは公開鍵暗号を使用したTCP/IPのアプリケーション層のセキュリティ技術。 SSL/TLSによりWebブラウザとサーバ間の通信を暗号化できセキュアな通信を実現できる。
認証には認証局により発行されたサーバ証明書によりサイトの正当性を保証し、セキュリティを担保する。
Apacheではmod_ssl
によりサイトをSSL化することができる。
SSLを利用してWebサーバの運用は以下の手順でサイト証明書を認証局から入手する。
- 公開鍵/暗号鍵の作成
- 作成した公開鍵を認証局(CA)へ送信する
- CAにて証明書を発行して受け取る
- 証明書をWebサーバにインストールする
自己署名証明書(オレオレ認証)
自己署名証明書はSSL接続をテストする為や、限られた利用者のみが使用するWEBサーバなどを構築する際に設定する。
作成手順は以下の通り。
- 秘密鍵(key.pem)と自己署名証明書(cacert.pem)の作成
- サーバ秘密鍵の作成(鍵名.key)
- 証明書発行要求書(CSR)の作成
- 証明書発行要求ファイルに対しCAが認証を行いサーバ証明書(.crt)の作成
自己署名証明書の作成例は以下の通り。
なおCA.sh -newca
やCA.pl -newca
(OpenSSL1.1.0以降)も使用可能。
# 秘密鍵と自己署名証明書の作成
./CA -newca
# パスフレーズを入力
# パスフレーズの再入力
# 国コードの入力
# 都道府県名
# 市町村名
# 会社名
# 部署名
# ホストのFDQN
# 管理者メールアドレス
# パスフレーズの入力
SSL関連ファイル
ファイル | 説明 |
---|---|
.key | サーバ秘密鍵 |
.csr | 証明書発行要求書 |
.crt | サーバ証明書 |
またSSL設定(httpd.conf)例は以下の通り。 なおSSLには443ポートを使用するので注意する。
SSLEngine On
SSLProtocol all -SSLv2 -SSLv3
SSLCertificateFile [.crtのパス]
SSLCertificateKeyFile [.keyのパス]
SSL/TLSの主要ディレクティブ
ssl.conf
の主要なディレクティブは以下の通り。
ディレクティブ | 説明 |
---|---|
SSLEngine | SSL/TLSの有効無効 |
SSLProtocol | all,SSLv2, SSLv3, TLSv1, TLSv1.1 , TLSv1.2がある。- で無効化、+ で有効化 |
SSLCipherSuite | 使用する暗号化アルゴリズムのリスト |
SSLCertificateFile | サーバ証明書ファイル |
SSLCertificateKeyFile | サーバ秘密鍵のファイル |
SSLCerificateChainFile | 中間CA証明書ファイル |
SSLCACertificateFile | クライアント証明書発行のCA証明書ファイル |
SSLCAcertificatePath | クライアント証明書発行のCA証明書ディレクトリ |
SSLVerifyClient | クライアント認証レベル(none, optional, opitional_no_ca, require) |
SNI
SNI(Server Name Indication)は1つのWebサーバで複数のドメインのSSL/TLS証明書を利用できる仕組み。 名前ベースのVirtualHostであってもSSLに対応できるようにしたSSL/TLSの拡張仕様ともいえる。
この機能により、複数独自ドメインを利用するサーバにて複数のSSL/TLS証明書を使用することが可能になった。 特徴は以下の通り。
- IPベースのVirtualHostであれば、クライアントに依存せずにSSLを使える
- 名前ベースのVirtualHostの場合、クライアントがSNIに対応していればSSLを使用できる
SNIでは、SSLセッションのハンドシェイク(SSL接続)のタイミングでクライアント側から接続したいホスト名を提示する。これによりサーバは、クライアントが提示したホスト名を確認して適切な証明書を返すことができる。
なお、SNIはサーバだけでなくクライアント側(ブラウザ)も対応している必要がある。
9.2. Webサーバの監視とメンテナンス
9.2.1. サーバ情報の取得
mod_statusモジュール
mod_status
モジュールの使用でサーバの稼働状況をブラウザに表示ができる。
mod_statusを使用する場合のhttpd.conf
は以下の通り。
LoadModule status_module modules/module_status.so
<Location /server-status>
SetHandler server-status
</Location>
mod_infoモジュール
mod_info
モジュールの使用でサーバ設定の情報をブラウザに表示ができる。
mod_infoを使用する場合のhttpd.conf
は以下の通り。
LoadModule status_module modules/mod_info.so
<Location /server-info>
SetHandler server-info
</Location>
9.2.2. ログファイル
Apacheの規定のログファイルにはaccsess_logとerror_logがある。
/var/log/httpd
などに保存される。
- アクセスログ ... 要求のあったリクエストの情報などが保存される
- エラーログ ... エラー情報やサーバの挙動が記録される(ログレベルは
LogLevel
ディレクティブで設定可能)
9.3. プロキシサーバの設定
プロキシサーバはクライアントPCの代理としてサーバとの通信を仲介するサーバのこと。 メリットは以下の通り。
- 特定のWEBサイトへのアクセスを制限できる
- クライアントからのアクセスを制御できる
- 一度アクセスしたサイトをキャッシュしてアクセスの高速化を図れる
9.3.1. Squid
SquidはLinuxで最も使用されているプロキシサーバの1つ。
Squidはsquid.conf
で設定を行う。
squid.confの主要設定項目
設定項目 | 説明 |
---|---|
http_port | Squidが利用するポート番号 |
visible_hostname | ホスト名 |
hierarchy_stoplist | キャッシュを利用しない文字列 |
maximum_object_size | キャッシュ可能な最大ファイル数 |
minumum_object_size | キャッシュ可能な最小ファイル数(0は無制限) |
maximum_object_size_in_memory | メモリ上の最大ファイルサイズ |
ipchache_size | キャッシュするIPアドレス数 |
cache_dir | キャッシュを格納するディレクトリと容量など |
cache_mem | 総メモリの最大サイズ |
cache_accsess_log | クライアントのアクセスログ |
cache_log | キャッシュのログ |
ftp_user | anonymousでFTPアクセスするときのパスワード |
ftp_passive_on/off | FTPのパッシブモードの有効/無効 |
reference_age | キャッシュの保存期間 |
request_header_max_size | HTTPリクエストヘッダの最大サイズ |
requiest_body_max_size | HTTPリクエストボディの最大サイズ |
reply_body_max_size | レスポンスの最大ボディサイズ(0は無制限) |
acl | アクセス制御リスト |
http_accsess | アクセス制御リストの制御 |
auth_param | ユーザ認証方式などの設定 |
squid.confの設定例は以下の通り。
# ネットワークオプション
http_port 8080
visible_hostname www.example.com
# cgi-binという文字列があればキャッシュを利用せず直接アクセス
hierarchy_stoplist cgi-bin ?
# 禁止するURLを正規表現で指定
acl QUERY urlpath_regex cgi-bin \?
# 上の設定にACLを適用
no_cachedeny QUERY
# キャッシュサイズの指定
chache_mem 20MB
# キャッシュ可能な最大ファイルサイズの指定
maximum_object_size 4096KB
# 最小オブジェクトの制限
minumum_object_size 0KB
# メモリ上の最大キャッシュサイズ
maximum_object_size_in_memory 8KB
# キャッシュする最大IPアドレス数
ipchache_size 1024
# キャッシュディレクトリとサイズなどの指定
# キャッシュディレクトリ サイズ(MB) ディレクトリ数 サブディレクトリ数
cache_dir ufs /var/spool/squid 100 16 256
# クライアントのアクセスログ
cache_accsess_log /var/log/squid/accsess.log
# キャッシュのログ
cache_log /var/log/squid/cache.log
# ストレージマネージャの管理ログ
cache_log /var/log/squid/store.log
# 匿名FTPのパスワード
ftp_user passpass
# パッシブモードの有効
ftp_passive on
# HTTPリクエストヘッダの最大サイズ
request_header_max_size 10KB
# HTTPリクエストボディの最大サイズ
requiest_body_max_size 1MB
# レスポンスの最大ボディサイズ
reply_body_max_size 0
アクセス制御の設定
Squidのアクセス制限はacl
とhttp_access
で行う。
aclの場合は以下の書式。
ACLタイプは以下の通り。
タイプ | 説明 |
---|---|
src | クライアントのIPアドレス |
dst | 代理アクセス先サーバのIPアドレス |
srcdomain | クライアントのドメイン名 |
dstdomain | 代理アクセス先サーバのドメイン名 |
port | 代理アクセス先のサーバポート番号 |
myport | クライアントのポート番号 |
arp | MACアドレス |
proto | プロトコル |
method | HTTPのメソッド |
url_regex | URLにマッチする正規表現 |
urlpath_regex | URLからプロトコルとホスト名を除いたパス名にマッチする正規表現 |
time | 有効な時刻の指定(例: 10:00-12:00) |
proxy_auth | ユーザ認証の対象 |
設定例は以下の通り。
acl all src 0.0.0.0/0.0.0.0
acl localhost src 127.0.0.1/255.255.255.255
acl clients src 192.168.0.0/255.255.255.0
acl denydomain dstdomain x.com twitter.com
acl blacklist url_regex "/etc/squid/url_blacklist.txt"
acl SSL_ports port 443 563
acl Safe_ports port 80 21 443 563 70 210 1025-65535
acl CONNECT method CONNECT
# Safe_ports以外のアクセスを禁止
http_access deny !Safe_ports
# SSL_ports以外のポートのCONNECTメソッドを禁止
http_access deny CONNECT !SSL_ports
http_access deny denydomain
http_access deny blacklist
http_access allow localhost
http_access allow clients
http_access deny all
9.4. Nginxとリバースプロキシ
Nginxは高速で動作する負荷に強いWebサーバ。 特徴としてリバースプロキシやメールプロキシの機能も持つ。
9.4.1. Nginxの設定
Nginxは1つのマスタープロセスと複数のワーカープロセスから構成される。
- ワーカープロセス ... クライアントからのHTTPリクエストを受け付け処理する
- マスタープロセス ... ワーカープロセスを管理するプロセス
Nginxの設定ファイルは/etc/nginx/nginx.conf
となる。
CentOSにおけるNginxの主要設定ファイルは以下の通り。
ファイル | 説明 |
---|---|
/etc/nginx/nginx.conf | メイン設定ファィル |
/etc/nginx/conf.d/default.conf | デフォルトサーバの設定ファイル |
/etc/nginx/conf.d/ssl.conf | SSLの設定ファイル |
/etc/nginx/conf.d/virtual.conf | バーチャルホストの設定ファイル |
設定はディレクティブに値を指定する形で記述する。
またnginx.conf
の基本構造は以下の通り。
events {
# 接続処理に関する記述
}
http {
# httpサーバの設定
server {
# HTTPサーバ毎の設定
location パス {
# URI毎の設定
}
}
}
mail {
# メールプロキシ関連の設定
}
またnginxの主要なディレクティブは以下の通り。
ディレクティブ | コンテキスト | 説明 |
---|---|---|
include | すべて | 値の設定ファイルを読み込む |
http {} | main | httpサーバとしての設定 |
server {} | main | バーチャルホストの設定 |
user | main | workerプロセスの実行ユーザ |
worker_processes | main | workerのプロセス数(CPUコア数) |
worker_connections | events | 1つのworkerプロセスが同時処理できる最大接続数 |
log_format | http | アクセスログの書式形式 |
access_log | http,server,location | アクセスログのパスとログレベル |
error_log | main,http,server,location | エラーログのパスとログレベル |
listen | server | リクエストを受け付けるポート番号 |
server_name | server | バーチャルホストのサーバ名 |
proxy_pass | location | プロキシ先の指定 |
fastcgi_pass | location | FastCGFIサーバの指定 |
fastcgi_param | http,server,location | FastCGIサーバに渡すパラメータの設定 |
location プレフィックス URIパス条件{} | server, location | 条件マッチのリクエストURIの設定 |
keepalive_requests | http,server,location | 一度の接続で受け付けできるリクエスト数の上限 |
keepalive_timeout | http,server,location | キープアライブのタイムアウト時間 |
server_tokens | http,server,location | バージョン番号の表示/非表示 |
root | http,server,location | ドキュメントルート |
index | http,server,location | インデックスファイル |
autoindex | http,server,location | インデックスリストの表示/非表示 |
error_page | http,server,location | エラーコードとエラーページのURI |
proxy_set_header | http,server,location | プロキシ先に送られるリクエストヘッダフィールドの再定義 |
proxy_pass_header | http,server,location | プロキシ先からクライアントへの通過を許可するヘッダフィールドの指定 |
9.4.2. リバースプロキシの設定
Nginxはリバースプロキシとしてもよく利用される。 リバースプロキシの設置によりWEBサーバの負荷が軽減できる。
設定例は以下の通り。
server {
location /{
proxy_page http://localhost:8080
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
nginxコマンド
nginx -t
コマンドによりnginx.confファイルの構文をチェックできる。