9.Webサーバとプロキシサーバ

Web(Apache, Nginx)、プロキシ(Squid)に関して

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.confserver-info, server-statusの設定
httpd-vhosts.confバーチャルホストの指定
httpd-default.confデフォルトのサーバ全般設定
httpd-ssl.confSSL/TLSの設定

Red Hat系でインストールした場合

ファイル/ディレクトリ説明
/etc/httpd/conf/httpd.confメインの設定ファイル
/etc/httpd/conf.d/補助の設定ファイルを保存するディレクトリ
ssl.confSSL/TLS設定ファイル
php.confPHPモジュールの設定
perl.confPerlモジュールの設定

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
設定値出力
ProdServer: Apache
MajorServer: Apache/2
MinorServer: Apache/2.4
MinOSServer: Apache/2.4 (CentOS)
FullServer: 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 オプション

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

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

9.1.4. 外部設定のファイル

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

AccsessFileName

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

AccsessFileName .htaccess

AllowOverride パラメータ

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

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

AllowOverride パラメータ
パラメータ説明
AuthConfig認証に関する設定を有効にする
indexesDirectoryIndexなどの設定の有効にする
FileInfoファイルタイプの制御設定を有効にする
LimitOrder, Allow, Denyによる設定を有効にする
OptionsOpitionsの設定を有効にする
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 サブコマンド
サブコマンド説明
startApacheを起動
stopApacheの終了
restartApacheの再起動
gracefulApacheを安全に再起動
reload設定ファイルの再読み込み
configtest設定ファイルの構文チェック

9.1.6. モジュールの使用

Apacheではモジュールによって様々な機能を提供できる。 機能追加などもApacheのインストールのし直しの必要はなく、モジュールのロード/アンロードで行える。

Apacheの主要なモジュールは以下の通り。

モジュール名説明
mod_accsess_compatホストベースのアクセス制御
mod_authz_hostホストベースのアクセス制御(Requireディレクティブ)
mod_authz_userユーザベースのアクセス制御(Requireディレクティブ)
mod_auth_basic基本認証
mod_auth_digestDigest認証
mod_authn_file.htaccsessファイルによるユーザ認証
mod_aliasエイリアス機能の利用
mod_cgiCGIスクリプトの実行
mod_dirディレクティブのインデックス実行
mod_infoサーバの設定情報表示
mod_log_configリクエストログの生成
mod_mime拡張子に応じたファイルタイプの指定
mod_negotiationクライアントごとの自動判別機能の提供
mod_perlPerlの利用
mod_phpPHP5の利用
mod_proxyプロキシ機能
mod_soモジュールを読み込むDSO機能の提供
mod_sslSSL/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パスワードファイルを新規に作成
-mMD5で暗号化する
-sSHA1で暗号化する
-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.16192.168.0.0/24, 172.16.0.0/24のみ
host ドメイン名ドメイン名のホストのみ
group adminadminグループのみ
all grantedすべてのホストを許可
all deniedすべてのホストを拒否
localローカルホストのみ

また以下のディレクティブを使用して複数条件の指定も可能

ディレクティブ説明
RequireAllすべての条件にマッチで真
RequireAny1つ以上の条件にマッチで真
RequireNoneいずれにマッチしなければ真

またApache2.4以降ではorder, Allow,Denyディレクティブを使用する方法ではなく、Requireディレクティブを使用する形が推奨されている。

設定Order Deny,AllowOrder 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,AllowOrder 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 [email protected]
    DocumentRoot /var/www/virtual/hogehoge
</VirtualHost>
<VirtualHost *:80>
    ServiceName www.test.jp
    ServerAdmin [email protected]
    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 [email protected]
    DocumentRoot /var/www/virtual/hogehoge
</VirtualHost>
<VirtualHost 192.168.1.11:80>
    ServiceName www.test.jp
    ServerAdmin [email protected]
    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の主要なディレクティブは以下の通り。

ディレクティブ説明
SSLEngineSSL/TLSの有効無効
SSLProtocolall,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_portSquidが利用するポート番号
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_useranonymousでFTPアクセスするときのパスワード
ftp_passive_on/offFTPのパッシブモードの有効/無効
reference_ageキャッシュの保存期間
request_header_max_sizeHTTPリクエストヘッダの最大サイズ
requiest_body_max_sizeHTTPリクエストボディの最大サイズ
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クライアントのポート番号
arpMACアドレス
protoプロトコル
methodHTTPのメソッド
url_regexURLにマッチする正規表現
urlpath_regexURLからプロトコルとホスト名を除いたパス名にマッチする正規表現
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.confSSLの設定ファイル
/etc/nginx/conf.d/virtual.confバーチャルホストの設定ファイル

設定はディレクティブに値を指定する形で記述する。

ディレクティブ 値;

ディレクティブ {
    ディレクティブ 値;
}

またnginx.confの基本構造は以下の通り。

events {
    # 接続処理に関する記述
}

http {
    # httpサーバの設定
    server {
        # HTTPサーバ毎の設定
        location パス {
            # URI毎の設定
        }
    }
}

mail {
    # メールプロキシ関連の設定
}

またnginxの主要なディレクティブは以下の通り。

ディレクティブコンテキスト説明
includeすべて値の設定ファイルを読み込む
http {}mainhttpサーバとしての設定
server {}mainバーチャルホストの設定
usermainworkerプロセスの実行ユーザ
worker_processesmainworkerのプロセス数(CPUコア数)
worker_connectionsevents1つのworkerプロセスが同時処理できる最大接続数
log_formathttpアクセスログの書式形式
access_loghttp,server,locationアクセスログのパスとログレベル
error_logmain,http,server,locationエラーログのパスとログレベル
listenserverリクエストを受け付けるポート番号
server_nameserverバーチャルホストのサーバ名
proxy_passlocationプロキシ先の指定
fastcgi_passlocationFastCGFIサーバの指定
fastcgi_paramhttp,server,locationFastCGIサーバに渡すパラメータの設定
location プレフィックス URIパス条件{}server, location条件マッチのリクエストURIの設定
keepalive_requestshttp,server,location一度の接続で受け付けできるリクエスト数の上限
keepalive_timeouthttp,server,locationキープアライブのタイムアウト時間
server_tokenshttp,server,locationバージョン番号の表示/非表示
roothttp,server,locationドキュメントルート
indexhttp,server,locationインデックスファイル
autoindexhttp,server,locationインデックスリストの表示/非表示
error_pagehttp,server,locationエラーコードとエラーページのURI
proxy_set_headerhttp,server,locationプロキシ先に送られるリクエストヘッダフィールドの再定義
proxy_pass_headerhttp,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
最終更新 2025.01.19: Added ss command (683d062)