コンテンツにスキップ

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
  • ソースからコンパイルして使用する方法
    • configure
    • make
    • make install

またconfigureの役立つオプションは以下の通り。

オプション 説明
--prefix=ディレクトリ インストール先のディレクトリ
--sysconfdir=ディレクトリ 設定ファイルのディレクトリ
--enable-module=モジュール 標準モジュールの組み込む
--disable-module=モジュール 標準モジュールを組み込まない
--enable-shared=モジュール 標準モジュールをDSOで組み込む
--diable-shared=モジュール 標準モジュールをDSOで組み込まない

使用例は以下の通り。

# インストールディレクトリの指定とsshモジュールの有効化
./configure --prefix=/usr/local/apache --enable-module=ssl

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の設定項目はディレクティブと呼ばれ以下のように設定する。

ディレクティブ名 設定値

また適用範囲は以下のように指定できる。

<Files ファイル名> ... </Files>

<Directory ディレクトリ名> ... </Directory>

<Location URL> ... </Location>

大まかな設定項目は以下の通り。

# 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」で良い。

ServerTokens Prod|Major|Minor|MinOS|Full
設定値 出力
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が利用するトップディレクトの指定。 設定ファイルなどを格納する。

ServerRoot パス

ServerName サーバのホスト名

ホスト名の指定。

ServerName サーバのホスト名

ServerAdmin メールアドレス

サーバ管理者のメールアドレスを指定。

ServerAdmin メールアドレス

ServerSignature on|off

エラーメッセージなどのフッタ表示の有効無効化を指定。

ServerSignature on|off

TraceEnable on|off

TRACEメソッドの使用の有無の指定。

TracerEnable on|off

プロセス系の設定項目

Apacheでは複数のプロセスが処理を分担する。 仕組みとしては以下の通り。

  1. 親プロセスがクライアントからの接続を待ち受ける
  2. 個々のクライアントの対応は子プロセスが処理する

なお、待機している子プロセス数よりもクライアント数が多くなれば、子プロセス数を新たに不足分起動するのでレスポンスが低下する。 また待機している子プロセス数が多いほどメモリの使用量は多くなる。

# 起動時の子プロセス数の数
StartServers 子プロセス数
# 待機子プロセスの最小数
MinSpareServers 子プロセス数
# 待機子プロセスの最大数
MaxSpareServers 子プロセス数
# 生成される子プロセスの上限の指定
ServerLimits 子プロセス数
# 最大同時接続数の指定
MaxClients 同時接続数
MaxRequireWorkers 同時接続数
# クライアント接続がタイムアウトになる時間を秒数指定
Timeout タイムアウト時間
# KeepAlive(TCP接続のキープ)の設定(パフォーマンス向上が見込める)
KeepAlive on | off
KeepAliveRequires 上限リクエスト数
KeepAliveTimeout タイムアウト時間

Listen [IPアドレス:]ポート番号

待ち受けポート番号の指定。

Listen :80

User/group

httpd子プロセスの実行ユーザと実行グループの指定。

User ユーザ名
Group グループ名

DocumentRoot ディレクトリ

ドキュメントルートとなるディレクトリの指定

DocumentRoot ディレクトリ

UsrDir 公開ディレクトリ|disabled

一般ユーザの公開ディレクトリの指定。

UsrDir 公開ディレクトリ|disabled

DirectoryIndex インデックスファイル

ディレクトリのインデックスとして返すファイル名の指定。

DirectoryIndex インデックスファイル

ErrorLog ログファイルのパス

エラーログを記録するログファイルの指定。

ErrorLog ログファイルのパス

Loglevel ログレベル

エラーログのログレベルの指定。

Loglevel ログレベル

LogFormat "フォーマット" 書式名

ログを記録する項目と書式名を指定する。

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 ログファイル名 ログ書式名

出力するログの指定を行う。

CustomLog logs/access_log combined

HostnameLookups on|off

DNSの逆引きを行いアクセス元IPアドレスからホスト名を取得する ログにホスト名やホスト名でアクセス制御を行う場合に使用する。

HostnameLookups on|off

Alias ディレクトリ パス

ドキュメントルートツリー以外の参照できるようにする際に使用する。

# /var/www/html/imagesではなく/home/www/imagesを参照できるようにする
Alias /images /home/www/images

Redirect ディレクトリ|ファイル 転送先URL

指定したURLにリダイレクトを行う

Redirect ディレクトリ|ファイル 転送先URL

