Mac に VirtualBox で CentOS でサーバーを構築して効率よく Web サイトを開発する環境を整えるまでの作業まとめ

Mac のローカル環境で制作をしていましたが、開発環境の調整などがし辛かったので、VirtualBox を使って以下のような環境を構築します。

  • ホストOS (Mac) の ~/Sites フォルダをゲストOS (CentOS) の /var/www 以下にマウントして制作データは基本的に Mac に置いておくのにチャレンジ
  • ホストOSから SSH でゲストOSに接続して作業できるようにする
  • ゲストOSの ~/Sites フォルダをマウントしての作業がし辛い時に備えて rsync と SSH によるデータの同期もできるようにしておく
  • ゲストOSから PHP の mail() 関数などでメールが送れるようにする

VirtualBox のインストール

以下のページが参考にして以前、私は Windows をインストールしました。VirtualBox をインストールしていない人はこのページを参考にしてみてください。
MacとWindowsを同時使用できる無料の仮想化ソフト「VirtualBox」の使い方 / Inforati

CentOS をダウンロードする

以下のページから CentOS-5.6-i386-bin-DVD.iso をダウンロードします。
isoredirect.centos.org/centos/5/isos/i386/

CentOS をインストールする

OS は Linux でバージョンを Redhat で仮想マシンを作る

後で気付きましたが64bitにしておけば良かったと思ってそうしました。ここでは32bit版をダウンロードできるページを紹介していますので、人によってはダウンロードするファイルを変えてください。

CentOS をインストールする

以下のページがスクリーンショット付きでインストール方法が解説されていますのでお世話になりました。分からない人は参考にしてみてください。

Mac から VirtualBox の CentOS を認識できない

サーバーやパソコンが存在するのか調べるために ping を発射して確かめる癖があるのですが、この調べ方は一般的でしょうか。以下のようにして存在を調べてみても見つかりません。

1
ping 10.0.2.15

それについて困っていたら Twitter で昔からお世話になってる人に答えを教えてもらいました。どうやら VirtualBox のゲストのネットワーク設定でホストオンリーにすれば良いそうです。

でもホストオンリーはホストマシンとゲストマシンの2点間接続。NATがなければどこにも出られないらしいです。そのため以下のようにしてNATも使えるようにしておくみたいです。ちょっと微妙なので間違ってたら教えてください。

これでローカルから仮想環境に接続もできますし、仮想環境から外部に接続できました。また後で見つけたサイトですが、このページに詳しく解説がしてありましたので参考にしてみてください。
VirtualBox 2.2 と CentOS 5.3 でローカル開発環境 – もやし日記

仮想の CentOS から Mac のファイルにアクセスさせる

仮想の CentOS から Mac の .bashrc などを参照したいと思いました。そのためには Guest Additions というものをインストールしなければいけません。Windows の場合は結構簡単にインストールできたんですが、CentOS だといろいろやらないといけない感じです。

gcc, make, kernel-devel が必要だということなので、以下のようにインストールします。

1
2
3
yum install gcc
yum install make
yum install kernel-devel

その次にデバイスから「Guest Additions のインストール」を選択することで CD が挿入されたことになりますので、以下のようにして CD をマウントします。

1
2
mkdir /mnt/cdrom
mount -r /dev/cdrom /mnt/cdrom

そして以下のようにインストーラーを起動します。

1
2
cd /mnt/cdrom
sh VBoxLinuxAdditions.run

すると以下のようにエラーが発生。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Removing existing VirtualBox DKMS kernel modules           [  OK  ]
Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
The headers for the current running kernel were not found. If the following
module compilation fails then this could be the reason.
The missing package can be probably installed with
yum install kernel-devel-2.6.18-238.el5
                                                           [失敗]
Your system does not seem to be set up to build kernel modules.
Look at /var/log/vboxadd-install.log to find out what went wrong.
Once you have corrected it, you can run
 
  /etc/init.d/vboxadd setup
 
to build them.
 
Doing non-kernel setup of the Guest Additions              [  OK  ]

言われたとおりに kernel-devel-2.6.18-238.el5 をインストールします。

1
yum install kernel-devel-2.6.18-238.el5

そしてもう一度以下のコマンドを実行。

1
sh VBoxLinuxAdditions.run

すると以下のような感じで上手くいくけど一番下で失敗。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Verifying archive integrity... All good.
Uncompressing VirtualBox 4.0.8 Guest Additions for Linux.........
VirtualBox Guest Additions installer
Removing installed version 4.0.8 of VirtualBox Guest Additions...
Removing existing VirtualBox DKMS kernel modules           [  OK  ]
Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
Your guest system does not seem to have sufficient OpenGL support to enable
accelerated 3D effects (this requires Linux 2.6.27 or later in the guest
system).  This Guest Additions feature will be disabled.
 
 
Building the main Guest Additions module                   [  OK  ]
Building the shared folder support module                  [  OK  ]
Doing non-kernel setup of the Guest Additions              [  OK  ]
Starting the VirtualBox Guest Additions                    [  OK  ]
Installing the Window System drivers                       [失敗]
(Could not find the X.Org or XFree86 Window System.)

