RHEL9でWebサーバを構築(Apache編)~httpd.confの解説~

Linux
スポンサーリンク
スポンサーリンク

はじめに

ブログ管理人が主にLPICレベル2の教科書を参考にしながら、実際の設定ファイルを元に用語、設定ファイルの説明などを整理しました。

ディレクティブ

Apacheの設定項目のことです。

下記の公式ドキュメントに全量が掲載されています。

ディレクティブ一覧 - Apache HTTP サーバ バージョン 2.4

モジュール

カーネルモジュールと同じような考え方です。

必要最低限の機能のみを静的に組み込み、必要な機能だけを後から追加できるよう、DSOモジュールという形で外だしされています。

httpd -l

静的に組み込まれたモジュールを表示します。

[root@RHEL9 ~]# httpd -l
Compiled in modules:
core.c
mod_so.c
http_core.c
httpd -M

組み込み済みモジュール、DSOモジュールの一覧表示、文法チェックします。

[root@RHEL9 ~]# httpd -M
Loaded Modules:
core_module (static)
so_module (static)
http_module (static)
access_compat_module (shared)
actions_module (shared)
~省略~

httpd.confの解説

メインとなる設定ファイルです。

通常は/etc/httpd/conf/httpd.confがパスとなります。

ここでは、各ディレクティブについて解説していきます。

ServerRoot

Apacheの設定ファイルやログファイルの起点となるトップディレクトリです。

ServerRoot "/etc/httpd"
Listen

待ち受けポート番号を指定します。

Listen 80
LoadModule

ロードするモジュールを指定します。

LoadModule foo_module modules/mod_foo.so
User 、Group

httpdの実行ユーザーと実行グループを指定を指定します。

User apache
Group apache
ServerAdmin

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

ServerAdmin root@localhost
ServerName

