LAMPでWebサーバーを立てる

2018年11月25日

NextCloudを動かすためにTime4VPSでStorage VPSを借ります。このVPSはOpenVZ方式なのでLinux以外のOSを選択できないのです。最近仕事でApacheを触ることも多いし、ちょっと勉強がてらLAMPやります。

LinuxとOpenVZ

FreeBSDに比べてLinuxの分かりにくさというのはやはり多くのディストリビューションでしょう。てかディストリビューションって何!?

FreeBSDはOS丸ごとFreeBSD.orgが面倒を見ているけれど、Linuxはフィンランドのリーナスおじさんが作ったカーネルを元に、各ディストリビューターが思い思いにシェルやらツールやらを組み合わせたもの。

つい先日IBMが買収した商用のRed Hat Enterprise Linuxやそのオープンソース版のCentOSFedoraRaspberry PiのRaspbianにも使われているDebian GNU/Linuxやその派生のUbuntuなどなど…。それぞれ特徴も違えばお作法も違う。でもみんな元は同じカーネル。

一方、仮想化ソフトウェア作るのに「ハードウェアレベルの仮想マシン作って重くなるよりも、ホストのカーネル使いまわして軽い仮想マシン作った方がいいんじゃね?」という発想で作られたRed Hat Enterprise Linux用の仮想化ソフトウェアがOpenVZ

そういうわけで、Time4VPSのOpenVZ方式のVPSで提供されるOSはCentOS/Debian/Ubuntuになります。仕事で触るLinux、CentOSが多めだからCentOS7を選ぼう!

Apache2.4を入れる

2018年11月現在、Time4VPSで使えるCentOSの最新バージョンは7.5。このバージョンのパッケージにはApache最新版の2.4が入っています。

# yum info httpd
Available Packages
Name        : httpd
Arch        : x86_64
Version     : 2.4.6
Release     : 80.el7.centos.1
Size        : 2.7 M
Repo        : updates/7/x86_64
Summary     : Apache HTTP Server
URL         : http://httpd.apache.org/
License     : ASL 2.0
Description : The Apache HTTP Server is a powerful, efficient, and extensible
            : web server.

# yum -y install httpd
base                                                                                             | 3.6 kB  00:00:00
extras                                                                                           | 3.4 kB  00:00:00
updates                                                                                          | 3.4 kB  00:00:00

〜中略〜

Complete!
# httpd -version
Server version: Apache/2.4.6 (CentOS)
Server built:   Jun 27 2018 13:48:59

インストールできたらApacheの起動設定をします。

# systemctl enable httpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
# systemctl start httpd.service
# systemctl status httpd.service
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2018-11-24 19:02:19 JST; 23s ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 1632 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           ├─1632 /usr/sbin/httpd -DFOREGROUND
           ├─1633 /usr/sbin/httpd -DFOREGROUND
           ├─1634 /usr/sbin/httpd -DFOREGROUND
           ├─1635 /usr/sbin/httpd -DFOREGROUND
           ├─1636 /usr/sbin/httpd -DFOREGROUND
           └─1637 /usr/sbin/httpd -DFOREGROUND

Nov 24 19:02:19 *****.s.time4vps.cloud systemd[1]: Starting The Apache HTTP Server...
Nov 24 19:02:19 *****.s.time4vps.cloud systemd[1]: Started The Apache HTTP Server.

これだけでもうテストページにアクセスできちゃう。

Apacheのテストページ

もう一声、VirtualHost機能を使ってマルチドメイン設定をしてみます。/etc/httpd/conf.dディレクトリの下に設定ファイルを置きます。例えばexample.com用であればexample.com.confといった具合。

<VirtualHost *:80>
  DocumentRoot /var/www/html/example
  ServerName example.com
  ServerAlias www.example.com
</VirtualHost>

こんな感じ。ドメインごとに設定ファイルを作ってやると一つのVPS内で複数のドメインを扱うことができます。

PHP7.2のインストール

CentOS7.5の標準phpバージョンは超古い。

