利用していたホスティングサービスが2月末にサービス終了するということで、急遽お引越しをしなければならなくなりました。どうせなら、最新環境にしてやろうということで、インフラ苦手ながら Google Cloud Platform に標題の環境構築をしてみたメモ書きです。
多くは参考サイトの記述ですが、一部に参考ページになかったポイントとかあったりしたので、ここにもまとめます。
今回は次のような環境を構築します。
- CentOS 7.2.1511 (GCPのイメージにあったもの)
- PHP 7.0.2
- nginx 1.8.1
- MariaDB Server 5.5.44
準備
GCP環境
Google Cloud Platform の Compute Engine で「CentOS 7.2.1511」を導入して開始しました。
プレーンな CentOS 環境みたいですね。インスタンス作成時に http/https アクセスを許可しておいたので、本稿でポートを開ける的な話はありません。
SELINUX 無効化
すみません。これでいきなり何か飛んできそうですが、とりあえず環境構築のハードルを下げるために……(・_・;
1 |
$ vim /etc/selinux/config |
1 2 |
-SELINUX=enforcing +SELINUX=disabled |
1 |
$ reboot |
必要なツールをインストール
まず必要そうなツールをインストールしました。
1 2 |
$ yum -y vim install git wget gcc-c++ $ yum -y install autoconf automake libtool re2c flex bison |
PHP
必要なライブラリを準備
まず、PHP が必要としそうなライブラリをインストールしていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ mkdir ~/temp $ cd ./temp $ $ yum -y install libjpeg-devel libpng-devel freetype-devel $ yum -y install libxml2-devel $ yum -y install openssl-devel $ yum -y install curl-devel $ $ wget http://elders.princeton.edu/data/puias/unsupported/6/x86_64/libmcrypt-2.5.8-9.puias6.x86_64.rpm $ wget http://elders.princeton.edu/data/puias/unsupported/6/x86_64/libmcrypt-devel-2.5.8-9.puias6.x86_64.rpm $ rpm -ivh libmcrypt-2.5.8-9.puias6.x86_64.rpm $ rpm -ivh libmcrypt-devel-2.5.8-9.puias6.x86_64.rpm $ $ wget http://downloads.sourceforge.net/project/pcre/pcre/8.38/pcre-8.38.tar.gz $ tar zxvf pcre-8.38.tar.gz $ cd pcre-8.38 $ ./configure --prefix=/usr/local/pcre-8.38 --enable-utf8 --enable-unicode-properties $ make && make install |
libmcrypt を yum で入れていないのは何でだっただろ?って記事書きながら思ったのですが、参考サイトのままで何も考えてなかったのかも…。
pcre は yum で入れようとすると既に最新版が入っていると言われるのですが、php の configre でのパス指定がうまくいかない(必要なリソースが見つからないと言われる)ので、個別導入しました。このあたりも本当はもっとうまくやれるはず。
それと、pcre の./configure で –enable-utf8 –enable-unicode-properties のオプションを忘れないこと。僕が参考にした記事ではどれにも入ってなかったんですが、この指定が無いと php の preg_* 系関数でマルチバイトに関するエラーを吐いてしまいました。
PHP本体のインストール
configure のオプションは悩みますね。色々しらべて下記の通りとしました。とりあえず WordPress はちゃんと動いています。インストールパスもこれで適切だと思う。
パス指定は環境に合わせて。pcre は(もちろん)入れた場所を指定。参考にした記事では、もっと浅い階層になっていて検索するルートかな?と思ったりしてたんですが、なかなか見つけてくれずに試行錯誤した結果、普通に入れた場所を指定したら通りました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
$ cd ~/temp $ git clone -b PHP-7.0.2 https://github.com/php/php-src.git $ cd php-src $ $ ./buildconf --force $ ./configure \ --prefix=/usr/local/php7 \ --with-config-file-path=/usr/local/php7/etc \ --enable-mbstring \ --enable-mbregex \ --enable-fpm \ --enable-zip \ --enable-bcmath \ --enable-opcache \ --enable-exif \ --enable-calendar \ --with-pcre-regex=/usr/local/pcre-8.38 \ --with-pcre-dir=/usr/local/pcre-8.38 \ --with-curl \ --with-mcrypt \ --with-iconv \ --with-mysqli=mysqlnd \ --with-openssl \ --with-gd \ --with-jpeg-dir=/usr \ --with-png-dir=/usr \ --with-zlib-dir=/usr \ --with-freetype-dir=/usr \ --enable-gd-native-ttf \ --enable-gd-jis-conv $ $ make && make install $ $ export PATH=${PATH}:/usr/local/php7/bin/:/usr/local/php7/sbin/ $ source /etc/profile |
とはいえ、–with-jpeg-dir=/usr 以降の「/usr」の指定は参考にした記事そのまま。どなたか意味を教えてください…。
php-fpm
Nginx と FastCGI でやりとりするための php-fpm のサービスを準備します。
php-fpm 自体は、PHP のインストール時に一緒に導入されています。
設定
2つの設定ファイルをデフォルトファイルからコピーして、とりあえずそれぞれ以下のように修正します。
1 2 |
$ cp -p /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf $ vim /usr/local/php7/etc/php-fpm.conf |
1 2 3 4 5 |
-;pid = run/php-fpm.pid +pid = run/php-fpm.pid -;daemonize = yes +daemonize = yes |
2つ目。
1 2 |
$ cp -p /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf $ vim /usr/local/php7/etc/php-fpm.d/www.conf |
1 2 3 4 |
-user = nobody -group = nobody +user = nginx +group = nginx |
起動スクリプトを準備
正直、このくだりの意味(必要性?)がわかっていなくて、参考ページそのままです。
1 |
$ vim /etc/init.d/php-fpm |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
#! /bin/sh ### BEGIN INIT INFO # Provides: php--fpm # Required-Start: $all # Required-Stop: $all # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: starts php-fpm # Description: starts the PHP FastCGI Process Manager daemon ### END INIT INFO php_fpm_BIN=/usr/local/php7/sbin/php-fpm php_fpm_CONF=/usr/local/php7/etc/php-fpm.conf php_fpm_PID=/usr/local/php7/var/run/php-fpm.pid php_opts="--fpm-config $php_fpm_CONF" wait_for_pid () { try=0 while test $try -lt 35 ; do case "$1" in 'created') if [ -f "$2" ] ; then try='' break fi ;; 'removed') if [ ! -f "$2" ] ; then try='' break fi ;; esac echo -n . try=`expr $try + 1` sleep 1 done } case "$1" in start) echo -n "Starting php-fpm " $php_fpm_BIN $php_opts if [ "$?" != 0 ] ; then echo " failed" exit 1 fi wait_for_pid created $php_fpm_PID if [ -n "$try" ] ; then echo " failed" exit 1 else echo " done" fi ;; stop) echo -n "Gracefully shutting down php-fpm " if [ ! -r $php_fpm_PID ] ; then echo "warning, no pid file found - php-fpm is not running ?" exit 1 fi kill -QUIT `cat $php_fpm_PID` wait_for_pid removed $php_fpm_PID if [ -n "$try" ] ; then echo " failed. Use force-exit" exit 1 else echo " done" echo " done" fi ;; force-quit) echo -n "Terminating php-fpm " if [ ! -r $php_fpm_PID ] ; then echo "warning, no pid file found - php-fpm is not running ?" exit 1 fi kill -TERM `cat $php_fpm_PID` wait_for_pid removed $php_fpm_PID if [ -n "$try" ] ; then echo " failed" exit 1 else echo " done" fi ;; restart) $0 stop $0 start ;; reload) echo -n "Reload service php-fpm " if [ ! -r $php_fpm_PID ] ; then echo "warning, no pid file found - php-fpm is not running ?" exit 1 fi kill -USR2 `cat $php_fpm_PID` echo " done" ;; *) echo "Usage: $0 {start|stop|force-quit|restart|reload}" exit 1 ;; esac |
1 |
$ chmod 755 /etc/init.d/php-fpm |
サービスに追加
1 |
$ vim /lib/systemd/system/php-fpm.service |
1 2 3 4 5 6 7 8 9 10 11 12 |
[Unit] Description=The PHP 7 FastCGI Process Manager After=network.target [Service] Type=simple PIDFile=/usr/local/php7/var/run/php-fpm.pid ExecStart=/usr/local/php7/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php7/etc/php-fpm.conf ExecReload=/bin/kill -USR2 $MAINPID [Install] WantedBy=multi-user.target |
1 |
$ systemctl daemon-reload |
起動
1 |
systemctl start php-fpm |
これでこの子はおとなしく 9000 ポートで待ち受けしてくれるようになるみたいです(ポートの指定は、上でもちょっと弄った設定ファイルの /usr/local/php7/etc/php-fpm.d/www.conf にあります)。
Nginx
インストール
まずはリポジトリの追加(後で別記事で普通に yum で入っていたような例も見かけたので、これしなくても入ったのかも)。
1 |
$ vim /etc/yum.repos.d/nginx.repo |
1 2 3 4 5 |
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1 |
そしてインストール。
1 |
$ yum -y --enablerepo=nginx install nginx |
設定
Nginx 初体験の僕はドキドキでした。とりあえずはデフォルト設定を変更するパターンでポイントだけ。
1 |
$ vim /etc/nginx/conf.d/default.conf |
以下は、WordPress のために設定したものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
server { listen 80; server_name foreignkey.jp; access_log /var/log/nginx/foreignkey.jp.access.log main; root /home/foreignkey/public_html; index index.php index.html; location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } location / { try_files $uri $uri/ /index.php?$args; } error_page 404 /404.html; # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires max; log_not_found off; } } |
この中の 10-15 行目が php-fpm との連携のポイントですね。拡張しが .php のものを 127.0.0.1:9000 に通しています。php-fpm は 9000 番ポートを待ち受けている感じですね。
ちなみに、22-24 行目が、WordPress のためのリライト設定です。
起動
1 |
$ systemctl start nginx |
これで http で参照できるはず。
指定したドキュメントルートに、index.php とか置いて、phpinfo() でもやってみたください。
MariaDB
MySQL 互換の新しいデータベースらしいですね。この件で初めて知りました(←不勉強)。なんかこれからのメインストリームな気がしたので、導入することにしました。
インストール
1 |
$ yum -y install mariadb mariadb-server |
ちなみにコマンドまで MySQL 互換。
1 |
$ mysql --version |
自動起動設定
1 |
$ systemctl enable mariadb.service |
サービスの起動
1 |
$ systemctl start mariadb |
設定
とりあえずrootパスワード設定。
1 2 3 |
$ mysql -uroot > set password for root@localhost=password('MYPASSWORD'); |
それから、とりあえずWordPress用にテーブルを作ってみました。
1 2 3 |
> CREATE DATABASE foreignkey CHARACTER SET utf8; > GRANT all privileges ON foreignkey.* to foreignkey@localhost identified by 'MYPASSWORD'; > FLUSH privileges; |
WordPress
おまけで。
- お引越しは簡単。基本いつもどおり。PHP7 / MariaDB ともに環境由来の問題は今のところ無し。
- メール送信のために、GCPの環境では postfix の設定が必要でした。
- Nginx も初めてだったので、rewrite 設定にアタフタした。ネットで見つかる記事や、なんと Codex の公式記事も NG(configエラーさえ起してくれた)。でも焦らず。Nginx の公式にバッチリの回答がありました。こちらを参考に修正して無事クリア。
https://www.nginx.com/resources/wiki/start/topics/recipes/wordpress/
参考ページ
参考にさせていただいたページ。感謝です!
- CentOS7 + PHP7 + nginx + php-fpm の環境構築http://qiita.com/onishik/items/810fd840530d4fb6970c#3-2%E8%B5%B7%E5%8B%95%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E4%BD%9C%E6%88%90
- CentOS 7 でLAMP(Nginx+MariaDB(MySQL)+PHP)インストールからWordPressを動かすまで(Nginx編)
http://server-setting.info/centos/nginx-wordpress-centos7.html