Apacheのインストールと設定Tips

Apacheのインストールと各種設定などについて記載します。
テスト環境には、CentOSを利用しています。

 

・Apacheのインストール
・Apacheの動作モードの設定
・Apache+SSLの設定
・バーチャルドメインの設定
・ログの出力形式を変更する
・ログファイルのローテーション設定
・SSL証明書によるクライアント認証の設定

 

 

Apacheのインストール

ここでは、Apacheのインストールと最低限の設定を記載します。

インストール

インストールは以下のコマンドで行います。

yum install httpd

 

最低限の設定

設定は、/etc/httpd/conf/httpd.confファイルで行います。

このファイルの以下の行を設定してください。

ServerAdmin webmaster@examples.com <---サーバ管理者のメールアドレス
ServerName www.examples.com <---サーバのURL
DocumentRoot "/var/www/html" <---サーバの公開ディレクトリ

これで最低限の設定は終了です。

 

以下のコマンドで起動し動作確認してください。

/etc/init.d/httpd start

 

なお、自動起動の設定は以下のコマンドで行います。

chkconfig httpd on

 

文字化け対策

もし、文字化けが発生するようだったら、以下の行を調整してみてください。

# DefaultLanguage nl
DefaultLanguage ja
#AddDefaultCharset UTF-8
#LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW
LanguagePriority ja en ca cs da de el eo es et fr he hr it ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW

 

 

Apacheの動作モードの設定

Apache2系では、MPMで動作モードを変更出来ます。

CentOS-5で利用出来る主なモードは、prefork、workerです。

動作モードはいずれかの1つを選択し起動する必要があります。

CentOS-5のデフォルト動作モードは、preforkです。

これを変更するには、/etc/sysconfig/httpdの以下を変更します。

HTTPD=/usr/sbin/httpd.worker

なお、それぞれのモードの特徴は以下の通りです。

prefork

Apache-1.3の動作モデルと同様の方法でクライアントからのリクエストを処理します。

preforkは、複数のプロセスを用意しておき、クライアントからのリクエストを処理します。そして、用意したプロセス数を越えるリクエストが要求された場合は、新たなプロセスを生成し処理します。

 

worker

クライアントからのリクエストに対してプロセスではなく、スレッドで対応する動作モデルです。

複数のプロセス内に複数のスレッドを用意し、クライアントからのリクエストを処理しますので、プロセスで動作するpreforkよりも高いパフォーマンスを期待することができますが、1つのスレッドに不具合が発生した場合、そのプロセスにあるスレッド全体に影響が及ぶため、安定性の面ではpreforkに劣ります。

 

preforkに関連するディレクティブの説明は、次のとおりです。

StartServers <---最初に起動する子プロセスの数
MinSpareServers <---待受する子プロセスの最小数
MaxSpareServers <---待受する子プロセスの最大数
MaxClients <---生成する子プロセスの最大数
MaxRequestsPerChild <---1プロセスが扱うリクエスト数の制限数

 

workerに関連するディレクティブの説明は、次のとおりです。

StartServers <---最初に起動するプロセスの数
MinSpareThreads <---待受するスレッドの最小数
MaxSpareThreads <---待受するスレッドの最大数
MaxClients <---生成するスレッドの最大数
ThreadsPerChild <---プロセスに生成されるスレッド数
MaxRequestsPerChild <---1プロセスが扱うリクエスト数の制限数

 


Apache + SSL

ApacheでSSL通信を行うには、mod_sslをインストールします。

yum install mod_ssl

 

SSLに必要な証明書ファイルは以下の通りです。

・サーバの証明書

・サーバの秘密鍵

・CAの証明書

なお、証明書の作成方法は、こちらをご覧ください。

mod_sslの設定

mod_sslの設定は/etc/httpd/conf.d/ssl.confで行います。

SSLCertificateFile /etc/pki/HTTPD/cert.pem <---サーバの証明書
SSLCertificateKeyFile /etc/pki/HTTPD/server.key <---サーバの秘密鍵
SSLCACertificateFile /etc/pki/CA/cacert.pem <---CAの証明書

以上の設定をしてApacheを起動すれば、httpのSSL通信が可能となります。

 

ただし、Apacheを起動するたびに、サーバの秘密鍵のパスフレーズ入力しなくてはなりません。これを回避するには、サーバの秘密鍵からパスフレーズを解除するか、SSLPassPhraseDialogの設定を変更します。後者を推奨します。

SSLPassPhraseDialogの設定

ssl.confの以下を変更します。

#SSLPassPhraseDialog  builtin <---コメントに
SSLPassPhraseDialog exec:/etc/pki/HTTPD/pp-filter <---追加

