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

[前回](https://qiita.com/takeshi_nozawa/items/ee01981b4fc338209437)は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のドキュメント](https://www.softwarecollections.org/en/scls/rhscl/rh-mysql57/
)を参考に進めていきます。

ドキュメントのとおり、こいつを`yum install rh-mysql57`でインストールするとMySQLクライアントである`rh-mysql57-mysql`や`rh-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`の中身はこうなっています。

```bash
# 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は２．４が提供されています。apacheの2.4のyumはあまり見かけない気がするので、それだけでもSCLを使う価値があるかもしれないですね。

こちらも[SCLのドキュメント](https://www.softwarecollections.org/en/scls/rhscl/httpd24/)をみながらインストールしていきます。

```
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コマンドで起動オプションを確認してみたりしてください。

参考になれば幸いです。