WHAT'S NEW?
Loading...

Linuxを使ったWeb開発環境を手早く構築する【2/3】

さて今回はバックエンドの構築ということで、前回インストールしたApache、php、MySQL、Postfix、BINDの設定を中心に説明したいと思う。

繰り返しになるが、あくまで俺が何度も試してみた結果でしかないので、これが正解というわけではないことを断っておく。

ただ、Linuxを基礎から覚えたい!Webの仕組みを1から網羅したい!という人だけではないとおもうし、必要に迫られてググってたどり着いた人も多いとおもうので、なるべくかいつまんで説明する予定だ。

ただしかいつまむと言ってもさすが俺のことだ。DNSの部分など、可能な限り、「AするとBになる」という因果関係だけで終わらせるのは避け(これは俺の大嫌いなパターン)「AするとBになるのはCだから」まで掘り下げて書こうと思っている。しかしくどくならないように、全体的にはさっぱりサラサラのサラサーティ且つ、ダウニー的爽やかさを醸し出せるように意識して書いたつもりだ(おい、怒るな!)。

ちなみにLinuxのホスト名をtorhamzedd.comとし、ドメインもtorhamzedd.comとするのを前提として説明する。

というわけで早速いってみよう。




■Apacheの設定

設定ファイルは予めバックアップを取っておく。
端末でrootになり、以下のようにしてコピーしておこう。
# cd /etc/httpd/conf/
# cp httpd.conf httpd.conf.20110822
それでは早速中身をいじり倒す。
# vi httpd.conf

設定項目変更前変更後
ServerLimit256300
MaxClients256300
MaxRequestsParChild400050
ServerTokensOSProd
ServerNamewww.example.com:80torhamzedd.com:80
<コメントを外す>
OptionsFollowSymLinksIncludes ExecCGI FollowSymLinks
AllowOverrideNoneAll
ServerSignatureOnOff
AddDefaultCharsetUTF-8UTF-8
<コメントを外すだけ>
AddHandler cgi-script .cgi.cgi .pl
<コメントを外す>
NameVirtualHost*:80*:80
<コメントを外すだけ>
LanguagePriorityen ca・・・ja en ca…
<jaを先頭に持ってくる>

(※)prefork.cの設定になる。
この設定はむしろサーバ側の負荷を抑えるための設定になるので、クライアントマシンとしてのLinuxで行うのは不適切だが、可能な限りサーバ側に合わせられるのもLinuxをクライアントとして使う醍醐味でもあるので、この設定にしてある。

あと、phpメインの人には余り関係ないが、どの場所でもCGIが使えるようになっており、拡張子も.cgiだけでなく、.plも使用可にしてある。

そしてファイルの最後の行に、以下のようにバーチャルホストのデフォルト設定を記述すれば完了だ。
<virtualhost *:80>
  ServerAdmin   root@localhost
  ServerName    torhamzedd.com
  DocumentRoot  /var/www/html
</virtualhost>

もしAWStatsを使うのであれば、エラーログファイルのフォーマットを1つ追記しておき、アクセスログはcommonではなくcombinedを指定するようにする。
LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
余談だが、httpsを使う場合、該当するAWStatの設定ファイルに
UseHTTPSLinkForUrl="/"
を記述するのを忘れないように。

■PHPの設定

phpの設定ファイルも必要に応じてバックアップを取っておこう。
※個人的には/etc直下がバックアップファイルまみれになるのが嫌なので、php.iniやmycnfバックアップは撮ってない。

早速設定を行う。
# vi /etc/php.ini
設定項目変更後
post_max_size1024M
upload_max_filesize1024M
memory_limit1024M
mbstring.languageJapanese
mbstring.internal_encodingUTF-8
mbstring.http_inputUTF-8
mbstring.http_outputUTF-8
mbstring.detect_orderauto
expose_phpOff

(※)このパラメータは、phpMyAdminなどのWebインタフェース上において、数百メガのSQLファイルをアップロードする場合などのために増やしてあるに過ぎず、これほど大きなサイズを運用で設定しっぱなしというのは結構危険なので、クライアント側だけにとどめておこう。

その他、mbstring系は最初コメントアウトされているので、上記のすべての「;」は消しておこう。

expose_phpというのは、phpでメール送信した場合にphpということを隠すかどうかの設定だ。今回はOffにしてある。

これでPHPの設定は完了だ。
この時点でApacheを起動、もしくは再起動してOK。
# service httpd start
リブート後に自動起動しておくようにする。
# chkconfig httpd on

