アットウィキロゴ

CentOS > LAMP環境構築


CentOS/LAMP環境構築 [#daaee5a2]


ここでは、ゲストOS(CentOS)上に、LAMP環境を構築する手順を説明します。(スクリプト言語はPHPです。)

インストールは、全てyumを使用しますので、特定のバージョンやコンパイルオプションが必要な場合は、rpmやソースからインストールして下さい。



Apache [#h14e7d79]


Apacheをインストールします。Apacheデーモンの名前はapached、なら分かりやすいのですが、歴史的な理由?によりhttpdとなっています。
# yum install httpd

インストールされたか確認します。
# yum list installed | grep -i httpd
  httpd.i386                                2.2.3-22.el5.centos.2        installed
インストールされました。

それでは、Apacheを起動してみます。
# /etc/init.d/httpd start
  httpd を起動中: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                             [  OK  ]

起動しました。が、ServerNameで、警告が出ているようです。
とりあえず、ServerNameをlocalhostと指定します。yumインストールの場合、設定ファイルは/etc/httpd/conf/httpd.confです。
# vi /etc/httpd/conf/httpd.conf

#ServerName www.example.com:80
   ↓
ServerName localhost

では、Apacheを再起動します。
# /etc/init.d/httpd restart
  httpd を停止中:                                            [  OK  ]
  httpd を起動中:                                            [  OK  ]

ついでに、OS起動時に自動起動する設定も行います。
# chkconfig httpd on
# chkconfig --list | grep httpd
  httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off

それでは、ホスト(Window)側から、ブラウザでアクセスしてみましょう。
URLにIPアドレスかホスト名を指定します。
IPアドレスの例)http://192.168.247.136/
ホスト名の例)http://centos/

Apache 2 Test Pageというタイトルのページが表示されましたでしょうか?
うまくいかない場合、HTTPで利用される80番ポートがファイアーウォールで遮断されている可能性があります。ここでは、system-config-securitylevelツールでファイアーウォールの設定を行います。

# system-config-securitylevel
まず、Customizeを選択してEnter。次に、WWW(HTTP)を選択(Spaceキー)してOK。再度OKで、設定完了です。

念のため、設定ができているか確認しましょう。
# cat /etc/sysconfig/iptables
 (略)
  -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
 (略)

さて、自宅マシンで開発環境を構築するといった用途であれば、毎回ファイアーウォールの設定に煩わされるのも何ですので、落としてしまうというのもありでしょう。
# /etc/init.d/iptables stop
  ファイアウォールルールを適用中:                            [  OK  ]
  チェインポリシーを ACCEPT に設定中filter                   [  OK  ]
  iptables モジュールを取り外し中                            [  OK  ]

自動起動からも除外します。
# chkconfig iptables off
# chkconfig --list | grep iptables
  iptables        0:off   1:off   2:off   3:off   4:off   5:off   6:off

それでは、もう一度、ブラウザからアクセスしてみましょう。

では、実際にHTMLを作成して確認してみましょう。
まず、ドキュメントルート(Webで公開されるディレクトリ)がどこかを確認します。
ドキュメントルートは設定ファイル(httpd.conf)のDocumentRootの値になります。
# cat /etc/httpd/conf/httpd.conf | grep ^DocumentRoot
  DocumentRoot "/var/www/html"

/var/www/htmlとあります。では、/var/www/html以下にHTMLファイルを作ってみましょう。
# vi /var/www/html/hello.html

<h1>Hello Apache!!</h1>

ではブラウザからアクセスしてみます。
IPアドレスの例)http://192.168.247.136/hello.html
ホスト名の例)http://centos/hello.html