次に、/etc/pki/HTTPD/pp-filterファイルを以下の内容で作成します。

#!/bin/sh
echo パスフレーズ

次に、pp-filterのパーミッションとオーナーを変更します。

 chmod 700 /etc/pki/HTTPD/pp-filter
 chown root.root /etc/pki/HTTPD/pp-filter 

以上で、Apacheを起動時にpp-filter内に記載したパスフレーズが利用されて、Apache+SSLで起動します。

 

 

バーチャルドメイン

1台のサーバで複数のドメインをサービスする場合は、バーチャルドメインの設定を行います。

バーチャルドメインには、IPバーチャルとネームバーチャルから選択し利用します。

IPバーチャルは、複数のIPアドレスを利用して、IPアドレスごとにドメインをひも付けます。

ネームバーチャルは、1つのIPアドレスを利用して、複数のドメインを利用可能とします。

また、複数のドメインでSSL通信を実施したい場合は、IPバーチャルのみ利用可能です。

なお、バーチャルドメインの設定は、/etc/httpd/conf/httpd.confに追記する形でも設定可能ですが、今回は、見通しを良くするため/etc/httpd/conf.d/virtual.confファイルを作成し行います。

IPバーチャルの設定例

IPバーチャルでの設定例を示します。

設定する内容は以下の通りとします。

unixlife.jp 000.000.000.000

examples.com 111.111.111.111

/etc/httpd/conf.d/virtual.conf

Listen 000.000.000.000:80
Listen 111.111.111.111:80

<VirtualHost 000.000.000.000:80>
    ServerAdmin webmaster@unixlife.jp
    DocumentRoot /var/www/unixlife.jp/htdocs
    ServerName unixlife.jp
    ErrorLog /var/www/unixlife.jp/logs/error.log
    CustomLog /var/www/unixlife.jp/logs/access.log combined
</VirtualHost>

<VirtualHost 111.111.111.111:80>
    ServerAdmin webmaster@examples.com
    DocumentRoot /var/www/examples.com/htdocs
    ServerName examples.com
    ErrorLog /var/www/examples.com/logs/error.log
    CustomLog /var/www/examples.com/logs/access.log combined
</VirtualHost>

 

ネームバーチャルの設定例

設定する内容は以下の通りとします。

unixlife.jp

examples.com

/etc/httpd/conf.d/virtual.conf

NameVirtualHost *:80

<VirtualHost *:80>
    ServerAdmin webmaster@unixlife.jp
    DocumentRoot /var/www/unixlife.jp/htdocs
    ServerName unixlife.jp
    ErrorLog /var/www/unixlife.jp/logs/error.log
    CustomLog /var/www/unixlife.jp/logs/access.log combined
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin webmaster@examples.com
    DocumentRoot /var/www/examples.com/htdocs
    ServerName examples.com
    ErrorLog /var/www/examples.com/logs/error.log
    CustomLog /var/www/examples.com/logs/access.log combined
</VirtualHost>

 

 

ログの出力形式を変更する

Apacheのアクセスログ形式は、一般的にcommon形式かcombined形式が用いられる事が多いと思います。デフォルト設定ではcommon形式です。

combined形式への変更

/etc/httpd/conf/httpd.confを編集します。

以下行のコメント解除します。

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog logs/access_log combined

以下行をコメントにします。

#CustomLog logs/access_log common

以下のコマンドで設定を反映させます。

/etc/init.d/httpd graceful

 

 

ログファイルのローテーション設定

Apacheのアクセスログとエラーログファイルのローテーションについて解説します。

CentOSでは、デフォルトでlogrotateによるログのローテーションが行われるようになっていますが、これは日付変更時にピタリとログが切り替わる訳ではありません。

これを実現するため、httpdパッケージに含まれるrotatelogsを利用してローテーションを行います。

ここでは、1日1回、0時0分を境にローテーションを行う方法を示します。

出力形式はcombind、ファイル名は、ログファイル_log.日付形式とします。

 

/etc/httpd/conf/httpd.confを編集します。

以下行のコメント解除します。

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

 

以下行を編集します。

CustomLog  "|/usr/sbin/rotatelogs /var/log/httpd/access_log.%Y%m%d 86400 540" combined
ErrorLog  "|/usr/sbin/rotatelogs /var/log/httpd/error_log.%Y%m%d 86400 540"

 

以下のコマンドで設定を反映させます。

/etc/init.d/httpd graceful

なお、日付でローテーションするとログファイル数が増え続けますので、tmpwatchを利用すると良いでしょう。

 

 

SSL証明書によるクライアント認証の設定