# yum info php
Available Packages
Name        : php
Arch        : x86_64
Version     : 5.4.16
Release     : 45.el7
Size        : 1.4 M
Repo        : base/7/x86_64
Summary     : PHP scripting language for creating dynamic web sites
URL         : http://www.php.net/
License     : PHP and Zend and BSD
Description : PHP is an HTML-embedded scripting language. PHP attempts to make it
            : easy for developers to write dynamically generated web pages. PHP also
            : offers built-in database integration for several commercial and
            : non-commercial database management systems, so writing a
            : database-enabled webpage with PHP is fairly simple. The most common
            : use of PHP coding is probably as a replacement for CGI scripts.
            :
            : The php package contains the module (often referred to as mod_php)
            : which adds support for the PHP language to Apache HTTP Server.

というわけで最新のphp7.2をインストールするためにNextcloudのマニュアルに従って操作します。

# yum install -y epel-release yum-utils unzip curl wget bash-completion policycoreutils-python mlocate bzip2
Package yum-utils-1.1.31-46.el7_5.noarch already installed and latest version
Package curl-7.29.0-46.el7.x86_64 already installed and latest version
Package wget-1.14-15.el7_4.1.x86_64 already installed and latest version

〜中略〜

Complete!
# yum update -y
epel/x86_64/metalink
epel                                                                                             | 3.2 kB  00:00:00
(1/3): epel/x86_64/group_gz                                                                      |  88 kB  00:00:00
(2/3): epel/x86_64/updateinfo                                                                    | 932 kB  00:00:00
(3/3): epel/x86_64/primary                                                                       | 3.6 MB  00:00:00
epel                                                                                                        12718/12718
No packages marked for update

準備ができたところで、yumにphp7.2の在処を教えます。その後、php7.2をインストール。

# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
Retrieving https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
warning: /var/tmp/rpm-tmp.DvrfwO: Header V4 RSA/SHA1 Signature, key ID 62e74ca5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:webtatic-release-7-3             ################################# [100%]
# yum install -y php72w php72w-cli php72w-common php72w-curl php72w-gd php72w-mbstring php72w-mysqlnd php72w-process php72w-xml php72w-zip php72w-opcache php72w-pecl-apcu php72w-intl php72w-pecl-redis php72w-fpm
Resolving Dependencies

〜中略〜

Complete!
# php -v
PHP 7.2.11 (cli) (built: Oct 11 2018 19:14:35) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.11, Copyright (c) 1999-2018, by Zend Technologies

入った!

MariaDB10.3のインストール

LinuxではMySQLの互換データベースであるMariaDBが標準みたいです。MariaDBというのはちょうどownCloudに対するNextcloudみたいな感じ。どちらもオリジナルの開発者が「ちょっと組織が肌に合わねぇ」って言って飛び出していった。

php同様、バージョンがちょい古いのでこちらもyumのリポジトリを書き換えます。手順はMariaDBの公式サイトにあるとおり。

# curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | bash
[info] Repository file successfully written to /etc/yum.repos.d/mariadb.repo.
[info] Adding trusted package signing keys...
[info] Succeessfully added trusted package signing keys.
# yum install MariaDB-server MariaDB-client
mariadb-main                                                                                     | 2.9 kB  00:00:00
mariadb-maxscale                                                                                 | 2.4 kB  00:00:00
mariadb-tools                                                                                    | 2.9 kB  00:00:00     

〜中略〜

Complete!
# rpm -qa | grep -e "MariaDB"
MariaDB-client-10.3.11-1.el7.centos.x86_64
MariaDB-common-10.3.11-1.el7.centos.x86_64
MariaDB-server-10.3.11-1.el7.centos.x86_64
MariaDB-compat-10.3.11-1.el7.centos.x86_64

入った!そしてサービスの開始は例によってsystemctlコマンド。

# systemctl enable mariadb.service
Created symlink from /etc/systemd/system/mysql.service to /usr/lib/systemd/system/mariadb.service.
Created symlink from /etc/systemd/system/mysqld.service to /usr/lib/systemd/system/mariadb.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
# systemctl start mariadb.service

初期設定はMySQLと同じmysql_secure_installationコマンドを使います。

# mysql_secure_installation

〜中略〜

Enter current password for root (enter for none):
OK, successfully used password, moving on...

〜中略〜

Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!

〜中略〜

Remove anonymous users? [Y/n] y
 ... Success!

〜中略〜

Disallow root login remotely? [Y/n] y
 ... Success!

〜中略〜

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

〜中略〜

Reload privilege tables now? [Y/n] y
 ... Success!

〜中略〜

Thanks for using MariaDB!

