Nginxとの違い
Apache | Nginx | |
---|---|---|
動作モデル | MPM(Multi Processing Module) 要は複数動作モデル(prefork、worker、event) |
イベント駆動モデルのみ |
パフォーマンス | 遅い(ただし、チューニング次第ではnginxに匹敵する。) | 速い |
拡張モジュール | 後付けてビルドして組み込める。 | nginx本体のビルド時にしか組み込めない。 |
Apacheの動作モード
種類
「event MPM」が一番新しく効率が良いのですが、一部動作しないモジュールがあるため初心者の場合はとりあえず「prefork MPM」を選んでおくのが無難でしょう。
prefork MPM
Apacheで採用されるモデルです。
マルチプロセス型のサーバ。あらかじめ複数プロセスのhttpdを立ち上げておき同時アクセスを捌く。Apacheを構築した段階のデフォルトはこれになっています。
クライアントからの接続要求から始まる一連の処理を各プロセスで1接続ずつ処理します。そのため大量接続を同時処理するためにはその分だけプロセス(スレッド)を起動しなければなりません。
あまり大量のプロセスを起動すると、プロセス間コンテキストスイッチのオーバーヘッドが大きくなってしまい性能が劣化します。(C10K問題)
近年はこれが原因でNginxが優勢になっていたりもします。
worker MPM
プロセス1つで複数スレッドで同時アクセスを捌く。
event MPM
Apache2.4から追加されました。コネクションを持続するKeepAliveを別スレッドに依頼します。
現在の動作モードを調べる方法
1 |
httpd -M | grep mpm |
リリースノート
長らく1系と2系を共存させることで、安定性と新機能性のどちらも追求してきた。
ただ、1系は2010年1月リリースの「1.3.42」を最後にサポート終了しているため現状は2系にバージョンアップをすることが推奨されています。
バージョン | リリース日 | 説明 |
---|---|---|
1,x | 1995/11 | ・ハンドラという機能として定義されたSSI(Server SIde Include)
・この時点でモジュールによる機能拡張は行えた。 |
1.3 | 1998/7 | ・この系統まではSSIをCGIと同じくハンドラで扱っていた。 |
1.3.12 | 2000/2 | AddDefaultCharsetディレクティブ追加 |
1.3.42 | 2010/1 | このバージョンを最後にサポート終了している。 |
2.x | ・入出力データを加工するフィルタ機能実装
・サーバーMPM(Multi Processing Module)としてモジュール化できるようになった。 |
|
2.0 | 2002/4 | 今は2.0系はあまり使われない。 |
2.2 | 2005/12 | 2.2系も徐々に使われなくなってきている。 |
2.4 | 2012/2 | ・現在はApacheはこれの利用を推奨している。
・「event MPM」という機能が追加された。 ・nginxに対抗するためにパフォーマンスの改善を行なっている。 |
設定ファイル
ファイル | 説明 |
---|---|
httpd.conf | Apacheのメインの設定ファイル、このファイルにApacheへの指令である「ディレクティブ」を記述します。 |
magic | MIMEタイプの判定に使用されるファイル。MIMEタイプでは判定でいないファイルのために、ファイルの中身の一部分を見てどのMIMEタイプに該当するファイルかを判定します。(いわゆるマジックナンバーテストのためのファイルということでmagicという名前がついています。) |
mime.types | システム全体のMIMEタイプの設定ファイル |
MIMEタイプ
そもそもMIMEタイプとは?
Windowsなどでは拡張子のみでファイルタイプを判別しますが、Webやメールの世界ではファイルの拡張子とアプリケーションの対応はMIMEタイプで設定し判別します。
Webブラウザは取得したデータのMIMEタイプ(ファイル形式)に応じて処理を決めます。HTTPレスポンスヘッダーの中にも記述されています。
Apacheでは
拡張子とデータタイプの対応表を管理することでデータの種類を判別しています。デフォルトの基本設定ではほとんどの拡張子について設定されていますが、設定ファイルに後から追加することも可能です。
基本設定
mime.typesというファイルに記述されています。
MIMEタイプを追加する設定
1 |
AddType [mimeタイプ] [対応する拡張子] |
ディレクティブ
基本的なディレクティブ
ServerRoot
Apacheの設定ファイルが保存される起点となるディレクトリ
DocumentRoot
HTMLファイルなどのコンテンツを保存する基点となるディレクトリ
ServerAdmin
Webの管理者のメールアドレス
ServerName
Webサーバーを公開している「ホスト名:ポート番号」
AddDefaultCharset
レスポンスとして返す、デフォルトの文字コードの設定、Apache1.3.12以降で追加された。レスポンスヘッダに「Content-Type」に指定が強制されてしまう。もし、文字コードを混在させたシステムを作っている場合は気をつける。
DirectoryIndex
URLでファイルではなくディレクトリが指定された場合に表示されるファイルの指定、デフォルトでは「index.html」になっている。
有効範囲を設定するディレクティブ(セクションディレクティブ)
Directory
特定ディレクトリだけに有効範囲を限定する。
Files
ファイル名によってファイルに対してのみ限定する。ワイルドカードも使えます。「パスと関係なくこのファイル名があればそれに対して設定する!」みたいな挙動です。
Location
URLパス指定する。
Alias
ドキュメントルート以外のファイルを公開したい場合に使います。
正規表現による指定
正規表現による指定をできます。
- DirectoryMatch
- FilesMatch
- LocationMatch
- AliasMatch
Optionsディレクティブ
セクションディレクティブの内部で指定することで必要な機能を制限できます。(例えば、サイトにアクセスされたときにファイル一覧を表示するかなど)
モジュールのロード関連
モジュールがロードされていた場合の処理を記述できます。
LoadModule
動的モジュールのロードを行います。
1 |
LoadModule モジュール識別子 モジュールのパス |
IfModule
あるモジュールがロードされていた場合に実行するディレクティブを指定できる。モジュールがロードされていないのに不要なディレクティブが実行されてしまうことを防げます。
1 2 3 |
<IfModule mod_xxxx.c> ←ここにディレクティブを記述する。 </IfModule> |
なお、モジュール名(xxx.so)はコンパイル前のモジュール名(xxx.c)を指定します。
アクセス制御ディレクティブ
Require
Apache2.4以降ではホストベースのアクセス制御にこれを使用する。(2.4以前はユーザーやグループによるアクセス制御にのみ使用されていた。)
1 |
Require all granted |
上記は、「all(全て)に対してgranted(アクセスを許可する)」という設定になります。
RequireAny
いずれかの条件に一致するホストを指定する。
モジュール
静的モジュール
Apacheのコンパイル時に静的にリンクされてApacheの本体に組み込まれる
どの静的モジュールが読み込まれているか確認するコマンド
1 |
httpd -l |
DSO(Dynamic Shared Object):動的モジュール
再コンパイルすることなく動的に読み込める。
速度的には静的モジュールには劣りますが、使い勝手が良いため大抵のLinuxディストリビューションではこちらになっている。
動的モジュールの例
mod_cgi.so
CGIのためのモジュール
mod_dav.so
WebDAVのサーバー機能を提供するモジュール
mod_auth_host.so
ホストベースのアクセス制御を担当する
mod_auth_basic.so(旧:mod_authモジュール)
Basic認証のモジュール
mod_auth_digest.so
ダイジェスト認証用のモジュール
mod_ssl.so
SSLを使用するためのモジュール
設定ファイル
どのモジュールを有効にするかを設定できる。
現在有効な全てのモジュールを確認するコマンド
1 |
httpd -M |
モジュール名の後ろに「(static)」とついていたら静的モジュール、「(shared)」と付いていたら動的モジュールになる。
バーチャルホストとは?
1台のサーバで複数ドメインを運用する技術です。多くのレンタルサーバーではこの技術はデフォルトで使われています。
メリット
サイトごとにサーバーを用意する必要がなくなるので、サーバーコストの低減につながります。
設定
名前ベース
ドメインに対してサイトを紐付けます。
IPベース
IPアドレスに対してサイトを紐付けます。
ベーシック認証とは?
Apacheの.htaccessという設定ファイルを使った認証のことでディレクトリごとに動作を制御する事が可能です。
htaccessでできる事の種類
- ベーシック認証
- PCサイトからスマホサイトへリダイレクトさせる。
- あるURLからあるURLへリダイレクトさせる。
- 特定のIPやプロバイダからのアクセスを制限する。
ベーシック認証の実装
PHPでpassword_hash関数によりパスワードを暗号化する事が可能です。
1 |
password_hash('平文のパスワード',PASSWORD_BCRYPT) |
上記で生成したパスワードを下記の.htpasswdファイルに記述します。
.htpasswd
1 |
ユーザー名:password_hashによりハッシュ化したパスワード |
.htaccess
1 2 3 4 |
AuthType Basic AuthName ベーシック認証のポップアップに出すメッセージ AuthUserFile 「.htpasswd」のファイルパス require valid-user |
AuthType Basic
ベーシック認証であることを示します。
require valid-user
認証したユーザーのみログインを可能とします。
この記事へのコメントはありません。