Apache2のインストール&構築

1.はじめに

Apache1.3系を使用していましたが、そろそろ2.0系へ移行しようとトライしました
1.3系ではいろいろ欲張りソースから入れていましたが今度はportsでインストールして見ました
これでアンインストールも出来るので良くなる事でしょう

2.本体のインストールと設定起動

まずportsコレクションは最新にしておきましょう
opensslは前もってインストールしておいてください
私は1.3時代のソースからインストールされたものをそのままで進めました
portsなりパッケージなりでインストールしておいてください。
では、そのままインストールしてしまいます
# cd /usr/ports/www/apache20
# make install clean
特に私はオプションを設定はしていません。
オプションはいろいろあり「make show-options」でオプション一覧が見られますのでお好みに応じて下さい。

次に設定をします
confファイルは /usr/local/etc/apache2/httpd.conf です。
変更した箇所は
### Section 2: 'Main' server configuration
ServerAdmin www@hogehoge.dyndns.org
<Directory "/usr/local/www"> Options Includes FollowSymLinks ExecCGI AllowOverride All Order allow,deny Allow from all Deny from アクセスさせたくないドメイン、例えば.krとか </Directory> DirectoryIndex index.html index.htm index.php index.cgi index.pl index.shtml index.shtm #AddHandler cgi-script .cgi AddHandler cgi-script .cgi #AddOutputFilter INCLUDES .shtml AddOutputFilter INCLUDES .shtml .html .htm <Files *.html> ForceType text/html SetOutputFilter INCLUDES </Files> # なぜかApache2からSSIは拡張子htmlで動くようになりました、最初のhtmlはいらないかも # それ以外にlog関係はお好みで変更する # 私はファイルリストが見えるのが嫌いなので「Indexes」は全て消しました

/etc/rc.conf
apache2_enable="YES"

リブートしない場合は
# /usr/local/etc/rc.d/apache2.sh start
で起動できます

3.SSL化

インストールしたApache2をSSL化します
コマンドラインから
# cd /usr/local/etc/apache2
# mkdir ssl.key ssl.crt
# chmod 700 ssl.key ssl.crt
# /usr/bin/openssl genrsa -out /usr/local/etc/apache2/ssl.key/server.key 1024
Generating RSA private key, 1024 bit long modulus
.++++++
..........++++++
e is 65537 (0x10001)
# /usr/bin/openssl req -new -days 365 -key /usr/local/etc/apache2/ssl.key/server.key -out /usr/local/etc/apache2/ssl.crt/server.csr -out /usr/local/etc/apache2/ssl.crt/server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
すると以前同様いろいろ聞いて来ますので入力して行きます
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:都道府県
Locality Name (eg, city) []:市町村
Organization Name (eg, company) [Internet Widgits Pty Ltd]:名前など
Organizational Unit Name (eg, section) []:未入力でOK
Common Name (eg, YOUR name) []:hogehoge.dyndns.org(ドメイン名)
Email Address []:www@hogehoge.dyndns.org

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:未入力でOK
An optional company name []:未入力でOK
引き続き自己認証します
# /usr/bin/openssl x509 -in /usr/local/etc/apache2/ssl.crt/server.csr -out /usr/local/etc/apache2/ssl.crt/server.crt -req -signkey /usr/local/etc/apache2/ssl.key/server.key -days 365
Signature ok
subject=/C=JP/ST=都道府県/L=市町村/O=名前/CN=hogehoge.dyndns.org
Getting Private key
これでOKです
そして設定します
/usr/local/etc/apache2/ssl.conf
ServerName hogehoge.dyndns.org:443
ServerAdmin www@hogehoge.dyndns.org
DocumentRoot "/usr/local/wwwssl"←場所です

そしてSSLで立ち上がるように
/etc/rc.conf
apache2_enable="YES"
apache2ssl_enable="YES"
と2行にします
立ち上がっている場合は
# /usr/local/etc/rc.d/apache2.sh restart
で再起動できます

4.mod_perlのインストール

mod_perlもportsで入れてしまいます
# cd /usr/ports/www/mod_perl2
# make install clean
インストールはこれで完了です
次に設定でhttpd.confを編集します
/usr/local/etc/apache2/httpd.conf
LoadModule perl_module libexec/apache2/mod_perl.so
今回は「AddModule mod_perl.c」は無しです
あと名前もlibperl.soから変っていますね
以上で終了です

5.PHPのインストール

まず、使用するデーターベースをインストールします
私はMySQL派(マイナーですが)なのでMySQLをインストールします。
# cd /usr/ports/databases/mysql50-server
# make install clean
これで必要な他のportsもインストールしてくれます

次にデーターベースを初期化します
# cd /usr/local/bin
# ./mysql_install_db
# cd /var/db
# chown -R mysql:mysql mysql
後半のchownはrootのままだと立ち上がらないのでユーザーとグループをmysqlにします
あとはwebminからでも起動して下さい。

そしてphpをインストールします
# cd /usr/ports/lang/php5
# make config
するとオプションがいろいろ選べます
私は「Apache」をONして「IPv6」をOFFしました
そして一旦OKで抜けます

今度こそ本当のインストール
# cd /usr/ports/lang/php5-extensions
# make install clean
初めてだとまたオプションが出て来ます
2回目以降の場合は「make config」で選んで下さい
私はここで最終的にONなのが
CTYPE、MBRSTRING、MYSQL、PCRE、PDO、POSIX、SESSION、SIMPLEXML
SQLITE、TOKENIZER、XML、XMLREADER、XMLWRITER、ZLIB
です
これでApacheとMysqlに関連づけてくれます

引き続き設定をします。
まずPHP設定ファイルをコピーします
# cp /usr/local/etc/php.ini-dist /usr/local/etc/php.ini