rootユーザーのパスワードを設定して、anonymouseユーザーやtestデータベースを削除します。

Apacheでphp-fpmを使う

Nginx同様にApacheでもphp-fpmを使ってサイトでphpが動作するようにします。参考にしたサイトはWordPressの高速化に。ApacheのeventMPMとphp-fpmを利用してウェブサイトの速度を向上する。|Rem System Techlogです。

まずはモジュールタイプの変更から。デフォルトのprefork MPMを最新のevent MPMに変更します。/etc/httpd/conf.modules.d/00-mpm.confファイルを書き換えて、mpm_prefork_moduleをコメントアウトしてmpm_event_moduleを有効にします。

# diff 00-mpm.conf.bak 00-mpm.conf
6c6
< LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
---
> #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
18c18
< #LoadModule mpm_event_module modules/mod_mpm_event.so
---
> LoadModule mpm_event_module modules/mod_mpm_event.so

Apacheを再起動してeventMPMが読み込まれているかどうか確認します。

# systemctl restart httpd.service
# httpd -M | grep -e 'mpm'
 mpm_event_module (shared)

続いて/etc/php-fpm.d/www.confファイルの書き換え。

# diff www.conf.bak www.conf
92c92
< pm.max_children = 50
---
> pm.max_children = 25
97c97
< pm.start_servers = 5
---
> pm.start_servers = 10
102c102
< pm.min_spare_servers = 5
---
> pm.min_spare_servers = 10
107c107
< pm.max_spare_servers = 35
---
> pm.max_spare_servers = 20
118c118
< ;pm.max_requests = 500
---
> pm.max_requests = 500

そしてphp-fpmの起動設定。

# systemctl start php-fpm.service
# systemctl status php-fpm.service
● php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset: disabled)
   Active: active (running) since Sat 2018-11-24 21:10:49 JST; 13s ago
 Main PID: 2261 (php-fpm)
   Status: "Processes active: 0, idle: 10, Requests: 0, slow: 0, Traffic: 0req/sec"
   CGroup: /system.slice/php-fpm.service
           ├─2261 php-fpm: master process (/etc/php-fpm.conf)
           ├─2262 php-fpm: pool www
           ├─2263 php-fpm: pool www
           ├─2264 php-fpm: pool www
           ├─2265 php-fpm: pool www
           ├─2266 php-fpm: pool www
           ├─2267 php-fpm: pool www
           ├─2268 php-fpm: pool www
           ├─2269 php-fpm: pool www
           ├─2270 php-fpm: pool www
           └─2271 php-fpm: pool www

Nov 24 21:10:49 81014.s.time4vps.cloud systemd[1]: Starting The PHP FastCGI Process Manager...
Nov 24 21:10:49 81014.s.time4vps.cloud systemd[1]: Started The PHP FastCGI Process Manager.
# systemctl enable php-fpm.service
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.

これでphpファイルにアクセスするとCGIが動くようになります。ドキュメントルート/var/www/htmlにinfo.phpファイルを置いて、http://example.com/info.phpにアクセスすると各種情報が表示されるようになります。

<?php phpinfo(); ?>

phpinfoの内容

続いて/etc/httpd/conf/httpd.confファイルの編集。最下行に以下追記します。

# event MPM settings
<IfModule mpm_event_module>
  StartServers  2
  MinSpareThreads 25
  MaxSpareThreads 50
  ThreadsPerChild 50
  MaxRequestWorkers 50
  MaxConnectionsPerChild  0
  <FilesMatch \.php$>
    SetHandler "proxy:fcgi://127.0.0.1:9000"
  </FilesMatch>
</IfModule>

そして/etc/httpd/conf.modules.d/10-php.confファイルをリネームして、Apacheがphpモジュールを読み込まないようにしてから/etc/httpd/conf.d/php.confのphp_valueを全てコメントアウトします。

#php_value session.save_handler "files"
#php_value session.save_path    "/var/lib/php/session"
#php_value soap.wsdl_cache_dir  "/var/lib/php/wsdlcache"

その後、設定変更が正しくおこなわれているかをチェックしてからApacheを再起動します。

# httpd -t
Syntax OK
# systemctl restart httpd.service
# httpd -M | grep -e 'php'
 php7_module (shared)

Apacheでphp使うの、結構面倒だね。