Apache
Apache:記事リスト
Apacheのカテゴリーには以下の記事がリストされています。
Apacheのログを一括でホスト名表示する(logresolve)
Apacheのアクセスログは、デフォルトの設定のままだと
接続クライアントのIPアドレスを記録します。
Apacheの設定ファイル(httpd.confまたは、httpd-default.conf)の
HostnameLookupsを「On」にすることで接続クライアントを
ホスト名で記録するように変更ができますが、
パフォーマンス低下を招いてしまいます。
運用中のパフォーマンス低下を防ぐために、
logresolveコマンドを使用してIPアドレスで記録したログファイルを、
一括でホスト名に変換します。
下記例では、IPアドレスで記録されたaccess_log_20170705ファイルを
ホスト名変換してresolve_logファイルに出力します。
# logresolve < access_log_20170705 > resolve_log
また、「-s」を指定して実行することで、logresolveコマンドの実行結果の
統計をファイル出力することも可能です。
例えば、名前解決できたIPアドレスやホスト名、
または名前解決できなかったIPアドレスなどが出力されます。
下記例では、toukeiファイルに統計データを出力しています。
# logresolve -s toukei < access_log_20170705 > resolve_log
統計データは下記のように出力されます。
# cat toukei
logresolve Statistics:
Entries: 131
With name : 0
Resolves : 75
- No reverse : 16
Cache hits : 56
Cache size : 75
アクセスログが大きいと、処理に時間が掛かります。
実行する際は、負荷が少ない時間帯を選ぶなどの配慮が必要になります。
Apacheのアクセスログで接続クライアントのホスト名を記録する
Apacheのアクセスログはデフォルトの設定では、
接続クライアントをIPアドレスで記録します。
接続クライアントをホスト名でアクセスログに記録するには、
httpd.confファイルか、httpd-default.confファイルの
「HostnameLookups」を編集します。
HostnameLookupsはデフォルトでは「Off」になっているため、
IPアドレスからホスト名への逆引きが実行されません。
これを「On」に変更することで、ホスト名でログに記録されるようになります。
# HostnameLookups: Log the names of clients or just their IP addresses
# e.g., www.apache.org (on) or 204.62.129.132 (off).
# The default is off because it'd be overall better for the net if people
# had to knowingly turn this feature on, since enabling it means that
# each client request will result in AT LEAST one lookup request to the
# nameserver.
#
HostnameLookups Off ←「On」に変更します。
ただし、ログを出力する度に、逆引きが実行されるので、
パフォーマンスが低下してしまいます。
そこで、サーバー負荷が低い時間帯などにlogresolveコマンドを
使用して一括でホスト名変換する方法もあります。
設定後は、変更内容を反映させる為に、
Apacheの再起動または、設定ファイルの再読み込み処理が必要になります。
Apacheのカスタムログを設定する
<IfModule log_config_module>〜</IfModule>ディレクティブを編集します。
LogFormatでは、ログの出力形式を指定できます。
デフォルトで「httpd.conf」ファイルに記述されているログフォーマットは、
「common」と「combined」の2つになります。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
上記の出力形式がデフォルトになり、不要なものがあれば削除し、
必要なものがあれば追加してカスタマイズします。
例えば、サーバーのプロセスIDを出力させたい場合は、「%P」を、
ポート番号を出力させたい場合は、「%p」を追加します。
設定可能な主な項目は下記の通りです。
これらの項目をダブルクオーテーション(")で囲って指定します。
フォーマットの中でダブルクオーテーションを記述したい場合は、
「¥」でエスケープして記述します。
| %a | アクセス元のIPアドレス |
| %A | サーバー(Apache)のIPアドレス |
| %B | 送信されたバイト数(ヘッダーは含まず) |
| %b | 送信されたバイト数(ヘッダーは含まず)。0バイトの時は「-」 |
| %f | リクエストされたファイル名 |
| %h | リモートホスト名 |
| %H | リクエストのプロトコル名 |
| %l | クライアントの識別子 |
| %m | リクエストのメソッド名 |
| %q | リクエストに含まれるクエリー文字列。空白以外は「?」が付く。 |
| %r | リクエストの最初の行の値 |
| %s | レスポンスステータス |
| %S | 最後のレスポンスのステータス |
| %t | 時刻 |
| %T | 処理にかかった時間 |
| %u | 認証ユーザー名 |
| %U | リクエストのURLパス |
| %v | リクエストに対するバーチャルホスト名 |
| %V | UseCanonicalNameによるサーバ名 |
| %X | 接続ステータス |
| %{クッキー名}C | リクエストに含まれるクッキーの値 |
| %{環境変数名}e | 環境変数名の値 |
| %{ヘッダー名}i | リクエストに含まれるヘッダー名の値 |
| %{ヘッダー名}o | レスポンスに含まれるヘッダー名の値 |
| %{メモ}n | モジュールから渡されるメモの値 |
| %{フォーマット}t | フォーマットされた時刻 |
上記項目内で{}で囲んで記述されている項目があります。
例えば、「%{クッキー名}C」は、ヘッダーの中からクッキー名に
指定した値だけを出力します。
デフォルトで有効になっているアクセスログは、「common」になります。
これを「combined」に変更するには、httpd.confファイルの
「CustomLog "logs/access_log" common」の行頭に「#」を挿入して
コメントアウトし、「CustomLog "logs/access_log" combined」の
行頭にある「#」を削除します。
# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a
# container, they will be logged here. Contrariwise, if you *do*
# define per-
# logged therein and *not* in this file.
#
#CustomLog "logs/access_log" common ←行頭に「#」を挿入します。
#
# If you prefer a logfile with access, agent, and referer information
# (Combined Logfile Format) you can use the following directive.
#
CustomLog "logs/access_log" combined ←行頭の「#」を削除します。
設定後は、変更内容を反映させる為に、
Apacheの再起動または、設定ファイルの再読み込み処理が必要になります。
Apacheで接続クライアント数を設定する
Apacheに同時接続するクライアント数を設定するには、
httpd.confファイル、またはhttpd-mpm.confファイルのMaxClientsを編集します。
MaxClientsの設定は、<IfModule mpm_prefork_module>〜</IfModule>、
または、<IfModule mpm_worker_module>〜</IfModule>の2箇所あります。
これは、使用しているApacheがどのMPMを採用しているかによって
設定箇所が変わります。
Workerはマルチスレッドとマルチプロセスのハイブリッド型になり、
Preforkよりも少ないサーバーリソースで多くのレスポンスに
対応することができるのが特徴です。
下記の環境では、Server MPMがPreforkなので、
<IfModule mpm_prefork_module>〜</IfModule>ディレクティブの
MaxClientsを設定します。
※CentOS環境ではデフォルトでPreforkを使用しています。
# /usr/local/apache2/bin/apachectl -V
Server version: Apache/2.2.31 (Unix)
Server built: Sep 28 2015 11:49:05
Server's Module Magic Number: 20051115:40
Server loaded: APR 1.5.2, APR-Util 1.5.4
Compiled using: APR 1.5.2, APR-Util 1.5.4
Architecture: 64-bit
Server MPM: Prefork
例では、httpd-mpm.confファイルを編集します。
# vi /usr/local/apache2/conf/extra/httpd-mpm.conf
Server MPMによって、「prefork MPM」か「worker MPM」の
MaxClientsの値を編集します。
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
設定後は、変更内容を反映させる為に、
Apacheの再起動または、設定ファイルの再読み込み処理が必要になります。
Apacheのポート番号を変更する
Webサーバーは、一般的にTCP80番ポートを使用して
クライアントからのアクセス受け付け、Webサイトを表示します。
これらのポート番号は、世界的な規格で定められていますが、
何らかの理由で80番から変更したい場合は、
Apacheの設定ファイル(httpd.conf)を編集することで可能です。
# vi /usr/local/apache2/conf/httpd.conf
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80
Listenに指定する番号を変更することで、ポート番号を変更します。
Listen 8080
上記の例では、Apacheのポート番号を「8080」に変更しています。
また、インターフェースごとにポート番号を設定したい場合には、
Listen 12.34.56.78:80のように「IPアドレス:ポート番号」と指定します。
設定後は、変更内容を反映させる為に、
Apacheの再起動または、設定ファイルの再読み込み処理が必要になります。
KeepAliveを利用してApacheのパフォーマンスを向上させる
KeepAliveは、クライアントからのアクセスをキープして、
以後のアクセスはそのコネクションを利用して送信することで
パフォーマンスを向上させる機能です。
KeepAlive設定は、Apacheの設定ファイルhttpd.confファイルや、
httpd-default.confファイルで行います。
※Apacheのバージョンによって異なります。
下記実行例は、Apache2.2のものです。
# vi /usr/local/apache2/conf/extra/httpd-default.conf
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On
↑KeepAliveを利用するには、「On」、利用しない場合は「Off」にします。
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100
↑MaxKeepAliveRequestsは、コネクションあたりで
保持するリクエストの上限を設定します。
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 5
↑KeepAliveTimeoutは、次のリクエストまでのコネクション保持時間です。
単位は秒になります。
KeepAliveTimeoutは、値が小さいとすぐにコネクションが切れてしまい、
逆に大きすぎると無駄なコネクションが確立されたままになり、
サーバーリソースの浪費につながります。
設定後は、変更内容を反映させる為に、
Apacheの再起動または、設定ファイルの再読み込み処理が必要になります。
接続中のプロセスが終了するのを待ってApacheを停止する
Apacheの停止には、/etc/init.d/httpd stopを使用します。
しかし、stopを実行すると接続中のhttpdプロセスは強制的に終了してしまいます。
つまり、接続してきていたクライアントとの通信が強制的に切断してしまうのです。
そこで、接続中のプロセスが終了するまで待って、
停止する機能がApacheには実装されています。
クライアントとの通信が終了するまで待って再起動するには、
下記のように「graceful-stop」を指定します。
graceful-stopは、/etc/init.d/httpdスクリプトでは実行できず、
スクリプトの元となるapachectlファイルを実行する必要があります。
# /usr/local/apache2/bin/apachectl graceful-stop
graceful-stopを実行すると、利用されていないListen状態のプロセスが終了し、
使用中のプロセスは停止しない状態になります。
すべてのクライアントとの通信が終了するまで停止できませんので、
通信状況によっては、かなり待たなければならない場合があります。
しかし、通信接続保持を優先させる場合には効果的な機能となります。
接続中のプロセスが終了するのを待ってApacheを再起動する
Apacheの再起動には、/etc/init.d/httpd restartを使用します。
しかし、これを実行すると接続中のhttpdプロセスは強制的に終了してしまいます。
つまり、接続してきていたクライアントとの通信が強制的に切断してしまうのです。
そこで、接続中のプロセスが終了するまで待って、
再起動する機能がApacheには実装されています。
クライアントとの通信が終了するまで待って再起動するには、
下記のように「graceful」を指定します。
# /etc/init.d/httpd graceful
gracefulを実行すると、すべてのクライアントとの通信が終了するまで再起動できません。
通信状況によっては、かなり待たなければならない場合があります。
しかし、通信接続保持を有線させる場合には効果的な機能となります。
CentOS7で使用するsystemdでは、gracefulの代わりにreloadを使用します。
# systemctl reload httpd
Apacheのタイムアウト(Timeout)を設定・確認する方法【2.4対応版】
「Timeoutの秒数はどこで設定するの?」
「今の設定値を確認したい」
・・・Webサーバーの構築や障害対応の現場では、こうした確認が日常的に発生します。
この記事では、Apacheのタイムアウト(Timeout)設定を確認・変更する全手順を体系的に解説します。現代の主流であるApache 2.4系(RHEL 9 / AlmaLinux 9など)に完全対応した、今日から使える内容です。
そもそもApacheのTimeout(タイムアウト)とは
Apacheのタイムアウトとは、クライアント(ブラウザなど)とサーバー間でパケットの送受信が行われないまま、通信を強制的に切断するまでの待機時間(秒数)のことです。リクエストのパケットが途絶え、指定した時間が過ぎるとコネクションが自動的に切断されます。これにより、応答のない無駄な接続がサーバーのリソースを圧迫するのを防いでいます。
Timeoutが適用される3つの場面
Apache 2.4のTimeout ディレクティブは、以下の3つの通信フェーズすべてに共通して適用されます。・接続(Connect):クライアントからの接続要求を待つ時間
・受信(Receive):クライアントからリクエストデータが届くまでの待機時間
・送信(Send):クライアントへレスポンスを送信できるまでの待機時間
「受信だけ延ばしたい」「送信だけ変えたい」という場合は、後述する
ProxyTimeout や各モジュール固有のディレクティブとの使い分けが必要になります。Apacheのエラーログを設定する
Apacheでエラーログを設定するには、httpd.confファイルを編集します。
インストール方法にもよりますが、httpd.confファイルは、
/etc/httpd/conf/ディレクトリか/usr/local/apache2/conf/ディレクトリなどに格納されています。
詳しくは、httpd.confファイルのServerRootに設定されているディレクトリを確認してください。
[root@Tiger ~]# vi /usr/local/apache2/conf/httpd.conf
#
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a
# container, error messages relating to that virtual host will be
# logged here. If you *do* define an error logfile for a
# container, that host's errors will be logged there and not here.
#
ErrorLog "logs/error_log"
#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn
上の例では、ErrorLog "logs/error_log"がエラーログ設定箇所になり、
logsディレクトリのerror_logファイルに出力することが設定されています。
logsディレクトリは、/etc/httpd/logsか、/usr/local/apache2/logsディレクトリなどになります。
LogLevel warnでは、ログの出力レベルが設定されており、
デフォルトでは、warn以上が記録されます。
コメントにあるdebug, info、notice、warn、error、crit、alert、emergを指定出来ます。
変更後は、設定を反映させるためApacheの再起動を行います。
[root@Tiger ~]# /etc/init.d/httpd restart
Apacheの設定にインデックスファイルを追加する
URLを指定してホームページにアクセスする際、ディレクトリ名を指定するだけで
ホームページのファイルを表示させるには、インデックスファイルの設定を行います。
つまり、「https://www.linuxmaster.jp/」とURLを指定すると、
「https://www.linuxmaster.jp/index.html」が表示される設定です。
この設定を行うには、Apacheの設定ファイル「httpd.conf」ファイル内にある
「DirectoryIndex」に設定を行います。
インストール方法にもよりますが、httpd.confファイルは、
/etc/httpd/conf/ディレクトリか/usr/local/apache2/conf/ディレクトリなどに格納されています。
詳しくは、httpd.confファイルのServerRootに設定されているディレクトリを確認してください。
DirectoryIndexは、左から順番にサイン称するファイルを指定します。
デフォルトでは、「index.htm」は設定されていませんので、
index.htmをインデックスファイルに含める場合、明示的にindex.htmの設定が必要になります。
[root@Tiger ~]# vi /usr/local/apache2/conf/httpd.conf
#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
DirectoryIndex index.html index.htm ←「index.htm」を追加します。
追加後は、設定を反映させるためApacheの再起動を行います。
[root@Tiger ~]# /etc/init.d/httpd restart
Apacheで採用しているモジュールを確認する
Apacheにはたくさんの豊富な機能がありますが、それは、「モジュール」として提供されています。
モジュールを確認するには、「/etc/init.d/httpd」コマンドに「-M」オプションを指定して実行します。
[root@Tiger ~]# /etc/init.d/httpd -M
Loaded Modules:
core_module (static)
mpm_prefork_module (static)
http_module (static)
so_module (static)
authn_file_module (shared)
authn_dbm_module (shared)
authn_anon_module (shared)
authn_dbd_module (shared)
authn_default_module (shared)
authz_host_module (shared)
authz_groupfile_module (shared)
authz_user_module (shared)
authz_dbm_module (shared)
〜中略〜
actions_module (shared)
speling_module (shared)
userdir_module (shared)
alias_module (shared)
rewrite_module (shared)
Syntax OK
各モジュールの後ろにある(static)と(shared)の意味は下記のとおりです。
(static):固定で組み込まれている静的モジュール
(shared):実行時に読み込まれる動的モジュール
上記モジュールの中で特に有名なのは、 mpm_prefork_moduleです。
このモジュールの名称の先頭にmpmが付いていますが、
これは「Multi Processing Module」を意味しており、クライアントからの処理機能を
モジュール化して、モジュールを取り替えることで、Apacheを最適化する仕組みです。
また、Apacheで採用している静的モジュールだけを一覧表示したい場合は、
「/etc/init.d/httpd」コマンドに「-l」オプションを指定して実行します。
[root@Tiger ~]# /etc/init.d/httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
apachectlを実行しても同じ結果が得られます。
[root@Tiger ~]# /usr/local/apache2/bin/apachectl -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
Apacheの設定ファイル(httpd.conf)の編集誤りを確認する
Apacheの設定ファイル(httpd.conf)の編集を行ったら、
編集内容に誤りがないか確認を行います。
インストール方法にもよりますが、httpd.confファイルは、
/etc/httpd/conf/ディレクトリか/usr/local/apache2/conf/ディレクトリなどに格納されています。
詳しくは、httpd.confファイルのServerRootに設定されているディレクトリを確認してください。
構文誤りをテストするには、/etc/init.d/httpdに「configtest」を指定します。
「Syntax OK」と表示されれば、構文に問題がないことになります。
※apachectlにconfigtestを指定して実行しても同じ結果が得られます。
[root@Tiger ~]# /etc/init.d/httpd configtest
Syntax OK
[root@Tiger ~]# /usr/local/apache2/bin/apachectl configtest
Syntax OK
また、構文に誤りがある場合、下記のように表示されます。
[root@Tiger ~]# /etc/init.d/httpd configtest
Syntax error on line 31 of /usr/local/apache2/conf/httpd.conf:
Invalid command 'dd', perhaps misspelled or defined by a module not included in the server configuration
上記のメッセージでは、「line 31」(31行目)に誤りがあることが指摘されています。
このれいでは、「dd」という文字が余分に入っていることを意味していますので、
これを削除する必要があります。
httpdサービスを起動・停止する
httpdサービスを起動するには、手動で起動する必要があります。
このデーモンは、/etc/init.d/httpdスクリプト、
または/etc/rc.d/init.d/httpdスクリプトによって管理されています。
httpdスクリプトに引数を渡すことで制御を行います。
■httpdスクリプトの引数
| start | httpdを起動します。 |
| stop | httpdを停止します。 |
| restart | httpdを再起動します。 |
| reload | ファイルを再読み込みします。 |
| condrestart | httpdが起動している時には、再起動します。 |
| status | httpdの状態を表示します。 |
| fullstatus | httpdの詳細情報を表示します。 |
| graceful | httpdのプロセスが終了するのを待ってhttpdを再起動します。 |
| configtest | 設定ファイルの構文誤りをチェックします。 |
■httpdサービスの起動
[root@Tiger ~]# /etc/init.d/httpd start
■httpdサービスの停止
[root@Tiger ~]# /etc/init.d/httpd stop
■httpdサービスの再起動
[root@Tiger ~]# /etc/init.d/httpd restart
■設定ファイルの構文誤りをチェック
[root@Tiger ~]# /etc/init.d/httpd configtest
Syntax OK
■httpdの詳細情報を表示
[root@Tiger ~]# /etc/init.d/httpd fullstatus
Apache Server Status for localhost
Server Version: Apache/2.0.64 (Unix) DAV/2
Server Built: Aug 23 2012 14:36:58
__________________________________________________________________
Current Time: Friday, 12-Jul-2013 16:01:36 JST
Restart Time: Friday, 12-Jul-2013 16:01:35 JST
Parent Server Generation: 2
Server uptime: 1 second
1 requests currently being processed, 4 idle workers
__W__...........................................................
................................................................
................................................................
................................................................
Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process
PID Key:
1640 in state: _ , 1641 in state: _ , 1642 in state: W
1643 in state: _ , 1644 in state: _ ,
__________________________________________________________________
To obtain a full report with current status information you need to use
the ExtendedStatus On directive.
__________________________________________________________________
Apache/2.0.64 (Unix) DAV/2 Server at localhost Port 80
Apacheのバージョンを確認する
ApacheはWebサーバーアプリケーションとして世界でもっとも使用されているソフトウェアです。
Apacheは現在も開発が続けられており、新バージョンのリリースがあります。
現在使用しているApacheのバージョンを確認する方法を紹介します。
Apacheをインストールするには(ソースコード)
Linuxでソフトウェアをインストールする方法は2つあります。1つはRPMと呼ばれるパッケージ管理ツールを使用する方法。もうひとつはここで紹介するソースコードでのインストールです。
それぞれメリット、デメリットがあり、RPMはソフトウェアの管理が楽ではありますが、最新バージョンの対応がソースコードと比較して遅く、緊急性の高いセキュリティ対策に対応しにくいというデメリットがあります。
また、ソースコードでのインストールは最新バージョンの対応は早いのですが、インストール方法がRPMと比較して難しいという面があります。
どちらを使用するかは好みだと思いますが、外部に公開するサーバーとして使用する場合はセキュリティ面のことを考えてソースコードでのインストールを行うことをおすすめします。
