ドキュメント > FreeBSDのWebサーバ化

FreeBSDのWebサーバ化

私ははなまるの讃岐うどんが好物なのですが、FreeBSDのインストール直後はちょうどかけうどんと同じ状態です。トッピング次第でどんなうどんにも生まれ変わります。ここではFreeBSDをWebサーバにする調理法を紹介します。

インストールするプログラム

単なるWebサーバならば、Apacheだけ走らせればこと足ります。さらにCGIを動かしたければPerlやPHP、データベースと連携したければMySQLなど、必要なものを追加していきます。

ツール ports
Perl lang/perl5.8
Apache www/apache22
PHP lang/php5
MySQL databases/mysql50-server

Perlのインストール

私が初めて学んだプログラミング言語はPerlなので、いつも最初にPerlを入れることにしています。ただしそういう理由がなくても、portsにはmakeするときにPerlが必要になるものがけっこうあるので、最初に入れておくとよいでしょう。

> cd /usr/ports/lang/perl5.8
> sudo make install clean

Apacheのインストール

WebサーバといえばApacheのことを指すと言っても過言ではないほど、世界中で使われているのがApacheです。いくつかのバージョンがありますが、公式サイトでは最新安定版を使うことが推奨されています。2008年5月現在、最新安定版はApache 2.2.8です。

> cd /usr/ports/www/apache22
> sudo make install clean

インストールオプションは特に設定しなくても大丈夫です。もし後になって足りない機能に気が付いたときはいったんdeinstallして、/var/db/ports/apache22/optionsファイルでオプションを設定してから再度makeしましょう。なお、再びオプション選択画面を出したければ、optionsファイルを削除します。

> cd /usr/ports/www/apache22
> sudo make deinstall
> sudo rm /var/db/ports/apache22/options
> sudo make install clean

Apacheには依存プログラムが多いのでmakeに時間がかかります。流れる文字を眺めながらコーヒーを飲むなど、気長に待つのがコツです。

インストールが終わったらさっそく起動してみましょう。

> rehash
> sudo apachectl start

エラーメッセージ「Failed to enable the 'httpready' Accept Filter」が出た場合は、/boot/loader.confに次の一行を付け加えます。

accf_http_load="YES"