手頃な場所にphpinfo()を記述したphpファイルを設置し、ブラウザで見てみると良い。

これでApacheとPHPの設定は完了だ。

■MySQLの設定

MySQLは5.1から5.5で、設定ファイルの記述に変化があった。
特に大きいのが、UTF-8などの文字コードを明示的に指定する部分だろう。

ただ5.5でもちゃんと指定することが出来るので安心だ。

MySQLの設定ファイルは/etc/my.cnfだ。
不安な人はバックアップしておくとよいが、俺は先程も書いたとおり、/etc直下がバックアップファイルでごちゃごちゃするのが好きではないので、my.cnfのバックアップもしてない。
# vi /etc/my.cnf
[mysqld]の下に「symbolic-links=0」という記述があるが、この下に、以下のような設定を貼り付ける。
default-storage-engine=INNODB
skip-character-set-client-handshake
character-set-server=utf8
max_connections=120
innodb_thread_concurrency=8
innodb_buffer_pool_size=1024M
innodb_log_file_size=128M
innodb_file_per_table
read_buffer_size=1M
query_cache_size=12M

「max_connections」から「query_cache_size」までは2011.11.14日追記

最初の行は、俺は個人的に常にInnoDBを使うので、いちいち設定するのが面倒だからデフォルトでInnoDBになるように設定している。
2行目と3行目では文字コードの設定をしているが、5.1とでは項目名が違うので注意。

innodb_thread_concurrencyはMySQL5.5だと20がデフォルトだが、この20というのは無制限という意味になってしまうらしく、中規模サイトだとメモリを食いつぶす可能性があるため、明示的に8にしてある(現在調査中)。

起動時にエラーが出るようであれば、何かが間違っている。俺の設定が間違っている可能性も当然ある。

その場合、「innodb_file_per_table」だけを設定して、あとは行頭に「;」を入れてコメントアウトしてから起動すると良いかもしれない。
申し訳ないが、まだMySQL5.5は理解してない部分が多いため、あまり俺の設定を信用しないほうが良いと思う。
後日ちゃんと調べて記事にするのでご期待頂きたく。
これでMySQLの設定は完了。次にデータベースのセットアップを行う。
セットアップに先立って、起動と自動起動の設定を行う。
# service mysqld start
# chkconfig mysqld on

MySQLが無事に起動したら、以下の初期化コマンドを実行する。
# mysql_secure_installation
「Set root password? [Y/n]」と効かれたら、MySQLのrootのパスワードを2回入力する。
それまでは空EnterでOK。

上記コマンドで初期化が終わったら、今度はMySQLの一般ユーザを作る。
通常、こちらのユーザでMySQLに接続するようにする。

一旦rootでMySQLにログインし、grantコマンドでユーザを作る。
今回作る一般ユーザは
IDが「dbuser」
PSが「dbpass」
ということにする。
# mysql -uroot -p
初期化時に設定したrootのパスワードを入力してログイン
mysql> grant all privileges on *.* to dbuser@localhost identified by 'dbpass';
mysql> exit

これでMySQLのセットアップはOK。

■Postfixの設定

さてPostfixの設定を行おう。基本的にはただ単純に、SendmailからPostfixへ切り替えるだけなので、それほど大した設定をおこおなうわけではないが、念の為、本番サーバでも通用するような設定項目もあえて記述しておくことにする。

とにかく開発環境と本番サーバが似ていれば似ているほど、定時に帰って立ち飲み屋でいっぱい引っ掛けるプレイが可能となる。

