PHP
Linux
MySQL
Apache

Software Collections(SCL)のyumパッケージでLAMP環境を構築する

前回はCentOSの主なyumレポジトリとしてRemi、EPEL、Software Collectionsについてまとめてみました。

今回はSoftware Collections(以下SCL)のyumを使ってLAMP環境を構築してみようと思います。
まずは事前準備としてSCLのyumレポジトリを登録します。

yum --enablerepo=extras install centos-release-scl

※なおこの記事ではCentOS 6.9で検証したものをご紹介しています。

MySQL

今回はMySQL 5.7をインストールしてみたいと思います。
まずは試しにyum search mysqlしてみます。
いろいろ出てくるのですが主要なものを抜き出すと、以下の3つのパッケージがあることがわかります。 

mysql55.x86_64 : Package that installs mysql55
rh-mysql56.x86_64 : Package that installs rh-mysql56
rh-mysql57.x86_64 : Package that installs rh-mysql57

それぞれのパッケージをyum infoコマンドで確認してみると、どのパッケージも"centos-sclo-rh"のレポジトリに格納されていることがわかります(下記の"Repo"のところです)。通常であればOracleが公開しているレポジトリをインストールする必要がありますが、SCLを使えばそれも不要です。

yum info rh-mysql57.x86_64
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Available Packages
Name        : rh-mysql57
Arch        : x86_64
Version     : 2.3
Release     : 3.el6
Size        : 6.4 k
Repo        : centos-sclo-rh
Summary     : Package that installs rh-mysql57
License     : GPLv2+
Description : This is the main package for rh-mysql57 Software Collection, which installs
            : necessary packages to use MySQL 5.7 server.
            : Software Collections allow to install more versions of the same
            : package by using alternative directory structure.
            : Install this package if you want to use MySQL 5.7
            : server on your system.

ここからはSCLのドキュメントを参考に進めていきます。

ドキュメントのとおり、こいつをyum install rh-mysql57でインストールするとMySQLクライアントであるrh-mysql57-mysqlrh-mysql57-mysql-serverもインストールされます。

インストール先は/opt/rh/rh-mysql57です。SCLではどうやら他のyumパッケージと区別するためなのか/opt/rhの下にパッケージ名のディレクトリを作ってそこにインストールされるようです。

/opt/rh/rh-mysql57の下には下記のようになっています。

[root@localhost rh-mysql57]# ll
total 20
drwxr-xr-x.  3 root root 4096 Mar  7 06:04 .
drwxr-xr-x.  3 root root 4096 Mar  7 06:04 ..
-rw-r--r--.  1 root root 1045 Nov 16  2016 enable
dr-xr-xr-x. 19 root root 4096 Mar  7 06:04 root
-rw-r--r--.  1 root root  453 Oct 24 19:13 service-environment

そしてrootの下はこうなっています。

r-xr-xr-x.  2 root root 4096 Nov 16  2016 bin
dr-xr-xr-x.  2 root root 4096 Nov 16  2016 boot
drwxr-xr-x.  2 root root 4096 Nov 16  2016 dev
drwxr-xr-x.  2 root root 4096 Nov 16  2016 home
dr-xr-xr-x.  3 root root 4096 Mar  7 06:04 lib
dr-xr-xr-x.  3 root root 4096 Mar  7 06:04 lib64
drwxr-xr-x.  2 root root 4096 Nov 16  2016 media
drwxr-xr-x.  2 root root 4096 Nov 16  2016 mnt
drwxr-xr-x.  2 root root 4096 Nov 16  2016 opt
dr-xr-xr-x.  2 root root 4096 Nov 16  2016 proc
dr-xr-x---.  2 root root 4096 Nov 16  2016 root
dr-xr-xr-x.  2 root root 4096 Nov 16  2016 sbin
drwxr-xr-x.  2 root root 4096 Nov 16  2016 selinux
drwxr-xr-x.  2 root root 4096 Nov 16  2016 srv
drwxr-xr-x.  2 root root 4096 Nov 16  2016 sys
drwxrwxrwt.  2 root root 4096 Nov 16  2016 tmp
drwxr-xr-x. 13 root root 4096 Mar  7 06:04 usr

CentOSのルートと同じ構造になっています。おなじみのmysqlコマンドやmysqldumpコマンドは/opt/rh/rh-mysql57/root/usr/binに格納されています。このように、SCLでは/opt/rh/パッケージ名/root配下に仮想ルートを作成して、その下にコマンドファイルやライブラリがインストールされていくようです。