クライアント証明は、限られた人のみアクセスを限定したいHTTPやSSH通信を行う場合に有用です。

限られた人にアクセスを限定する場合、一般的にはSSLで暗号化通信をしたのち、ユーザIDとパスワードを入力してもらい認証しています。

しかし、パスワード認証は決してセキュアな物ではなく、ユーザIDとパスワードが推測、または洩れてしまえば簡単にアクセスされてしまいます。

そこで、接続を許すユーザにクライアント証明書を発行し、この証明書を持っている人のみアクセス出来るようにし、セキュリティーを向上させます。

ここでは、このクライアント証明書の作成とApacheでの設定例を紹介します。

 

クライアント証明書作成の準備

ここでは、クライアント証明書を作成しますので、/etc/pki/tls/openssl.cnfを編集します。

# This is OK for an SSL server.
#nsCertType	= server <---コメントに
# Some might want this also
#nsCertType = sslCA, emailCA <---コメントに
# This is OK for an SSL server.
#nsCertType	= server <---コメントに

# and for everything including object signing:
nsCertType = client, email, objsign <---コメントを解除

# and for everything including object signing:
# nsCertType = client, email, objsign <---コメントを解除

 

クライアント用の署名要求証明書を作成

サーバの証明書同様、CAに署名してもらうクライアント署名要求書を作成します。

 

作業場所は、/etc/pki/client/以下で作業するとします。

mkdir /etc/pki/client

 

クライアントの秘密鍵を作成します。

penssl genrsa -des3 -out client.key 1024

 

次に、クライアントの署名要求証明書を作成します。

openssl req -new -days 365 -key client.key -out clcsr.pem

 

証明書作成に必要な情報を適時入力してください。

Country Name (2 letter code) [AU]:  <---国名、通常は'JP'
State or Province Name (full name) [Some-State]:  <---都道府県名を指定
Location Name(eg,city) []:  <---組織の本拠地の市区町村名を指定
Orgnaization Name(eg,company)[Internet Widgits Pty Ltd]:  <---組織名(法人名)を指定
Orgnaization Unit Name(eg,section)[]:  <---部署名を指定
Common Name (eg,YOUR name)[]:  <---FQDNを指定
Email Address []:  <---連絡先E-Mailアドレスを指定

ここで作成した署名要求証明書(clcsr.pem)をCAに送り署名してもらいます。

 

CAでの署名要求証明書への署名

クライアントから送られて来た署名要求証明書に、署名します。

penssl ca -config /etc/pki/tls/openssl.cnf -in clcsr.pem -out clcert.pem

 

これで、クライアント証明書のclcert.pemの作成は終了ですが、クライアントでは一般的にPKCS12形式しか利用できませんので、clcert.pemをこの形式に変換します。

openssl pkcs12 -export -in clcert.pem -inkey client.key -certfile cacert.pem -out clcert.p12

 

コマンド発行後、パスフレーズの設定をします。

Enter PEM pass phrase: <---client.keyのパスフレーズ
Enter Export Password: <---ユーザが証明書を取り込む時のパスフレーズを設定
Verifying password - Enter Export Password: <---上記の確認

これで、クライアント証明書の作成は終了です。

 

 

クライアント証明を利用したApacheの設定例

ApacheのSSLディレクトリに、CAの証明書(cacert.pem)、サーバの証明書(cacert.pem)とサーバの秘密鍵(server.key)、クライアント証明書(clcert.pem)を用意してください。

httpd.confの設定は以下の箇所です。

SSLEngine on  <---SSLを有効にします
SSLCertificateFile  <---CAで署名済みのサーバ証明書(cert.pem)
SSLCertificateKeyFile  <---サーバの秘密鍵(server.key)
SSLCertificateChainFile  <---CAの証明書(cacert.pem)
SSLCACertificatePath  <---CA証明書があるパス
SSLCACertificateFile  <---CAの証明書(cacert.pem)
SSLCARevocationPath  <---クライアント証明書があるパス
SSLCARevocationFile  <---クライアント証明書(clcert.pem)
SSLVerifyClient require  <---クライアントの認証要求
SSLVerifyClient 1  <---クライアント認証方式の指定

この設定でApacheを起動した場合、Apacheはクライアントのセッション要求時にクライアント証明書の提出を要求し、クライアント証明書を持っていないユーザはhttpsセッションを確立できません。

ユーザに発行するクライアント証明書は、PKCS12形式に変換したclcert.p12を利用してください。

なお、このclcert.p12をユーザがブラウザなどに登録する場合には、変換時に設定したパスフレーズが必要になりますので、合わせてパスフレーズもユーザに知らせておく必要があります。

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <img localsrc="" alt="">