では早速設定してみよう。
# vi /etc/postfix/main.cf
項目名設定内容説明
myhostnamemail.torhamzedd.comホスト名にmail.をつけておく
mydomaintorhamzedd.comドメイン名。ホスト名と同じで良い
myorigin$mydomain@mail.torhamzedd.comではなく@torhamzedd.comにするため、mydomainを指定する
inet_interfacesall待ち受けるネットワークインタフェース全部を指定
mydestination$myhostname, localhost.$mydomain, localhost, $mydomainローカルで受信するドメイン名を指定
mynetworks192.168.1.0/24, 127.0.0.0/8許可しているIPアドレス
relay_domains$mydestination中継を許可するドメイン
home_mailboxMaildir/メールボックスの種類
header_checksregexp:/etc/postfix/header_checksReceived行を削除
smtpd_banner$myhostname ESMTP unknownMTAの隠蔽
smtpd_client_restrictionspermit_mynetworks, reject_rbl_client relays.ordb.org, permitSPAM対策(追記する)
smtpd_sasl_auth_enableyesSMTP-AUTH設定(追記する)
smtpd_sasl_local_domain$myhostnameSMTP-AUTH設定(追記する)
smtpd_recipient_restrictionspermit_mynetworks, permit_sasl_authenticated, reject_unauth_destinationSMTP-AUTH設定(追記する)
smtpd_recipient_limit101送信における宛先人数制限(SPAM踏み台対策)この場合10人まで
mailbox_size_limit104857600メールボックスの容量制限。この場合100MB(1024×1024×100
message_size_limit10485760メール1通の容量制限。この場合10MB(1024×1024×10

(※)この部分に関しては別のファイルになるので、そちらで編集する必要がある。
# vi /etc/postfix/header_checks
このファイルの最終行に、以下の1行を追記する。
/^Received:/ IGNORE

これで基本設定はOKだ。
あとはユーザディレクトリ作成時のテンプレートとなるskel内に、メール用のディレクトリを設置するようにしておく。
# mkdir -p /etc/skel/Maildir/{new,cur,tmp}
# chmod -R 700 /etc/skel/Maildir/
これで新規ユーザのホームディレクトリには自動的にMaildir以下が作成される。

設定は以上なので、Postfixを起動する。
# service sendmail stop
# chkconfig sendmail off

しかし現状、Sendmailが優先してしまっていると思うので、専用コマンドで入れ替えることにする。
# alternatives --config mta
2 プログラムがあり 'mta' を提供します。

  選択       コマンド
-----------------------------------------------
+ 1           /usr/sbin/sendmail.sendmail
  2           /usr/sbin/sendmail.postfix

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:
ここでは2をタイプし、Enterしよう。
これでPostfixの設定はOKだ。

試しに以下のコマンドで受信可能なメールアドレスにメールを送信してみよう。
ここではyou@example.comにメールを送信することとする。
# mail you@example.com
Subject: <件名を入力する>
<本文を入力する>
<終了するときは「.」のみの行で改行する>

■BINDの設定

おまちかねのBINDの設定だ。

これさえやっておけば、いつでもどこでもノマドなコ・ワーキング且つ、自分がいる場所がデモ会場となる。素晴らしすぎて屁で空が飛べる可能性も高くなるというものだ。

俺のように全部一人でやらされている人は別として、ちゃんと他者とコラボしている人なら作業効率アップしまくって、そのうちエラ呼吸ができるようになるのかもしれない。


閑話休題。
早速設定してみよう。

まずは事前準備として、chroot対策ファイルコピーシェルを作成し、1度だけ実行しておく。
# vi bind-chroot-admin

ファイルの中身はこちら。
#!/bin/sh

# bind-chroot install check
rpm -q bind-chroot > /dev/null 2>&1
[ $? -ne 0 ] && echo bind-chroot not install && exit 1

# bind-chroot enabled
sed -i '/^ROOTDIR=/d' /etc/sysconfig/named
echo ROOTDIR=/var/named/chroot >> /etc/sysconfig/named

# file copy
filelist=`mktemp`
rpm -ql bind|grep ^/etc >> ${filelist}
rpm -ql bind|grep ^/var >> ${filelist}
for file in `cat ${filelist}`
do
  # directory make
  if [ -d ${file} ]; then
      DIRNAME=/var/named/chroot${file}
      [ ! -d ${DIRNAME} ] && mkdir -p ${DIRNAME}
  fi
  # file copy
  if [ -f ${file} ]; then
      DIRNAME=/var/named/chroot`dirname ${file}`
      [ ! -d ${DIRNAME} ] && mkdir -p ${DIRNAME}
      /bin/cp -a ${file} ${DIRNAME}
  fi
done
rm -f ${filelist}

chown named:named /var/named/chroot/var/named/data
chmod 770 /var/named/chroot/var/named/data
chown named:named /var/named/chroot/var/named/dynamic

exit
※【参考】http://fedorasrv.com/bind.shtml

作成したら実行する。
# sh bind-chroot-admin

これで、chrootが入っているかいないかにかかわらず、適切なファイルコピー処理がされた。
事前準備はこれで終わり。このファイルは消してしまっても構わない。

次の処理は、BINDの設定ファイルの編集、ゾーンファイルの作成の2個になる。
まずはBINDの設定ファイルの編集だ。
# vi /var/named/chroot/etc/named.conf
設定ファイルを開くと、最終行に以下のような行があると思う。
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
この記述の上に、以下のようにゾーンファイル読み込みの設定を記述する。
zone "torhamzedd.com" IN {
     type master;
     file "torhamzedd.com.zone";
};
zone "0.0.127.in-addr.arpa" IN {
     type master;
     file "torhamzedd.com.rev";
};
これは何をしているのかというと、
  • torhamzedd.comでアクセスされたら「torhamzedd.com.zone」を見ておくれやす
  • 127.0.0.1やlocalhostでアクセスされたら「torhamzedd.com.rev」を見ておくれやす
ということだ。

ちなみに前者を正引き(せいびき)、後者を逆引きと呼ぶ。
これで設定ファイルは完了。

次に正引き逆引きのゾーンファイルを作成する。
まずは正引きファイルを作成だ。
# vi /var/named/chroot/var/named/torhamzedd.com.zone
$TTL    86400
@       IN      SOA     torhamzedd.com. root.torhamzedd.com. (
        2011062601      ;       serial
        28800           ;       refresh
        14400           ;       retry
        3600000         ;       expire
        86400           ;       minimum
)
                IN      NS              torhamzedd.com.
                IN      MX      10      mail.torhamzedd.com.
@               IN      A               127.0.0.1
*               IN      A               127.0.0.1
これは何をしているのかというと、
  • DNSはtorhamzedd.comだよ
  • メールサーバはmail.torhamzedd.comだよ
  • IPアドレスは127.0.0.1だよ
ということを設定している。

つまり、ブラウザでtorhamzedd.comというドメインにアクセスした場合、必ず127.0.0.1、つまり自分自身にアクセスしてくれるということだ。
更にワイルドカードで「*」をつけたため、例えばaaa.torhamzedd.comでもbbb.torhamzedd.comでもOKというこの素晴らしさ。

さて次は逆引きのゾーンファイルを作ろう。
# vi /var/named/chroot/var/named/torhamzedd.com.rev
$TTL    86400
@       IN      SOA     torhamzedd.com. root.torhamzedd.com. (
        2011062601      ;       serial
        28800           ;       refresh
        14400           ;       retry
        3600000         ;       expire
        86400           ;       minimum
)
                IN      NS      torhamzedd.com.
                IN      PTR     torhamzedd.com.
ここでは何をやっているのかというと、127.0.0.1やlocalhostでアクセスされた場合、それはtorhamzedd.comでおますよ、ということを設定している。ただ、それだけだ。

通常、自分自身のIPアドレスの4オクテット目をPTRレコードに記述するが、書いてしまうとそのIPアドレスでないと動かなくなるので、ここでは何も指定していない。

というわけで、これでBINDの準備が揃ったが、そもそも自分自身に対して、自分自身のBINDを優先的に使えという指示を出さないといけない。つまりリゾルバだ。

リゾルバに自分自身のDNSであるBINDを指定し、その後に外部のDNSなどを指定すれば、torhamzedd.comは必ず自分のマシンを見て、それ以外は外部のDNSを見てくれるようになる。

というわけでリゾルバの設定は以下のようにする。
# vi /etc/resolv.conf
search torhamzedd.com
nameserver=127.0.0.1
nameserver=<プロバイダのDNSなど>
nameserver=<プロバイダのDNSなど>
・・・
ついでにネットワークインタフェースの設定ファイルにも書いておく。
使っているマシンのNICが1枚なら、以下の場所に設定ファイルがおいてある。
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
こちらもDNS1を127.0.0.1にして保存すればOKだ。
ネットワークインタフェースの編集をしたら、ネットワークの再起動が必要になるので、以下のコマンドでネットワークを再起動しよう。
# service network restart
これで準備完了。

ようやくBINDの全設定が終わったので、起動し、自動起動の設定も済ませておく。
# service named start
# chkconfig named on

これで今日からあなたのマシンはデモ環境機能を備えた最強マシンとなった。

Linuxのhostsファイルは、Windowsのように同じIPを複数行に書くことができないので、1行がべらぼうに長くなる。それに同じドメインでサブドメインが複数ある場合なんか、更に面倒くさくなる。

しかし安心されよ!もうそのアホみたいな作業からは開放されたばい!!
別のドメイン使いたかったら、設定ファイルに追加した内容をドメイン分ふやし、ゾーンファイルもドメイン分増やせば良い!!

はい今終わった!
今hostsファイルいじる作業永遠に終わったよ!

早速街へ繰り出し、洒落&乙なカフェバーにでもドヤ顔で入店後、周りの人に見えるようにデモを行うと寝覚め通いと思われる。

■次回は?

次回は、NetBeansやRegexxerなどの、開発時に便利なGUIアプリを紹介する予定だ。