また、/opt/rh/rh-mysql57/enableの中身はこうなっています。

# For binaries
export PATH="/opt/rh/rh-mysql57/root/usr/bin${PATH:+:${PATH}}"
# For header files
export CPATH="/opt/rh/rh-mysql57/root/usr/include${CPATH:+:${CPATH}}"
# For libraries during build
export LIBRARY_PATH="/opt/rh/rh-mysql57/root/usr/lib64${LIBRARY_PATH:+:${LIBRARY_PATH}}"
# For libraries during linking
export LD_LIBRARY_PATH="/opt/rh/rh-mysql57/root/usr/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}"
# For man pages; empty field makes man to consider also standard path
export MANPATH="/opt/rh/rh-mysql57/root/usr/share/man:${MANPATH}"
# For Java Packages Tools to locate java.conf
export JAVACONFDIRS="/etc/opt/rh/rh-mysql57/java:${JAVACONFDIRS:-/etc/java}"
# For XMvn to locate its configuration file(s)
export XDG_CONFIG_DIRS="/etc/opt/rh/rh-mysql57/xdg:${XDG_CONFIG_DIRS:-/etc/xdg}"
# For systemtap
export XDG_DATA_DIRS="/opt/rh/rh-mysql57/root/usr/share:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
# For pkg-config
export PKG_CONFIG_PATH="/opt/rh/rh-mysql57/root/usr/lib64/pkgconfig${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}"

パスを通したり必要な変数を定義したりしています。先程の仮想ルート配下のパスを参照していますね。

次にドキュメントの通り、scl enable rh-mysql57 bashコマンドを実行します。

ドキュメントには

Start using the software collection

とだけ書いてありますが、実行内容としては、上記のenableファイルを読み込んでbashに登録するようです。$PATHを見てみましょう。

[root@localhost vagrant]# echo $PATH
/opt/rh/rh-mysql57/root/usr/bin:/sbin:/bin:/usr/sbin:/usr/bin

PATHが通っているのでmysqlコマンドを直接実行できますね。
マニュアルによると次はサービスの起動です。

service rh-mysql57-mysqld start

いつもどおりのservice mysqld startではないので注意が必要です。
psコマンドで確認してみます。

 3533 ?        S      0:00 /bin/sh /opt/rh/rh-mysql57/root/usr/bin/mysqld_safe --datadir=/var/opt/rh/rh-mysql57/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/rh-mysql57-mysqld/mysqld.pid --basedir=/opt/rh/rh-mysql57/root/usr --user=mysql
 3759 ?        Sl     0:00 /opt/rh/rh-mysql57/root/usr/libexec/mysqld --basedir=/opt/rh/rh-mysql57/root/usr --datadir=/var/opt/rh/rh-mysql57/lib/mysql --plugin-dir=/opt/rh/rh-mysql57/root/usr/lib64/mysql/plugin --log-error=/var/opt/rh/rh-mysql57/log/mysql/mysqld.log --pid-file=/var/run/rh-mysql57-mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock

先程は/opt/rh/rh-mysql57/root配下にいろんなものが格納されると説明しましたが、これを見る限り必ずしもそういうわけではないようです。pidやsockファイルはそれぞれ/var/lib/mysql/mysql.sock/var/run/rh-mysql57-mysqld/mysqld.pidですし、datadirも/var/opt/rh/rh-mysql57/lib/mysqlとなっているので注意が必要です。

Apache Httpd

SCLのhttpdは2.4が提供されています。apacheの2.4のyumはあまり見かけない気がするので、それだけでもSCLを使う価値があるかもしれないですね。

こちらもSCLのドキュメントをみながらインストールしていきます。

yum install httpd24
scl enable httpd24 bash
service httpd24-httpd start

基本的な手順はMySQLと同じです。
apachectlコマンドでコンパイルセッティングを見てみます。

[root@localhost ~]# apachectl -V
Server version: Apache/2.4.27 (Red Hat)
Server built:   Oct 24 2017 14:22:43
Server's Module Magic Number: 20120211:68
Server loaded:  APR 1.5.1, APR-UTIL 1.5.4
Compiled using: APR 1.5.1, APR-UTIL 1.5.4
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/opt/rh/httpd24/root/etc/httpd"
 -D SUEXEC_BIN="/opt/rh/httpd24/root/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="/opt/rh/httpd24/root/var/run/httpd/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