PHP [#b7abdf88]


次にPHPをインストールしますが、yumでインストールできるPHPモジュールはたくさんあります。以下のコマンドでリストアップしてみます。
# yum list php-*
  Loaded plugins: fastestmirror
  Loading mirror speeds from cached hostfile
   * base: ftp.yz.yamagata-u.ac.jp
   * updates: ftp.yz.yamagata-u.ac.jp
   * addons: ftp.yz.yamagata-u.ac.jp
   * extras: ftp.yz.yamagata-u.ac.jp
  Available Packages
  php.i386                                5.1.6-23.2.el5_3            updates
  php-bcmath.i386                         5.1.6-23.2.el5_3            updates
  php-cli.i386                            5.1.6-23.2.el5_3            updates
  php-common.i386                         5.1.6-23.2.el5_3            updates
  php-dba.i386                            5.1.6-23.2.el5_3            updates
  php-dbase.i386                          5.1.6-15.el5.centos.1       extras
  php-devel.i386                          5.1.6-23.2.el5_3            updates
  php-gd.i386                             5.1.6-23.2.el5_3            updates
  php-imap.i386                           5.1.6-23.2.el5_3            updates
  php-ldap.i386                           5.1.6-23.2.el5_3            updates
  php-mbstring.i386                       5.1.6-23.2.el5_3            updates
  php-mcrypt.i386                         5.1.6-15.el5.centos.1       extras
  php-mhash.i386                          5.1.6-15.el5.centos.1       extras
  php-mssql.i386                          5.1.6-15.el5.centos.1       extras
  php-mysql.i386                          5.1.6-23.2.el5_3            updates
  php-ncurses.i386                        5.1.6-23.2.el5_3            updates
  php-odbc.i386                           5.1.6-23.2.el5_3            updates
  php-pdo.i386                            5.1.6-23.2.el5_3            updates
  php-pear.noarch                         1:1.4.9-4.el5.1             base
  php-pear-Auth-SASL.noarch               1.0.2-4.el5.centos          extras
  php-pear-DB.noarch                      1.7.13-1.el5.centos         extras
  php-pear-Date.noarch                    1.4.7-2.el5.centos          extras
  php-pear-File.noarch                    1.2.2-1.el5.centos          extras
  php-pear-HTTP-Request.noarch            1.4.2-1.el5.centos          extras
  php-pear-Log.noarch                     1.9.13-1.el5.centos         extras
  php-pear-MDB2.noarch                    2.4.1-2.el5.centos          extras
  php-pear-MDB2-Driver-mysql.noarch       1.4.1-3.el5.centos          extras
  php-pear-Mail.noarch                    1.1.14-1.el5.centos         extras
  php-pear-Mail-Mime.noarch               1.4.0-1.el5.centos          extras
  php-pear-Net-SMTP.noarch                1.2.10-1.el5.centos         extras
  php-pear-Net-Sieve.noarch               1.1.5-2.el5.centos          extras
  php-pear-Net-Socket.noarch              1.0.8-1.el5.centos          extras
  php-pear-Net-URL.noarch                 1.0.15-1.el5.centos         extras
  php-pecl-Fileinfo.i386                  1.0.4-3.el5.centos          extras
  php-pecl-memcache.i386                  2.2.3-1.el5_2               extras
  php-pgsql.i386                          5.1.6-23.2.el5_3            updates
  php-readline.i386                       5.1.6-15.el5.centos.1       extras
  php-snmp.i386                           5.1.6-23.2.el5_3            updates
  php-soap.i386                           5.1.6-23.2.el5_3            updates
  php-tidy.i386                           5.1.6-15.el5.centos.1       extras
  php-xml.i386                            5.1.6-23.2.el5_3            updates
  php-xmlrpc.i386                         5.1.6-23.2.el5_3            updates

ここから、必要なモジュールをインストールしましょう。
ここでは、PHP本体、マルチバイト対応モジュール、MySQLモジュールをインストールします。(他は必要になってからインストールします。)
# yum install php php-mbstring php-mysql

この時、phpの他のライブラリや、perl-DBI、mysqlといったものも同時にインストールされる場合がありますが、これは上記3つのパッケージのインストールに必要なパッケージのため同時にインストールされるためです。Perlが混入していることに驚かないで下さい。

では、インストールされたか確認します。
# yum list installed | grep -i php
  php.i386                                  5.1.6-23.2.el5_3             installed
  php-cli.i386                              5.1.6-23.2.el5_3             installed
  php-common.i386                           5.1.6-23.2.el5_3             installed
  php-mbstring.i386                         5.1.6-23.2.el5_3             installed
  php-mysql.i386                            5.1.6-23.2.el5_3             installed
  php-pdo.i386                              5.1.6-23.2.el5_3             installed

さて、次はPHPデーモンの起動だな、と思われた方。勘が良いです。
が、残念ながらPHPはその必要はありません。PHPは常時起動しておくようなデーモンではなく、Apacheデーモン上から呼び出されて動作するためです*1
とりあえずは、PHPはApacheの拡張言語のようなものと認識しておくとよいかもしれません。(そういった意味では、これからApacheプログラミングをやろうとしているのです!!)

ちなみに、デーモンとは常時起動していろんなことをしてくれる(英語で言うとサーブしてくれる)プログラムで、サービスとも呼ばれます。つまり、デーモン、サービス、サーバーはかなり意味的に近いものです。Linuxが初めての方は、デーモンとは24時間営業のコンビニのようなものと考えておくとよいかもしれません。

では、PHPが実際にインストールされているか確認しましょう。以下のコマンドで、PHPがインストールされていれば、PHPのバージョンを表示できます。
# php -v
  PHP 5.1.6 (cli) (built: Apr  7 2009 08:00:04)
  Copyright (c) 1997-2006 The PHP Group
  Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
うまくインストールされているようです。5.1.6はいささか古いバージョンですが、横着してyumでインストールしているので辛抱しましょう。

では、Apacheのドキュメントルートディレクトリに簡単なPHPスクリプトを作成し、ブラウザから確認してみましょう。拡張子は.phpとします。
# vi /var/www/html/hello.php

<h1><?php echo "Hello PHP!!" ?></h1>

ではブラウザからアクセスしてみます。
IPアドレスの例)http://192.168.247.136/hello.php
ホスト名の例)http://centos/hello.php

