私が運用しているWEBサーバのネットワーク構成など基本的なことをまだ記述していないが、メモなので気にしない。
基本的に全てわからないことは
http://httpd.apache.org/docs/2.2/
に日本語で書いてあるはずなんだが、膨大な量でなかなかヒットしないときもあるのよね・・・。
あと、右も左もわからない最初にあった不満は
http://www.apache.org/
から日本語ドキュメントページに飛びづらかったことかな。
APACHE2
- まずは日本語ドキュメント
- APACHE2 最初にすること
- NameVirtualHostとVirtualHost
- apache2 ディレクトリ
- Redirectでひとつ
- UTF-8うまく使えてますか?
APACHE2 最初にすること
debian において apache2 を導入するために最初にすることを記述する。
まずは aptitude でパッケージを選択するのだが…
apache2 と一言に言っても、様々なパッケージが存在する。必要なものだけ入れたいとは思えど、何が必要なのかを調べ、まずは検討すべきだ。
apache2
apache2.2-common
apache2-mpm-***** (*下記参照)
apache2-doc
上記は必須であろう。依存関係から自動的に選択されるかもしれない。
libapache2-mod-*****
必要に応じて、moduleパッケージもインストールする。
(*)
apache2では複数の種類のmpmが存在し、一つだけ選んで運用することとなる。構築しようというWEBサーバの規模(アクセス数や負荷予想)とマシンスペック、クライアントのリクエストに対してどのように振舞うかという点に着目して選択すればいいのではなかろうか。以下に簡単に解説する。
prefork
apache1.3から使用されている処理方法。スレッドを使用しない。アクセス数に応じて比例的に負荷が増す。ハイスペックなマシンだと抜群のパフォーマンスを発揮するのではないだろうか。安定性◎、速度●。
worker
スレッドを使用した処理方法。preforkよりもメモリ使用が少ないとの説明がある。より効率的な処理ができる。速度◎、安定性○。
perchild
上記二つのの複合形式らしいのだが安定性が今ひとつだという話である。利点としては、子プロセス毎に異なった uid/gid を割りあてることができる。
event
実験的なものらしい。
itk
perchild の特徴を持ち、prefork のように各処理を別プロセスで行う。
個人的主観で言うと、predork または worker を選択するのが良いのではなかろうか。
MPMについての公式での解説ページ↓
http://httpd.apache.org/docs/2.2/ja/mpm.html
perl php ssl など、拡張機能を利用するためのパッケージについてはここでは触れないことにする。
libapache2-mod-(必要なパッケージ機能名)
を適宜導入するべし。
まずは aptitude でパッケージを選択するのだが…
apache2 と一言に言っても、様々なパッケージが存在する。必要なものだけ入れたいとは思えど、何が必要なのかを調べ、まずは検討すべきだ。
apache2
apache2.2-common
apache2-mpm-***** (*下記参照)
apache2-doc
上記は必須であろう。依存関係から自動的に選択されるかもしれない。
libapache2-mod-*****
必要に応じて、moduleパッケージもインストールする。
(*)
apache2では複数の種類のmpmが存在し、一つだけ選んで運用することとなる。構築しようというWEBサーバの規模(アクセス数や負荷予想)とマシンスペック、クライアントのリクエストに対してどのように振舞うかという点に着目して選択すればいいのではなかろうか。以下に簡単に解説する。
prefork
apache1.3から使用されている処理方法。スレッドを使用しない。アクセス数に応じて比例的に負荷が増す。ハイスペックなマシンだと抜群のパフォーマンスを発揮するのではないだろうか。安定性◎、速度●。
worker
スレッドを使用した処理方法。preforkよりもメモリ使用が少ないとの説明がある。より効率的な処理ができる。速度◎、安定性○。
perchild
上記二つのの複合形式らしいのだが安定性が今ひとつだという話である。利点としては、子プロセス毎に異なった uid/gid を割りあてることができる。
event
実験的なものらしい。
itk
perchild の特徴を持ち、prefork のように各処理を別プロセスで行う。
個人的主観で言うと、predork または worker を選択するのが良いのではなかろうか。
MPMについての公式での解説ページ↓
http://httpd.apache.org/docs/2.2/ja/mpm.html
perl php ssl など、拡張機能を利用するためのパッケージについてはここでは触れないことにする。
libapache2-mod-(必要なパッケージ機能名)
を適宜導入するべし。
NameVirtualHostとVirtualHost
一つのWEBサーバで一つのサイトを公開するまでは、意外とすんなり行ける・・・はず。
一つのWEBサーバで複数サイトを公開しつつ、ローカルと外部のアクセスによってログを変えたり、入ってくるデバイスによって公開ページを変えたり等など始めると結構ややこしい。
まずは複数の例を見ながら理解&必要な点をコピペするのが早いと思う。
例
###WEBサーバマシンのアクセス受け付けアドレスとポート番号###
###debianにおいて、Listen行はports.confに書く###
Listen 172.20.30.40:80
Listen 172.20.30.40:8080
Listen 172.20.30.50:80
Listen 172.20.30.50:8080
###各対応サイトの設定###
<VirtualHost 172.20.30.40:80>
##公開ディレクトリのroot##
DocumentRoot /www/example1-80
##要求ホスト名##
ServerName www.example1.com
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
DocumentRoot /www/example1-8080
ServerName www.example1.com
</VirtualHost>
<VirtualHost 172.20.30.50:80>
DocumentRoot /www/example2-80
ServerName www.example1.org
</VirtualHost>
<VirtualHost 172.20.30.50:8080>
DocumentRoot /www/example2-8080
ServerName www.example2.org
</VirtualHost>
上記例は、かなり丁寧な設定になっている。
Listen行で受付IPアドレスとポート番号を指定し、各対応のIPアドレスとポート番号には一つのサイトURLが対応付けられている。
一つの”IPアドレスとポート番号(80が多いであろう)の組み合わせ”で複数サイトのアクセスを受け付ける場合、NameVirtualHost行が必要である。
例
Listen 80
NameVirtualHost *:80
<VirtualHost *:80>
ServerName example.co.jp
DocumentRoot /home/sitemaster/public_html/
</VirtualHost>
<VirtualHost *:80>
ServerName example222.co.jp
DocumentRoot /home/sitemaster222/public_html/
</VirtualHost>
ルータを介さず、linuxマシンがWANに直接接続しルータ兼用等の場合であれば、(DSLなどで接続しているpppデバイス等、IPアドレスが変化する場合)
Listen 80
NameVirtualHost *:80
以下 VirtualHost行
と設定。
VirtualHostの設定例集
http://httpd.apache.org/docs/2.0/ja/vhosts/examples.html
一つのWEBサーバで複数サイトを公開しつつ、ローカルと外部のアクセスによってログを変えたり、入ってくるデバイスによって公開ページを変えたり等など始めると結構ややこしい。
まずは複数の例を見ながら理解&必要な点をコピペするのが早いと思う。
例
###WEBサーバマシンのアクセス受け付けアドレスとポート番号###
###debianにおいて、Listen行はports.confに書く###
Listen 172.20.30.40:80
Listen 172.20.30.40:8080
Listen 172.20.30.50:80
Listen 172.20.30.50:8080
###各対応サイトの設定###
<VirtualHost 172.20.30.40:80>
##公開ディレクトリのroot##
DocumentRoot /www/example1-80
##要求ホスト名##
ServerName www.example1.com
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
DocumentRoot /www/example1-8080
ServerName www.example1.com
</VirtualHost>
<VirtualHost 172.20.30.50:80>
DocumentRoot /www/example2-80
ServerName www.example1.org
</VirtualHost>
<VirtualHost 172.20.30.50:8080>
DocumentRoot /www/example2-8080
ServerName www.example2.org
</VirtualHost>
上記例は、かなり丁寧な設定になっている。
Listen行で受付IPアドレスとポート番号を指定し、各対応のIPアドレスとポート番号には一つのサイトURLが対応付けられている。
一つの”IPアドレスとポート番号(80が多いであろう)の組み合わせ”で複数サイトのアクセスを受け付ける場合、NameVirtualHost行が必要である。
例
Listen 80
NameVirtualHost *:80
<VirtualHost *:80>
ServerName example.co.jp
DocumentRoot /home/sitemaster/public_html/
</VirtualHost>
<VirtualHost *:80>
ServerName example222.co.jp
DocumentRoot /home/sitemaster222/public_html/
</VirtualHost>
ルータを介さず、linuxマシンがWANに直接接続しルータ兼用等の場合であれば、(DSLなどで接続しているpppデバイス等、IPアドレスが変化する場合)
Listen 80
NameVirtualHost *:80
以下 VirtualHost行
と設定。
VirtualHostの設定例集
http://httpd.apache.org/docs/2.0/ja/vhosts/examples.html
apache2 ディレクトリ
debian において apache2 パッケージを aptitude 経由でインストールすると、/etc/apache2/ 以下に設定ファイルが生成される。以下に各ディレクトリとファイルの役割を示す。
/etc/init.d/apache2
実行ファイル。 initスクリプトなので start, stop, restart の引数を与えて動作する。
/etc/apache2/
以下に設定ファイルが置かれる。
/etc/apache2/httpd.conf
本来はこのファイルで設定するが、apache2.conf を include としかかかれていない。ここに設定を記述しても動作はするが、機能毎にファイルを分けるのがdebian流。
/etc/apache2/apache2.conf
メイン設定ファイルとなる。各種設定を記述するだけでなく、以下の設定ファイル群も include する。
/etc/apache2/conf.d/
文字コード等の設定ファイルが置かれる。
/etc/apache2/envvars
起動時オプションなどの追加設定ファイル。
/etc/apache2/ports.conf
使用ポートを記述するファイル。Listen行を記述する。
/etc/apache2/mods-available/
使用可能(インストール済み)なモジュールのファイルを置く。
/etc/apache2/mods-enabled/
現在利用中のモジュールファイルへのシンボリックリンクを置く。( /etc/apache2/mods-available へのシンボリックリンク)
/etc/apache2/sites-availble/
使用可能な各サイトの設定ファイルを置く。内容は VirtualHost 行など。各 VirtualHost 毎に1ファイル(1サイト1ファイルずつ)が望ましい使い方だろう。
/etc/apache2/sites-enabled/
現在利用中のサイト設定ファイルへのシンボリックリンクを置く。( /etc/apache2/sites-available へのシンボリックリンク)
注意すべき点
・httpd.conf や apache2.conf に直接 VirtualHost 行等を記述するのは動作はするけれどスマートでは無いという点。各設定ファイルの役割を覚えれば管理しやすくなる。
・mods-available や sites-available ディレクトリ内のファイルは、利用可能であるだけで、有効になっているとは限らない。mods-enabled や mods-enabled ディレクトリにシンボリックリンクを生成して初めて利用可能である。apache2.conf が include するのは *-enabled ディレクトリからであるという点に注意したい。
・以下コマンドでシンボリックリンクを張ってくれる。対象モジュールやサイトが有効になる。
a2enmod モジュールファイル名
a2ensite サイト設定ファイル名
・以下コマンドでシンボリックリンクを削除してくれる。対象モジュールやサイトが無効になる。
a2dismod モジュールファイル名
a2dissite サイト設定ファイル名
各設定ファイル・ディレクトリの役割を理解した上でスマートに apache2 をカスタマイズして行こう!
/etc/init.d/apache2
実行ファイル。 initスクリプトなので start, stop, restart の引数を与えて動作する。
/etc/apache2/
以下に設定ファイルが置かれる。
/etc/apache2/httpd.conf
本来はこのファイルで設定するが、apache2.conf を include としかかかれていない。ここに設定を記述しても動作はするが、機能毎にファイルを分けるのがdebian流。
/etc/apache2/apache2.conf
メイン設定ファイルとなる。各種設定を記述するだけでなく、以下の設定ファイル群も include する。
/etc/apache2/conf.d/
文字コード等の設定ファイルが置かれる。
/etc/apache2/envvars
起動時オプションなどの追加設定ファイル。
/etc/apache2/ports.conf
使用ポートを記述するファイル。Listen行を記述する。
/etc/apache2/mods-available/
使用可能(インストール済み)なモジュールのファイルを置く。
/etc/apache2/mods-enabled/
現在利用中のモジュールファイルへのシンボリックリンクを置く。( /etc/apache2/mods-available へのシンボリックリンク)
/etc/apache2/sites-availble/
使用可能な各サイトの設定ファイルを置く。内容は VirtualHost 行など。各 VirtualHost 毎に1ファイル(1サイト1ファイルずつ)が望ましい使い方だろう。
/etc/apache2/sites-enabled/
現在利用中のサイト設定ファイルへのシンボリックリンクを置く。( /etc/apache2/sites-available へのシンボリックリンク)
注意すべき点
・httpd.conf や apache2.conf に直接 VirtualHost 行等を記述するのは動作はするけれどスマートでは無いという点。各設定ファイルの役割を覚えれば管理しやすくなる。
・mods-available や sites-available ディレクトリ内のファイルは、利用可能であるだけで、有効になっているとは限らない。mods-enabled や mods-enabled ディレクトリにシンボリックリンクを生成して初めて利用可能である。apache2.conf が include するのは *-enabled ディレクトリからであるという点に注意したい。
・以下コマンドでシンボリックリンクを張ってくれる。対象モジュールやサイトが有効になる。
a2enmod モジュールファイル名
a2ensite サイト設定ファイル名
・以下コマンドでシンボリックリンクを削除してくれる。対象モジュールやサイトが無効になる。
a2dismod モジュールファイル名
a2dissite サイト設定ファイル名
各設定ファイル・ディレクトリの役割を理解した上でスマートに apache2 をカスタマイズして行こう!
Redirectでひとつ
サイトをwordpress等で作り直したときに、index.htmlでアクセスしてきたクライアントが404になることがある。
具体的には旧環境で
としていた時に問題が起こるだろう。
/index.php または / にRedirectすればいい。しかしサイトを続ける上でまたトップページの拡張子が変わり得る可能性を考えると、/ が良いと思う。
/etc/apache2/sites-available 内の対象ファイルにおいて、ドキュメントルート、またはindex.htmlから変更する対象ディレクトリを設定するVirtualHostタグ内を編集する。
(CGIなどに変更した場合は適宜拡張子を変更、ファイル名さえも自由)
上段で明示的に一つのファイルを指定している。(ただしVirtualHost内で行うことを推奨)下段は三つ構文があるが、一つ目の構文はエラーが出てしまった。Redirect先はURLでなくてはいけないようだ。対してRedirectMatch(正規表現を使用)ではURLで書かなくとも可能であった。
また、サイトが引っ越したことを検索エンジンなどに知らせる意味を持つ
という書き方も参考までに。
具体的には旧環境で
RedirectMatch ^/$ /index.html
としていた時に問題が起こるだろう。
/index.php または / にRedirectすればいい。しかしサイトを続ける上でまたトップページの拡張子が変わり得る可能性を考えると、/ が良いと思う。
/etc/apache2/sites-available 内の対象ファイルにおいて、ドキュメントルート、またはindex.htmlから変更する対象ディレクトリを設定するVirtualHostタグ内を編集する。
DirectoryIndex index.php
(CGIなどに変更した場合は適宜拡張子を変更、ファイル名さえも自由)
Redirect /index.html /
Redirect /index.html http://URL/
RedirectMatch ^/index.html$ /
上段で明示的に一つのファイルを指定している。(ただしVirtualHost内で行うことを推奨)下段は三つ構文があるが、一つ目の構文はエラーが出てしまった。Redirect先はURLでなくてはいけないようだ。対してRedirectMatch(正規表現を使用)ではURLで書かなくとも可能であった。
また、サイトが引っ越したことを検索エンジンなどに知らせる意味を持つ
RedirectPermanent /index.html http://URL/
という書き方も参考までに。
UTF-8うまく使えてますか?
UTF-8エンコードのファイルをphpでincludeしたら、ファイル始端にクエスチョンマークがついてきた。出力する際は読み込まれないのだが、ソースでは?と表示されている。ソースの文字コードを変えて表示すると文字化けするのでクエスチョンマークではない。
こんな事例。さて、UTF-8ファイルには二つ表記法がある。いわゆる、UTF-8Nというやつ。
http://ja.wikipedia.org/wiki/UTF-8
↑こちらを見れば解決するのだが、BOMありの方をUTF-8、なしの方をUTF-8Nと呼ぶ。
この、BOM(バイトオーダーマーク)をファイル途中でインクルードし、考慮せずに文字列処理などをすると不具合が起こるわけです。
ただ、HTMLファイル等でBOMを付加せずにいた場合、ブラウザ側でUTF-8と認識してくれない場合があるので、htmlファイルなど、初めに読み込むファイルではBOMをつけるのがベターな方法と言えよう。これはphpファイルにも該当するので、ともかくインクルード前の大元のファイルにはBOMを付けることを意識すると良いだろう。
こんな事例。さて、UTF-8ファイルには二つ表記法がある。いわゆる、UTF-8Nというやつ。
http://ja.wikipedia.org/wiki/UTF-8
↑こちらを見れば解決するのだが、BOMありの方をUTF-8、なしの方をUTF-8Nと呼ぶ。
この、BOM(バイトオーダーマーク)をファイル途中でインクルードし、考慮せずに文字列処理などをすると不具合が起こるわけです。
ただ、HTMLファイル等でBOMを付加せずにいた場合、ブラウザ側でUTF-8と認識してくれない場合があるので、htmlファイルなど、初めに読み込むファイルではBOMをつけるのがベターな方法と言えよう。これはphpファイルにも該当するので、ともかくインクルード前の大元のファイルにはBOMを付けることを意識すると良いだろう。