今度は/opt/rh/httpd24というディレクトリにインストールされています。
設定ファイルは/opt/rh/httpd24/root/etc/httpd配下です。

PHP

最後にphpについて見ていこうと思います。
今回は7.0をインストールしてみます。
https://www.softwarecollections.org/en/scls/rhscl/rh-php70/

ちなみに7.1も配布されていますが、CentOS 6は対応しておらず、CentOS 7から対応しているようです。

yum install rh-php70
scl enable rh-php70 bash

今度は/opt/rh/rh-php70/というディレクトリにインストールされます。
php -iで詳細を見てみます。

php -i
phpinfo()
PHP Version => 7.0.10

System => Linux localhost.localdomain 2.6.32-696.18.7.el6.x86_64 #1 SMP Thu Jan 4 17:31:22 UTC 2018 x86_64
Build Date => Nov  3 2016 08:05:15
Server API => Command Line Interface
Virtual Directory Support => disabled
Configuration File (php.ini) Path => /etc/opt/rh/rh-php70
Loaded Configuration File => /etc/opt/rh/rh-php70/php.ini
Scan this dir for additional .ini files => /etc/opt/rh/rh-php70/php.d
Additional .ini files parsed => /etc/opt/rh/rh-php70/php.d/20-bz2.ini,
/etc/opt/rh/rh-php70/php.d/20-calendar.ini,
/etc/opt/rh/rh-php70/php.d/20-ctype.ini,
/etc/opt/rh/rh-php70/php.d/20-curl.ini,
/etc/opt/rh/rh-php70/php.d/20-dom.ini,
/etc/opt/rh/rh-php70/php.d/20-exif.ini,
/etc/opt/rh/rh-php70/php.d/20-fileinfo.ini,
/etc/opt/rh/rh-php70/php.d/20-ftp.ini,
/etc/opt/rh/rh-php70/php.d/20-gettext.ini,
/etc/opt/rh/rh-php70/php.d/20-iconv.ini,
/etc/opt/rh/rh-php70/php.d/20-json.ini,
/etc/opt/rh/rh-php70/php.d/20-phar.ini,
/etc/opt/rh/rh-php70/php.d/20-posix.ini,
/etc/opt/rh/rh-php70/php.d/20-shmop.ini,
/etc/opt/rh/rh-php70/php.d/20-simplexml.ini,
/etc/opt/rh/rh-php70/php.d/20-sockets.ini,
/etc/opt/rh/rh-php70/php.d/20-sysvmsg.ini,
/etc/opt/rh/rh-php70/php.d/20-sysvsem.ini,
/etc/opt/rh/rh-php70/php.d/20-sysvshm.ini,
/etc/opt/rh/rh-php70/php.d/20-tokenizer.ini,
/etc/opt/rh/rh-php70/php.d/20-xml.ini,
/etc/opt/rh/rh-php70/php.d/20-xmlwriter.ini,
/etc/opt/rh/rh-php70/php.d/20-xsl.ini,
/etc/opt/rh/rh-php70/php.d/20-zip.ini,
/etc/opt/rh/rh-php70/php.d/30-wddx.ini,
/etc/opt/rh/rh-php70/php.d/30-xmlreader.ini

php.iniは/etc/opt/rh/rh-php70配下にありました。

また、ためしにphp-fpmも入れてみたいと思います。

yum install rh-php70-php-fpm.x86_64
service rh-php70-php-fpm start
Starting php-fpm:                                          [  OK  ]

マニュアルではrh-php70を入れればfpmも入ってくるような書き方ですが、fpm用のパッケージは別にインストールしなければなりませんので、ちょっと注意が必要です。

なお、mod_php的なパッケージは配布されていないようなので、mod_phpで動かしたい場合はSCLではちょっと都合が悪いです。ご注意ください。

まとめ

ということでSCLを使ってLAMP環境を構築してみました。
サービス名などが通常とちょっと違うので戸惑うかもしれませんが、インストール自体はSCLのページを見ながらやれば簡単です。

また設定ファイルの場所も変わったりしていますが、/opt/rh/配下や/var/opt/rh,/etc/opt/rhなどの下にあると思われますので、psコマンドで起動オプションを確認してみたりしてください。

参考になれば幸いです。