さて、どのように表示されたでしょうか?おそらくPHPが実行されず、テキストデータとしてコードそのものが表示されているはずです(何も表示されない場合はHTMLのソースを表示してみてください)。これは、ApacheがPHPを認識できていないためです。

Apache側にPHPスクリプトを動作させる設定を加えます。通常Apacheの設定はhttpd.confで行いますが、yumでPHPをインストールした場合はPHP用の設定ファイルphp.confがconf.dディレクトリ作成されていますので、こちらに設定を行います。
# vi /etc/httpd/conf.d/php.conf

AddType text/html .php
   ↓
AddType application/x-httpd-php .php

また、php5_moduleというApacheモジュールを読み込む設定も必要なのですが、
こちらは、php.conf内にすでに記述されているはずです。
LoadModule php5_module modules/libphp5.so
php.confの存在を知らずに、httpd.confにこの設定を記述してしまうと、モジュールを2度読み込み、Apache起動時に以下の警告が出ますので気をつけましょう。
[warn] module php5_module is already loaded, skipping

それでは、設定を反映させるために、Apacheを再起動します。
# /etc/init.d/httpd restart
  httpd を停止中:                                            [  OK  ]
  httpd を起動中:                                            [  OK  ]

再度、ブラウザからhello.phpを確認してみましょう。

次にPHPの設定を行います。上記のように、特に設定しなくても普通に動作するのですが、ここでは最低限行っておいた方がよい設定だけを抜粋します*2

デフォルトでは設定ファイルは/etc/php.iniにあります。
# vi /etc/php.ini
360行目あたり(エラー報告のレベルを厳密にします)
error_reporting  =  E_ALL
   ↓
error_reporting  =  E_ALL | E_STRICT
エラー報告のレベルが厳密でなければ、間違った書き方や古い書き方をしていても通知されず、バグが混入する確立が増えてしまいます。
すべての警告を表示することは、どの言語であっても、また初心者上級者問わず、必ず行っておくべきことのひとつだと考えます*3

367行目あたり(エラーを表示します)
display_errors = Off
   ↓
display_errors = On
※この設定は、本番運用時にはOffにしなければいけません。

639行目あたり(タイムゾーンの設定をします)
;date.timezone =
   ↓
date.timezone = Asia/Tokyo

1125行目あたり(マルチバイト文字の設定を日本語にします)
;mbstring.language = Japanese
   ↓
mbstring.language = Japanese

1130行目あたり(マルチバイト文字の内部文字コードをUTF8にします)
;mbstring.internal_encoding = EUC-JP
   ↓
mbstring.internal_encoding = UTF-8

設定が完了したら、Apacheを再起動します。
# /etc/init.d/httpd restart