サーバのホスト名(https://ホスト名/…)を指定します。

ServerName www.example.com:80
DocumentRoot

ドキュメントルートを指定します。

DocumentRoot "/var/www/html"
Options

ディレクトリ毎にオプション機能を設定することが可能です。

  • indexes:DirectoryIndexで指定されたファイルがない場合にファイル名一覧を生成
  • FollowSymLinks:リンク先ファイルを参照する
  • ALL:全てのオプションを利用にする
  • None:全てのオプションを無効にする
Options Indexes FollowSymLinks
ErrorLog

エラーログファイルのパスを行います。

ErrorLog "logs/error_log"
LogFormat

ログフォーマットの定義を行います。

「LogFormat “フォーマット” 書式名」が書式となります。

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

フォーマット文字列の説明

  • %h:リモートホスト(クライアント)
  • %l:リモートログ名
  • %u:リクエストをしたユーザー名
  • %t:サーバがリクエストの処理を終えた時刻
  • %r:リクエストの最初の行
  • %>s:サーバがクライアントに返すステータスコード
  • %b:クライアントに送信されたHTTPヘッダ以外のバイト数
  • %{Referer}i:リクエスト内のRefererヘッダの内容
  • %{User-Agent}i:リクエスト内のUser-agentヘッダの内容

書式名の説明

  • common:アクセス元のIPアドレスまたはホスト名/アクセスのしたファイル/リクエストメソッド/アクセスした時間/レスポンスサイズ/レスポンスステータスコードを表します。
  • refer:アクセス元のリンク(ページ)を表します。
  • agent:どの機種(スマホ、PC)やどのブラウザでアクセスしたかを表します。
  • combined:common、refer、agentを合わせて記載しているログになります。
ScriptAlias

CGI用エイリアスの定義をします。

### http(s)://ホスト名/cgi-bin/test.cgiにアクセスした場合、/var/www/cgi-bin/test.cgi が実行される
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
AddDefaultCharset

デフォルトの文字コードをUTF-8として設定します。

AddDefaultCharset UTF-8
ErrorDocument

エラーとエラーページの設定をします。エラーが発生した場合の処理を、エラーコードに続けて指定します。

### 文字列を表示
#ErrorDocument 500 "The server made a boo boo."
### /var/www/html/にあるmissing.htmlを表示
#ErrorDocument 404 /missing.html
### /var/www/cgi-bin/missing_handler.plを実行
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
### URLを指定した場合は、そのURLにリダイレクトさせる。
#ErrorDocument 402 http://www.example.com/subscription_info.html
IncludeOptional

他の設定ファイル(*.conf)の読み込みを行います。

IncludeOptional conf.d/*.conf
StartServers

起動時の子プロセス数を行います。

※Apacheでは複数のプロセスが処理を分担。クライアントからの接続を親プロセスが待ち受け個々のクライアント毎の対応は子プロセスが処理します。

StartServers 4
MinSpareServers

待機している子プロセス数の最小値です。

MinSpareServers 4
MaxSpareServers

待機している子プロセス数の最大値です。

MinSpareServers 8
ServerLimits

生成される子プロセスの設定可能な上限を指定します。

ServerLimits 16
MaxRequestWorkers

最大同時接続数を指定します。

MaxRequestWorkers 10000
Timeout

クライアントからの接続がタイムアウトになる時間を秒数で指定します。

Timeout 60
KeepAlive

キープアライブを有効/無効を指定します。キープアライブを有効化することで、1つのTCPコネクションでHTTPコネクションをやり取りすることができ、通信の安定・レスポンス向上に寄与します。

KeepAlive on|off
MaxKeepAliveRequests

1回のTCP接続における最大リクエスト数を指定します。

MaxKeepAliveRequests 100
KeepAliveTimeout

1回のTCP接続におけるタイムアウト時間を秒で指定します。

KeepAliveTimeout 86400
HostnameLookups

DNSの逆引きを行い、アクセス元のIPアドレスからホスト名を取得します。

ログにホスト名を記録したり、ホスト名でアクセス制御を行う場合は有効します。

パフォーマンスを高める場合はoffにします。

HostnameLookups on|off
Alias

ドキュメントツリー以外の場所を参照可能とします。

### http(s):///ホスト名/testにアクセスした場合、/var/www/html/testではなく、/home/www/testを参照させる例
Alias /test /home/www/test
Redirect

特定のディレクトリまたはファイルへアクセスした場合に、指定したURLへ転送(リダイレクト)させます。

### /var/www/html/test.htmlにアクセスした時に"https://test.com/"へ転送する
Redirect /test.html https://test.com/
AccessFileNmae

httpd.conf以外のファイルに設定を記述して、httpd.confの設定を上書きすることが可能です。AccessFileNameディレクティブで指定します。通常は.htaccessが上書き用のファイルとなります。

AccessFileNmae .htaccess
AllowOverride

外部設定ファイルの利用を許可するにはAllowOverrideディレクティブを使って指定します。

「AllowOverride パラメータ」という書式です。

  • AuthConfig:認証に関する設定を有効にする
  • Indexes:DirectoryIndexなどの設定を有効にする
  • Fileinfo:ファイルタイプの制御設定を有効にする
  • Limit:Order, Allow, Denyによる設定を有効にする
  • Options:Optionsの設定を有効にする
  • None:.htaccessでの変更を無効にする
  • All:.htaccessで変更可能な全ての設定を有効にする
Require

Requireディレクティブでアクセス制御が可能です。以下の要素で制御を行います。

  • IPアドレス
  • ホスト名
  • ドメイン名

このディレクティブはauthz_host_moduleというモジュールで提供されています。

[確認方法]
[root@RHEL9 ~]# httpd -M | grep authz_host_module
authz_host_module (shared)

「Require エンティティ 値」が書式となります。

エンティティ 値の例は次のようなものがあります。

  • ip 10.1.1.1 :10.1.1.1のみ許可
  • ip 172.16 192.168.1:172.16.0.0/16と192.16.1.0/24のみ許可
  • not ip 192.168.0.1:192.168.0.1からのアクセスは拒否
  • host test.example.com:test.example.comのホストのみ
  • group admin:adminグループのみ
  • all granted:全てのホストを許可
  • all denied:全てのホストを拒否
  • local:ローカルホストのみ許可

また、複数の条件を指定したアクセス制御が可能です。

  • RequireAll:すべての条件にマッチすれば真
  • RequireAny:1つ以上の条件にマッチすれば真
  • RequireNone:いずれの条件にもマッチしなければ真

デフォルトではRequireAnyディレクティブが使用されます。

ルートディレクトリ(/)以下の設定

デフォルトでは次の通りです。

<Directory />
AllowOverride none
Require all denied
</Directory>

つまり、.htaccessファイルによる上書きは不可、如何なるホストからのアクセスも拒否されます。

ドキュメントルートディレクトリ以下の設定

デフォルトでは次の通りです。

<Directory "/var/www">
AllowOverride None
# Allow open access:
Require all granted
</Directory>

つまり、.htaccessファイルによる上書きは不可、全てのホストからのアクセスを許可します。

dirモジュールが有効であればディレクトリインデックスを設定
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>

ダイジェスト認証

平文のパスワード認証もありますが、通常使用しないためこちらを解説します。

次の通り、特定のディレクトリへのアクセスについては認証を行いたい場合に使用されます。

<Directory "/var/www/html/private">
### ダイジェスト認証を行う
AuthType Digest
### 認証の領域を指定
AuthName "Private"
### パスワードファイル名
AuthUserFile /etc/httpd/conf/htdigest
### 認証するグループファイル名
AuthDigestGroupFile /etc/httpd/conf/grp_htdigest
### アクセス可能なユーザーを指定。ユーザー名もしくはvalid-userで指定。
Require valid-user
</Directory>

ダイジェスト認証のためのユーザー作成やパスワード変更にはhtdigestコマンドを使用します。

/etc/httpd/conf/htdigestをパスワードファイルとして、領域名はprivateとして、testuserのアカウントを作成する場合は次のコマンドを投入します。

htdigest -c /etc/httpd/conf/htdigest private testuser

バーチャルホスト

2種類あります。

名前ベースのバーチャルホスト

1つのIPアドレスと複数のドメイン名を設定します。

### 1つ目のバーチャルホストの設定
<VirtualHost *:80> 
 SeverName red.example.com
 ServerAdmin red@test.co.jp
 DocumentRoot /var/www/virtual/red
</VirtualHost>

### 2つ目のバーチャルホストの設定
<VirtualHost *:80> 
 SeverName blue.example.com
 ServerAdmin blue@test.co.jp
 DocumentRoot /var/www/virtual/blue
</VirtualHost>

IPベースのバーチャルホスト

複数のIPアドレスと複数のドメイン名を設定します。

Listen 192.168.0.131:443
Listen 192.168.0.132:443

### 1つ目のバーチャルホストの設定
<VirtualHost 192.168.0.131:443> 
 SeverName red.example.com
 ServerAdmin red@test.co.jp
 DocumentRoot /var/www/virtual/red
</VirtualHost>

### 2つ目のバーチャルホストの設定
<VirtualHost 192.168.0.132:443> 
 SeverName blue.example.com
 ServerAdmin blue@test.co.jp
 DocumentRoot /var/www/virtual/blue
</VirtualHost>

コメント