ブラウザからサーバのIPアドレス(http://192.168.1.3など)にアクセスして「It works!」と表示されれば成功です。次回OS起動以降にApacheを自動起動させるには、/etc/rc.confファイルに次の一行を加えます。

apache22_enable="YES"

Apacheの設定ファイルはhttpd.confです。巨大なファイルですが、とりあえず覚えておくべきキーワードは次の3つです。

DocumentRoot
公開するディレクトリ
ExecCGI
CGIの実行を許可するオプション
AddHandler
拡張子とファイルタイプの関連付け

デフォルトではセキュリティ上の理由で/usr/local/etc/apache22/cgi-binディレクトリのみでCGIの実行を許可するように設定されています。しかし、普通に使う分にはこの制約は邪魔なので、全ディレクトリでCGIの実行を許可したほうが快適に使えます。

DocumentRootを/usr/local/www/sitesに変更してCGIの実行を許可するには、次のようにhttpd.confを書き換えます。左の数字は行数の目安です。

> cd /usr/local/etc/apache22/
> sudo cp -p httpd.conf httpd.conf.orig
> sudo vi httpd.conf

154 DocumentRoot "/usr/local/www/sites"
180 <Directory "/usr/local/www/sites">
193     Options Indexes FollowSymLinks ExecCGI
367     AddHandler cgi-script .cgi

httpd.confを編集したら、文法が間違っていないかconfigtestでチェックしてからrestartしましょう。次の例では、公開ディレクトリ/usr/local/www/sitesを作成してstaffメンバーに編集を許可しています。

> cd /usr/local/www
> sudo mkdir sites
> sudo chmod 775 sites
> sudo chgrp staff sites
> cp apache22/data/index.html sites/
> cp apache22/cgi-bin/printenv sites/printenv.cgi
> chmod 755 sites/printenv.cgi
> sudo apachectl configtest
Syntax OK
> sudo apachectl restart

ブラウザからindex.htmlとprintenv.cgiにアクセスして適切に表示されれば成功です。

PHPのインストール

Perlと並んでCGIによく使われるPHPを入れておきます。CMSのWordPressを使う場合にも必要になります。

make時にAPACHEオプションを付けてください。なお、MULTIBYTEオプションを付けるとShift_JISでPHPコードを書けるようになります。

> cd /usr/ports/lang/php5
> sudo make install clean

[X] APACHE     Build Apache module

PHPの設定ファイルは、php.iniです。

> cd /usr/local/etc
> sudo cp -p php.ini-dist php.ini

ApacheとPHPを連携させるには、httpd.confに次のIfModuleブロックを追加します。最終行あたりに追加すると後で見つけやすくなると思います。

<IfModule php5_module>
    # If php is turned on, we respect .php and .phps files.
    AddType application/x-httpd-php .php .phtml
    AddType application/x-httpd-php-source .phps

    # Since most users will want index.php to work we
    # also automatically enable index.php
    <IfModule dir_module>
        DirectoryIndex index.html index.php
    </IfModule>
</IfModule>

PHPが正常に動作するかテストしてみましょう。phpinfo.phpファイルを作成して、次の一行を書き込みます。

<?php phpinfo(); ?>

ブラウザからアクセスして正常に表示されるか確認してください。

MySQLのインストール

DBMSはMySQLのほかにもPostgreSQLSQLiteなどがあります。いずれも必要十分の性能なので、好みで選ぶとよいと思います。私は、なんとなくドキュメント類がほかよりも充実していそうなのでMySQLを使っています。

> cd /usr/ports/databases/mysql50-server
> sudo make install clean

MySQLの設定ファイルmy.cnfを/etcにコピーします。my-small.cnfは小規模データベース用のセッティングになっています。

> sudo cp /usr/local/share/mysql/my-small.cnf /etc/my.cnf

文字コードをutf8で統一するために、my.cnfの[mysqld]、[mysqldump]、[mysql]ブロックに次の一行を加えます。

[mysqld]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

[mysql]
default-character-set=utf8
# 変更前
mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | latin1 |
| character_set_connection | latin1 |
| character_set_database   | latin1 |
| character_set_filesystem | binary |
| character_set_results    | latin1 |
| character_set_server     | latin1 |
| character_set_system     | utf8   |
+--------------------------+--------+
7 rows in set (0.02 sec)

# 変更後
mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | utf8                             |
| character_set_connection | utf8                             |
| character_set_database   | utf8                             |
| character_set_filesystem | binary                           |
| character_set_results    | utf8                             |
| character_set_server     | utf8                             |
| character_set_system     | utf8                             |
| character_sets_dir       | /usr/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.02 sec)

新規データベースをインストールします。データベースを作り直したいときは、/var/db/mysqlを削除して、再度データベースをインストールします。

> sudo mysql_install_db --user=mysql

MySQLサーバを起動します。&記号でバックグラウンドジョブにするとき、直前にlsコマンドでパスワードを入力しておくと、mysqld_safeコマンドのときにパスワードを入力する必要がなくなりうまくいきます。

> sudo ls
Password:
> sudo mysqld_safe --user=mysql &

MySQL管理者のパスワードを設定します。

> mysqladmin -u root password "yourpassword"

初期のデータベースには不要なユーザとデータベースが含まれているので削除してしまいます。mysql.userテーブルを表示して、不要なユーザをとデータベースをDROPコマンドで消します。次の出力サンプルはドメインame.poturi.comで運用しているサーバの例です。

> mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.51a FreeBSD port: mysql-server-5.0.51a

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> SELECT user,host FROM mysql.user;
+------+----------------+
| user | host           |
+------+----------------+
| root | 127.0.0.1      |
|      | ame.poturi.com |
| root | ame.poturi.com |
|      | localhost      |
| root | localhost      |
+------+----------------+
5 rows in set (0.00 sec)

mysql> DROP USER ''@ame.poturi.com;
mysql> DROP USER ''@localhost;
mysql> DROP USER 'root'@ame.poturi.com;
mysql> SELECT user,host FROM mysql.user;
+------+-----------+
| user | host      |
+------+-----------+
| root | 127.0.0.1 |
| root | localhost |
+------+-----------+
2 rows in set (0.00 sec)

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.00 sec)

mysql> DROP DATABASE test;
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
+--------------------+
2 rows in set (0.00 sec)

mysql> exit
Bye

MySQLを自動起動するには、/etc/rc.confに次の一行を加えます。

mysql_enable="YES"

MySQLの詳細についてはリファレンスマニュアルを参照してください。