MySQL [#n5e295a1]


MySQLをインストールします。
# yum install mysql mysql-server
※前述のPHPインストールの手順でインストールした場合、「mysql」はすでにインストールされていますが、上記のコマンドで問題ありません。

インストールされてか確認します。
# yum list installed | grep -i mysql
  mysql.i386                                5.0.45-7.el5                 installed
  mysql-server.i386                         5.0.45-7.el5                 installed
  perl-DBD-MySQL.i386                       3.0007-2.el5                 installed
  php-mysql.i386                            5.1.6-23.2.el5_3             installed

次に、MySQLデーモンを起動します。初回のみ、データベースの初期化が行われるので、少し時間がかかります。
# /etc/init.d/mysqld start
  MySQL データベースを初期化中:  Installing MySQL system tables...
  OK
  Filling help tables...
  OK
  
  To start mysqld at boot time you have to copy
  support-files/mysql.server to the right place for your system
  
  PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
  To do so, start the server, then issue the following commands:
  /usr/bin/mysqladmin -u root password 'new-password'
  /usr/bin/mysqladmin -u root -h test01 password 'new-password'
  See the manual for more instructions.
  You can start the MySQL daemon with:
  cd /usr ; /usr/bin/mysqld_safe &
  
  You can test the MySQL daemon with mysql-test-run.pl
  cd mysql-test ; perl mysql-test-run.pl
  
  Please report any problems with the /usr/bin/mysqlbug script!
  
  The latest information about MySQL is available on the web at
  http://www.mysql.com
  Support MySQL by buying support/licenses at http://shop.mysql.com
                                                             [  OK  ]
  MySQL を起動中:                                            [  OK  ]

実際にどのようなプロセスが起動しているのかは、psコマンドで確認することができます。(起動オプションも確認できます。)
# ps aux | grep mysql
  root      8433  0.0  0.1   5420  1148 pts/0    S    03:45   0:00 [↓実際は一行]
    /bin/sh /usr/bin/mysqld_safe
    --datadir=/var/lib/mysql
    --socket=/var/lib/mysql/mysql.sock
    --log-error=/var/log/mysqld.log
    --pid-file=/var/run/mysqld/mysqld.pid
  mysql     8493  0.0  2.3 126120 18536 pts/0    Sl   03:45   0:00 [↓実際は一行]
    /usr/libexec/mysqld
    --basedir=/usr
    --datadir=/var/lib/mysql
    --user=mysql
    --pid-file=/var/run/mysqld/mysqld.pid
    --skip-external-locking
    --socket=/var/lib/mysql/mysql.sock

pstreeを見ると、まず、mysqld_safeが起動され、mysqld_safeからmysqldが起動されているようです。
# pstree

ちなみに、mysqldはmysqlというユーザで起動されています。mysqlというユーザーは作成した覚えがないですが、どうやら自動的に作成されているようです。
# cat /etc/passwd
※ファイル最下部に追加されている。

Apacheと同様、OS起動時に自動起動する設定も行います
# chkconfig mysqld on
# chkconfig --list | grep mysqld 
  httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off

さて、無事、インストール・起動ができました。では実際にデータベース内を見てみたいのですが、どうしたらよいでしょう?
それには、mysqlというツールを利用します。名前がまんまでややこしいですが、実はyum install時のmysqlとはこのツールのことだったのです。

mysqlを起動します。
# mysql
  Welcome to the MySQL monitor.  Commands end with ; or \g.
  Your MySQL connection id is 2
  Server version: 5.0.45 Source distribution
  
  Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

するとmysqlプロンプトが立ち上がります。mysql> は、シェルコマンドでなく、MySQLの命令(例えばSQL等)を入れてくださいという合図です。

例えば、データベースの一覧を見るには、SHOW DATABASES; と入力します。
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.00 sec)

現状では、MySQLにパスワードが設定されていません。ここではlocalhostからrootユーザーによってアクセスされた場合のパスワードを設定します*4
mysql> SET PASSWORD FOR root@localhost=PASSWORD('xxxxx');
Query OK, 0 rows affected (0.00 sec)
※xxxxxの部分は、実際に好きな文字列を入れてください*5

では、一旦mysqlを終了します。
mysql> exit
Bye

次に、先ほどと同様にmysqlを起動してみましょう。
# mysql
  ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
パスワードがないので、アクセスできませんと怒られました。
では、以下のオプションを付けて、mysqlを起動します。
# mysql -u root -p
  Enter password:
パスワードを聞かれますので、先ほど設定したパスワードを入力すると、mysqlプロンプトが起動します*6

