よくわからないエンジニア

よく分からないエンジニアの日々の記録

よくわからないエンジニア

CentOS6にphpをソースインストールする

前回、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:///info.php
で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環境作成。イェイ!!これから諸々チューニングを予定(いつかは未定