前回、CentOS6にmysqlを突っ込みました。本来であれば、mysqlのチューニングに移りたいのですが、インストール系をまとめて片付けたかったので、先にphpのインストールをしてしまいます。
phpをソースインストールする
対象は執筆時点での最新版php 5.6.23をソースインストールです。
# cd /usr/local/src # wget http://jp2.php.net/get/php-5.6.23.tar.gz/from/this/mirror # tar xvfz mirror # cd php-5.6.23/
とりあえずphpをapacheにインストールする為のオプションだけ入れて、コンパイルを転がします。
# ./configure --prefix=/usr/local/php … configure: error: xml2-config not found. Please check your libxml2 installation.
libxml2-develが無いのでエラー。yumで入れます。
# yum install libxml2-devel # ./configure --prefix=/usr/local/php
ってやったら通っちゃったよ。必要なオプションは後々増やす予定なのでこれでmakeします。ってかよくわからんオプションつけてコンパイルしたくないんじゃ
# make # make install
はい。これで入るだけ入りましたが、この状態ではapacheでもmysqlでもphp使えません。なので今度は使えるように必要な箇所を修正します。二度手間とは言わないように。
apacheとPHP
まずはapacheさん。PHPコンパイル時にオプション指定しませんでしたので、当然apacheにphpモジュールがありません。apacheには標準で拡張モジュールをインストールしてくれるapxsという便利なコマンドがいます。phpのコンパイル時にこいつの場所を指定してあげると、phpをapacheの拡張moduleとしてインストールしてくれます。なので、以下オプションでphpを再コンパイル。
#make clean #./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs #make #make install
無事にインストール出来たら、以下を確認。
# ls /usr/local/apache2/modules/ |grep php libphp5.so # cat /usr/local/apache2/conf/httpd.conf |grep libphp LoadModule php5_module modules/libphp5.so
上記soファイルが配置され、httpd.confにLoadModuleが追記されています。後は、httpd.confに拡張子がphpのファイルを、phpを実行してから返すような設定を入れます。
# vi /usr/local/apache2/conf/httpd.conf <省略> <IfModule mime_module> AddType application/x-httpd-php .php
あと、ソースインストールだとphp.iniが無いので、srcからコピーして、一部中身書き換えます。
# cp -p /usr/local/src/php-5.6.23/php.ini-production /usr/local/php/lib/php.ini # vi /usr/local/php/lib/php.ini <省略> expose_php = Off <省略> date.timezone = Asia/Tokyo
したらapache再起動します。
# /etc/init.d/httpd stop # /etc/init.d/httpd start # vi /usr/local/apache2/htdocs/info.php <?php phpinfo(); ?>
これでwebブラウザから、
http://
でphpの情報が見れたらオッケーです。
mysqlとPHP
続いてmysql。まず、mysql側にユーザーとDB作っときます。
# /usr/local/mysql/bin/mysql -uroot Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.6.31 Source distribution Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> set password=password('Password') -> ; Query OK, 0 rows affected (0.01 sec) mysql> delete from mysql.user where password=''; Query OK, 5 rows affected (0.03 sec) mysql> create database test1; Query OK, 1 row affected (0.01 sec) mysql> create database test2; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | innodb | | mysql | | performance_schema | | test1 | | test2 | +--------------------+ 6 rows in set (0.00 sec) mysql> grant all privileges on test1.* to test_admin@'%' identified by 'admin'; Query OK, 0 rows affected (0.02 sec) mysql> grant all privileges on test2.* to test_admin@'%'; Query OK, 0 rows affected (0.00 sec) mysql> grant select on test1.* to test_readonly@'%' identified by 'readonly'; Query OK, 0 rows affected (0.00 sec) mysql> grant select on test2.* to test_readonly@'%'; Query OK, 0 rows affected (0.00 sec) mysql> select user,password,host from mysql.user; +---------------+-------------------------------------------+-----------+ | user | password | host | +---------------+-------------------------------------------+-----------+ | root | *FBA7C2D27C9D05F3FD4C469A1BBAF557114E5594 | localhost | | test_readonly | *922A4B420903CAD4E7FC56A23122AB927E051FE3 | % | | test_admin | *4ACFE3202A5FF5CF467898FC58AAB1D615029441 | % | +---------------+-------------------------------------------+-----------+ 3 rows in set (0.00 sec) mysql> show grants for test_admin; +-----------------------------------------------------------------------------------------------------------+ | Grants for test_admin@% | +-----------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'test_admin'@'%' IDENTIFIED BY PASSWORD '*4ACFE3202A5FF5CF467898FC58AAB1D615029441' | | GRANT ALL PRIVILEGES ON `test1`.* TO 'test_admin'@'%' | | GRANT ALL PRIVILEGES ON `test2`.* TO 'test_admin'@'%' | +-----------------------------------------------------------------------------------------------------------+ 3 rows in set (0.00 sec) mysql> show grants for test_readonly; +--------------------------------------------------------------------------------------------------------------+ | Grants for test_readonly@% | +--------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'test_readonly'@'%' IDENTIFIED BY PASSWORD '*922A4B420903CAD4E7FC56A23122AB927E051FE3' | | GRANT SELECT ON `test1`.* TO 'test_readonly'@'%' | | GRANT SELECT ON `test2`.* TO 'test_readonly'@'%' | +--------------------------------------------------------------------------------------------------------------+ 3 rows in set (0.00 sec) mysql> FLUSH PRIVILEGES;
次はPHP側にmysql接続用のAPIを使えるようにしてコンパイルします。公式ドキュメント見ると、mysql,mysqli,pdoの三種類があって、mysqlはもうサポートしない方針みたいですが、とりあえず、3つとも使えるようにコンパイルします。
# ./configure --prefix=/usr/local/php \ --with-apxs2=/usr/local/apache2/bin/apxs \ --with-mysql=/usr/local/mysql \ --with-pdo-mysql=/usr/local/mysql \ --with-mysqli=/usr/local/mysql/bin/mysql_config \ --enable-mbstring \ --enable-gd-native-ttf
これでmysqlとapacheをリスタートします。サンプルでtestmysql.phpみたいなので以下を作成します。
<?php // mysqli $mysqli = new mysqli("127.0.0.1", "test_readonly", "readonly", "test1"); $result = $mysqli->query("SELECT 'Hello, dear MySQL user1!' AS _message FROM DUAL"); $row = $result->fetch_assoc(); echo htmlentities($row['_message']); // PDO $pdo = new PDO('mysql:host=127.0.0.1;dbname=test1', 'test_readonly', 'readonly'); $statement = $pdo->query("SELECT 'Hello, dear MySQL user2!' AS _message FROM DUAL"); $row = $statement->fetch(PDO::FETCH_ASSOC); echo htmlentities($row['_message']); // mysql $c = mysql_connect("127.0.0.1", "test_readonly", "readonly"); mysql_select_db("test1"); $result = mysql_query("SELECT 'Hello, dear MySQL user3!' AS _message FROM DUAL"); $row = mysql_fetch_assoc($result); echo htmlentities($row['_message']); ?>
ちゃんと設定されていれば、こんな感じで表示されるはず…
Hello, dear MySQL user1!Hello, dear MySQL user2!Hello, dear MySQL user3!
長かったけど、(とりあえず)LAMP環境作成。イェイ!!これから諸々チューニングを予定(いつかは未定