では、実際のデータを格納してみましょう。
まずは、lampという名前のデータベースを作成します。
mysql> CREATE DATABASE lamp DEFAULT CHARACTER SET utf8;
  Query OK, 1 row affected (0.00 sec)
作成されたか確認します。
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| lamp               |
| mysql              |
| test               |
+--------------------+
4 rows in set (0.00 sec)

以降、lampデータベースで作業するため、lampデータベースに移動します。これは、Linuxでいうカレントディレクトリを移動するようなものだと考えてください。
mysql> USE lamp
  Database changed

次にテーブルを作成します。以下のSQLを入力しようと思います。
CREATE TABLE language (
    id     INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name   VARCHAR(10) NOT NULL,
    note   VARCHAR(100) NOT NULL
);

これを、mysqlプロンプトにコピー&ペーストしましょう。
mysql> CREATE TABLE language (
    ->     id   INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->     name VARCHAR(10),
    ->     note VARCHAR(100)
    -> );
Query OK, 0 rows affected (0.01 sec)

ちなみに、SQLは小文字大文字の区別をしませんが、MySQLの予約語を大文字に、カラム名やテーブル名を小文字にすれば、SQLの見た目が分かりやすくなります*7

テーブルが作成されたか確認します。
mysql> DESC language;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10)  | YES  |     | NULL    |                |
| note  | varchar(100) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

次にテーブルにデータを挿入します。以下SQLをmysqlプロンプトにながしてください。
INSERT INTO language (name, note) VALUES ('PHP', '初心者でも使いやすい');
INSERT INTO language (name, note) VALUES ('Perl', 'かつては一世を風靡した');
INSERT INTO language (name, note) VALUES ('Ruby', 'Railsで火がついた国産言語');
INSERT INTO language (name, note) VALUES ('Python', '米国での利用者はとても多い');

データを確認します。
mysql> SELECT * FROM language;
+----+--------+-----------------------------------------+
| id | name   | note                                    |
+----+--------+-----------------------------------------+
|  1 | PHP    | 初心者でも使いやすい                    |
|  2 | Perl   | かつては一世を風靡した                  |
|  3 | Ruby   | Railsで火がついた国産言語               |
|  4 | Python | 米国での利用者はとても多い              |
+----+--------+-----------------------------------------+
4 rows in set (0.00 sec)



PHPからMySQLのデータにアクセスする [#d7e16dfd]


先ほど作成した、languageテーブルを利用します。

以下のプログラムを作成し、/var/www/html/mysql.phpという名前で保存してください。
<?php
$db = mysql_connect('localhost', 'root', 'password');
if (!$db) {
    die('MySQL接続失敗: ' . mysql_error());
}

$db_selected = mysql_select_db('lamp', $db);
if (!$db_selected) {
    die('データベース選択失敗: ' . mysql_error());
}

$result = mysql_query('SELECT * FROM language', $db);
if (!$result) {
    die('クエリ選択失敗: ' . mysql_error());
}

while ($row = mysql_fetch_assoc($result)) {
    echo 'id: '   . $row['id']   . '<br />';
    echo 'name: ' . $row['name'] . '<br />';
    echo 'note: ' . $row['note'] . '<br />';
    echo '<hr />';
}
※ちなみに、PHPのコードのみで構成される場合、ファイル末尾の「?>」は必要ありません。これは近年主流の書き方なので慣れておくと良いでしょう。

それでは、ブラウザから確認してみましょう。
もしどこかでこけた場合、エラーメッセージをたよりに、問題を解決してください。
最終更新:2012年04月19日 01:29
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。

*1 実際にはPHPは単独でも動作しますし、Apacheとは別次元でCGIとしても動作します。

*2 本番運用時は、セキュリティも考慮して、ある程度設定を変更する場合が多いです

*3Code Craft ~エクセレントなコードを書くための実践的技法:http://www.amazon.co.jp/dp/4839921946/』の第一章「防御的プログラミング」でも述べられています。

*4 ちなみに、このrootユーザーとは、Linuxのrootユーザーとは全く関係がありません。MySQLレベルで、全ての特権をもつユーザーのことです。

*5 私は開発環境の場合、「password」とすることが多いです。覚えるのが面倒なので。

*6 -uはユーザー名、-pは続けてパスワードを入力するというオプションです。

*7 ほとんどのテキストでは、そのようなスタイルになっているはずです。