そして以下の部分を編集します
/usr/local/etc/php.ini
#register_globals = Off
register_globals = On
ここを直さないとデータベースにアクセスできません。
なぜかデフォルトは「off」なんて不親切ですね!
私も修正したのを忘れていました。ご指摘ありがとうございました>山上氏

次にApacheのconfファイルを編集します。
/usr/local/etc/apache2/httpd.conf
LoadModule php5_module libexec/apache2/libphp5.so #自動で入りました確認のみ
#AddModule mod_php5.c   Apache2だと無し?とりあえずコメントアウト
  ・
  ・
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

あとはApacheを再起動すればOKです。
動作確認する為に以下の内容のファイルを作りアクセスして見てPHPの設定などちゃんと出れば動いています。
info.php
<?php phpinfo(); ?>

6.mod_rubyのインストール

前回同様mod_rubyも入れます
もちろんrubyはインストールされているとして話を進めます
1.3に説明時にはMR_DEFAULT_SAFE_LEVELを下げていましたが、これは大変危険な事で
できるだけ行わない方がよろしいようです。
私の場合、知人が作成してくれるスクリプトでuntaintを一切入れておらず無管理なので・・・ぼそっ
まあrubyスクリプトのあるページへは全て.htaccessで入室者を限定しているので大丈夫だと思うのですが・・・
なのでMR_DEFAULT_SAFE_LEVELは変えないにこしたことありませんので、できるだけそのままインストールしましょう

まずはpatchを作成します
/usr/ports/www/mod_ruby/
へ移動し、Makefileから使用するバージョンを確認します
PORTVERSION= 1.2.6
という所ですね
そして本家サイトへ行き同じバージョンのソースをダウンロードして来ます
http://www.modruby.net/

ダウンロードしたら解凍し問題の部分を修正したファイルを作成します
# cd /usr/local/src
# wget http://www.modruby.net/archive/mod_ruby-1.2.6.tar.gz
# tar xvzf mod_ruby-1.2.5.tar.gz
# cd mod_ruby-1.2.5
# cp mod_ruby.h mod_ruby.h.org
# vi mod_ruby.h
そして修正します、修正後パッチファイルを作成しコピーします
# diff -c mod_ruby.h.org mod_ruby.h > patch-mod_ruby.h
# cp patch-mod_ruby.h /usr/ports/www/mod_ruby/files/

ではコンパイル&インストールします
# cd /usr/ports/www/mod_ruby
# make install clean

そしてhttpd.conを編集します
/usr/local/etc/apache2/httpd.conf
LoadFile /usr/lib/libpthread.so
LoadModule ruby_module libexec/apache2/mod_ruby.so
        ・
        ・
AddHandler ruby-script .rbx
        ・
        ・
<IfModule mod_ruby.c>
  RubyRequire apache/ruby-run
  SetEnvIf Request_URI \.rbx rbx
  SetEnvIf Request_URI \.css rbx
  <Files *.rbx>
    SetHandler ruby-object
    RubyHandler Apache::RubyRun.instance
  </Files>
</IfModule>

あとはApacheを立ち上げ直せば動くと思います。

7.Dos攻撃対策(mod_bw)

常に最新版にしていますが、2回ほど攻撃をくらってCPUパワーがフルスケールになってしまっていたので対策してみました(2007/7/26)
世の中にはいろいろあるようで、ざっと並べると
mod_limitipconn 接続制限
mod_dosdetector 接続制限
mod_bwshare 接続制限+帯域制限
mod_bw(bw_mod) 接続制限+帯域制限
mod_cband 接続制限+帯域制限
とありました。
この中でportsがあるものでmod_bwを選んでみます。
ではまずインストールします
# cd /usr/ports/www/mod_bw
# make install clean
これで終了
設定はhttpd.confで行います
追記したのは下記のとおりです
LoadModule bw_module libexec/apache2/mod_bw.so
# ここからは<DIRECTORY>などで個別やバーチャルホストごとなど設定可能(だと思います)
BandWidthModule On
ForceBandWidthModule On
BandWidth all 10240
BandWidthError 510
MaxConnection all 10
それぞれの説明はインストールされた「mod_bw.txt」にあります。
簡単にまとめてみます
BandWidthModule On 動かす場合はOn
動かさない場合はOff
ForceBandWidthModule On Onの場合、全てのリクエストに対応する
たとえばhtmlとかtextだけとかにしたい場合は
Offにし、AddOutputFilterByTypeで指定する必要あり
BandWidth all 102400 この場合は全てのIPから10kB/sまでの帯域制限という意味
速度を0にすると無制限
IPアドレスの指定は
192.168.0.0/24 もしくは 192.168.0.0/255.255.255.0
などで指定できる
またホスト名やドメイン名なども指定可能らしい
複数指定可能で先に指定した方が優先となる(と思います)
0.8ではuser-agentでも指定が可能らしい
MinBandWidth all 10240 複数クライアント時の制限だと思います
1クライアントだけだとBandWidthで規定された速度だが
複数クライアントになった場合は1クライアントあたりこの
速度までになると思います
LargeFileLimit .avi 500 102400 大きなファイルは速度制限を変える設定
.avi部分はファイルタイプを指定します、「*」だと全部
次の500は500kB以上のファイルという意味
最後の102400は速度で100kB/s
要するに500kB以上のaviファイルは100kB/sまでOKという意味
BandWidthError 510 最大接続数を超えた場合に吐き出すエラー番号
MaxConnection all 10 1クライアントに対しての接続数制限
この場合はすべてのIPから1秒間に10接続までしか許可しない
ここでもサブネットマスク等指定ができます
あまり小さいとホームページ1ページでも画像が多かったりすると
エラーするかもしれませんのでご注意ください
本当に効いているかはまだよくわかりません。