ScriptAlias ディレクトリ CGI格納ディレクトリ

CGIスクリプト用ディレクトリを指定する。

ScriptAlias /cgi-bin/ /var/www/cgi-bin/

ErrorDocument エラーコード ファイル|ディレクトリ

エラーが発生した際の処理をエラーコードに続けて指定する。

ErrorDocument 404 /error.html

Options オプション

ディレクトリごとにオプションを指定できる。

オプション 説明
All MultiViews 以外のすべての機能を有効にする(デフォルト)
None すべての機能を無効にする
ExecCGI CGI スクリプトの実行を許可する
FollowSymLinks シンボリックリンクをたどることを許可する
Includes SSI を有効にする
Indexes ファイル一覧の表示を行う
MultiViews コンテントネゴシエーションを有効にする

9.1.4. 外部設定のファイル

httpd.conf以外に設定ファイルを記述し、httpd.confを上書きして設定することもできる。 外部設定のファイル名はhttpd.confのAccsessFileNameディレクティブで指定できる。

AccsessFileName

外部設定のファイルを指定できる。

AccsessFileName .htaccess

AllowOverride パラメータ

AllowOverrideディレクティブは外部ファイルの利用許可ができる。 複数パラメータの指定。

Directoryセクションで指定できる

AllowOverride パラメータ
パラメータ 説明
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の操作/情報参照できるコマンド。

apachectl サブコマンド
サブコマンド 説明
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ディレクティブで読み込む。

LoadModule perl_module modules/mod_perl.so

またApacheのインストール後にモジュールを読み込むには以下のように実施する方法もある。

  1. aspxコマンドによるコンパイル
  2. httpd.confLoadModulesディレクティブを追加

aspxコマンド

Apacheのインストール後にモジュールをDSOとしてインストールするコマンド。

sudo aspx -i -a -c mod_foofoo.c

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コマンドを用いる。

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コマンドを用いる。

htdigest [オプション] ファイル名 領域 ユーザ名
オプション 説明
-c パスワードファイルを新規に作成

ホストベースのアクセス認証

order, Allow,DenyディレクティブによりIPアドレス/ホスト名によるアクセス制御ができる。 なおこの制御の使用は非推奨になっているため、Requireディレクティブを代用が推奨されている。

# Allow Denyの評価順の指定
Order allow | Deny, allow | Den

# 接続許可するホストの指定
Allow from IPアドレス | ホスト名/ドメイン名
# 接続を許可しないホストの指定
Deny from IPアドレス | ホスト名/ドメイン名

なお現在推奨であるRequireディレクティブを使用する場合の書式は以下の通り。

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

またアクセス制御をLimitLimitExceptディレクティブ内に設定して、特定の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サーバの運用は以下の手順でサイト証明書を認証局から入手する。

  1. 公開鍵/暗号鍵の作成
  2. 作成した公開鍵を認証局(CA)へ送信する
  3. CAにて証明書を発行して受け取る
  4. 証明書をWebサーバにインストールする

自己署名証明書(オレオレ認証)

自己署名証明書はSSL接続をテストする為や、限られた利用者のみが使用するWEBサーバなどを構築する際に設定する。

作成手順は以下の通り。

  1. 秘密鍵(key.pem)と自己署名証明書(cacert.pem)の作成
  2. サーバ秘密鍵の作成(鍵名.key)
  3. 証明書発行要求書(CSR)の作成
  4. 証明書発行要求ファイルに対しCAが認証を行いサーバ証明書(.crt)の作成

自己署名証明書の作成例は以下の通り。 なおCA.sh -newcaCA.pl -newca(OpenSSL1.1.0以降)も使用可能。

# 秘密鍵と自己署名証明書の作成

./CA -newca
# パスフレーズを入力
# パスフレーズの再入力

# 国コードの入力
# 都道府県名
# 市町村名
# 会社名
# 部署名
# ホストのFDQN
# 管理者メールアドレス

# パスフレーズの入力
# サーバ秘密鍵の作成
openssl genrsa -out server.key 2048
# 証明書発行要求書(CSR)の作成
openssl req -new -key server.key -out server.csr
# サーバ証明書(.crt)の作成
openssl ca -out server.crt -infiles /etc/pki/ca/server.csr

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_logerror_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のアクセス制限はaclhttp_accessで行う。 aclの場合は以下の書式。

acl acl名 ACLタイプ 文字列orファイル名

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ファイルの構文をチェックできる。

nginx -t

# 設定の再読み込み
nginx -s reload