でも再起動してから共有設定を確認しようとしたらエラーが出ませんでした。これで一応 Guest Additions のインストールには成功しているようです。あとは以下のようにマウントするだけです。share のところは共有名に置き換えてください。

1
2
mkdir /mnt/share
mount -t vboxsf share /mnt/share

これでマウントができます。今後再起動した時に自動的にマウントされるように設定します。

1
vi /etc/rc.local

一番下に一行先ほどのコマンドを追加します。

1
2
3
4
5
6
7
8
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
 
touch /var/lock/subsys/local
mount -t vboxsf share /mnt/share

アンマウントする場合は以下のコマンドです。

1
umount - f /mnt/cdrom

以下の記事が参考になりました。

LAMP 環境を構築する

CentOS の設定については以下のページで以前解説しています。ここを参考にしてみてください。
はじめてのさくら VPS + CentOS の初期設定からチューニングなどの作業まとめ

ゲスト OS でApache が起動できない

バーチャルホストもしっかり設定しているのにアクセスできない。restart してるのに。reboot してから Apache を起動してみることにしました。この辺りは眠くてあんまり記憶がありません。

1
/etc/init.d/httpd start

ところが以下のようなエラーが発生。

1
2
httpd を起動中: (13)Permission denied: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down

80番ポートを誰かが使っているのかと思ったので以下のコマンドで調査。

1
2
su -
lsof -i:80

UNIX的なアレ:gihyo.jp出張所:第6回 知っておきたいApacheの基礎知識 その2|gihyo.jp … 技術評論社

しかし特に使われているわけではないようです。

あ、sudo が抜けてた。

1
sudo /etc/init.d/httpd start

バーチャルホストを設定しても何故かアクセスできない

そもそもバーチャルホストが設定されているのかを以下のコマンドで確認できることを知りました。

1
sudo /usr/sbin/httpd -S

くわぞうメモ: バーチャルホストの設定を確認する方法

しかし問題はありません。reboot してみてなんとなくファイアウォールに問題があるのではないかと予測。

1
sudo vim /etc/sysconfig/iptables

以下のようにしました。変更点としては80番ポートの許可のみです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 80  -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

これでも接続できないと困っていたらなぜか Apache が起動していませんでした。Apache を起動したら見ることができました。

制作フォルダをドキュメントルートとかにマウントする

先ほど紹介したマウント方法では所有者が root になってしまうので使い勝手が悪いです。そのため所有者を任意のユーザーに変更してファイルをマウント出来る方法を探すことにしましたところ、以下の方法でできるようです。

1
sudo mount -t vboxsf sites /var/www -o uid=hoge,gid=hoge

以下のページが大変参考になりました。
仮想化された日々:仮想化のススメ(6) ゲスト-ホストOS間でファイル共有 – livedoor Blog(ブログ)

また、開発する場合は Mac 側で NFS で export しちゃって、サーバ側でマウントすればサーバを別マシンにした時にも即座に対応できるから良いらしいです。以下のページが参考になるそうです。
MacOS X で NFSサーバーを構築する – profaim.jp

デフォルトでは Apache が自動で起動しなかった

自動で起動しなかったので以下のようにして自動起動するように設定。

1
2
su -
chkconfig httpd on

これで起動できるようになります。ちなみに自動起動に設定されているかは以下のコマンドで調べることができます。

1
chkconfig --list

以下のページが参考になりました。
Linux電源ONで自動起動する設定

ホストOSとゲストOSという用語について

いろいろと調べてるうちにこういう用語があることを知りました。便利な言葉ですね。初心者で申し訳ありません…(汗)
ゲストOSとは【guest OS】 – 意味/解説/説明/定義 : IT用語辞典

rsync によるファイルの同期

ホストOSの制作データをマウントするという方法を先ほど紹介しましたが、他の方が rsync でファイルを同期すると言っていたので書いておきました。これを使っても同じことが実現できます。

1
rsync -avuz --delete -e ssh /Users/hoge/Sites/ hoge@example.com:/var/www > /Users/hoge/log/rsync.log

その変わりローカルに変更を加えたらスクリプトを毎回実行しなければいけませんが、何か方法があるかもしれませんね。今までは FTPS や SFTP を使ってファイルのやり取りなどをしていましたが、これからはこのコードで簡単にローカルの変更ファイルだけをサーバーにアップロードすることができますね。

また定期的にサーバーのファイルをローカルに簡単バックアップできますね。自動化することもできるかもしれませんが、こういうのは昔の失敗からなるべく手動でやるようにすることにします。

バーチャルホストの設定をしてなかった

ここに来てバーチャルホストを有効にするのを忘れていて以下のようなエラーが出ていました。

[Mon Jun 06 22:20:33 2011] [warn] _default_ VirtualHost overlap on port 80, the first has precedence
[Mon Jun 06 22:20:33 2011] [warn] _default_ VirtualHost overlap on port 80, the first has precedence

なので httpd.conf の以下の行を。

1
#NameVirtualHost *:80

以下のようにコメントアウト外します。

1
NameVirtualHost *:80

基本的にはセットアップの時にいつも外していたので、見たことないエラーで驚きました。最初の一つ目のバーチャルホストは設定できますが、それ以降の設定はエラーになるようです。ちょっとここは自信ないですがメモ。

CentOS からメールが送れるようにする

この部分には9時間程度かかりました。おそらくこれで良いだろうという設定方法を紹介します。

Postfix をまずインストールする。

1
um -y install postfix

以下のファイルを作ります。

1
sudo vi /etc/postfix/sasl_passwd

今回は Gmail の SMTP からメールを送信します。

1
smtp.gmail.com:587 [ユーザ名]@gmail.com:[パスワード]

以下のコマンドで sasl_passwd.db を生成します。

1
sudo postmap /etc/postfix/sasl_passwd

その後以下のコマンドでさっきのファイルを消します。

1
sudo rm /etc/postfix/sasl_passwd

次に my.conf ファイルを編集します。

1
sudo vi /etc/postfix/main.cf

以下のように書きます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Minimum Postfix-specific configurations.
mydomain_fallback = localhost
mail_owner = [存在するユーザー]
setgid_group = postdrop
relayhost=smtp.gmail.com:587
 
# Enable SASL authentication in the Postfix SMTP client.
smtp_sasl_auth_enable=yes
smtp_sasl_password_maps=hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options=
 
# Enable Transport Layer Security (TLS), i.e. SSL.
smtp_use_tls=yes
smtp_tls_security_level=encrypt
tls_random_source=dev:/dev/urandom

mail_owner は存在するユーザーを setgid_group は postdrop を設定します。それ以外のグループを設定すると postfix を起動する時に以下のようなエラーが発生します。グループが最初から postdrop なのだからだと思われます。

1
2
3
4
/usr/sbin/postfix start
postfix/postfix-script: warning: not owned by group postfix: /usr/sbin/postqueue
postfix/postfix-script: warning: not owned by group postfix: /usr/sbin/postdrop
postfix/postfix-script: starting the Postfix mail system

そして postdrop にしても私の環境では postdrop を設定しても以下のエラーが発生します。このままでもメールは送信できますが、気持が悪いのでエラーの対応をします。

1
2
3
4
/usr/sbin/postfix start
postfix/postfix-script: warning: not owned by group postdrop: /var/spool/postfix/public
postfix/postfix-script: warning: not owned by group postdrop: /var/spool/postfix/maildrop
postfix/postfix-script: starting the Postfix mail system

以下のようにしてグループを合わせます。

1
2
chgrp postdrop /var/spool/postfix/maildrop
chgrp postdrop /var/spool/postfix/public

これで以下のように停止して起動すると普通に起動できました。

1
2
3
4
/usr/sbin/postfix stop
postfix/postfix-script: stopping the Postfix mail system
/usr/sbin/postfix start
postfix/postfix-script: starting the Postfix mail system

PHP でメール送信できれば良いので以下のコマンドを実行。これでメールが送信されると思います。

1
php -r "mail('送信先メールアドレス', 'Test Subject', 'Test Body');"

以下のページを参考にさせて頂きました。

静的コンテンツがおかしな挙動をする

Mac のローカルにあったディレクトリを CentOS のドキュメントルートにマウントして、作業は Mac、動かすのは CentOS というような構成にしています。ただ、style.css などの CSS ファイルを Mac 側で更新してもブラウザでファイルが更新されていません。CentOS の vi で style.css を見に行くとファイルは編集されています。

この状態での反映の仕方は以下の2つ。

  • ディレクトリのマウントをし直す
  • style.cssをviで開いて上書き保存

わざわざこのようにして反映させるのは辛いので困っていたら Twitter で記事を紹介してもらいました。EnableSendfile ディレクティブを off にすれば反映されるようになります。

1
EnableSendfile Off

以下の記事が大変参考になりました。

コメント

コメントは受け付けていません。