CentOS7+nginx+phpenvの環境を作る

2019年5月7日

まず始めに

CentOSを最新状態にするためyum updateをしてください。

sudo yum update -y

環境によって時間がかかる場合があるため気長に待ちましょう。

次にgitとwgetをインストールします。

sudo yum install -y git wget

phpenvからPHPをインストール

phpenvとはPHPのバージョンを簡単に切り替えられたりするすげーやつです。

Pythonだとpyenv、Rubyだとrbenvのように[言語]envは非常に便利なので
これらを簡単にインストールできるようにするためにanyenvを導入します。

まず公式リポジトリからcloneしてきます。

git clone https://github.com/anyenv/anyenv ~/.anyenv

次に以下のコマンドを入力します。
zshなどを利用してるかたはbashrcをzshrcなどに変更してください。

echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(anyenv init -)"' >> ~/.bashrc
exec $SHELL -l

そうすると以下のようなメッセージが表示される場合があるので
指示に従いコマンドを入力します。yes/no聞かれるのでyと入力してください。

ANYENV_DEFINITION_ROOT(/home/sasa/.config/anyenv/anyenv-install) doesn't exist. You can initialize it by:
anyenv install --init

次に各envを自動アップデートできるプラグインを導入します。

mkdir -p $(anyenv root)/plugins
git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
exec $SHELL -l

 

これでanyenv updateと入力すると導入したphpenvやpyenvが
全てアップデートできるようになります。

次にphpenvをインストールします。

anyenv install phpenv
exec $SHELL -l

これでphpenvが導入できましたがまだphpをインストールする
環境が整っていないため以下のライブラリをインストールします。

sudo yum install -y epel-release
sudo yum install -y gcc bison libxml2 libxml2-devel openssl-devel libcurl-devel libjpeg-turbo-devel libpng-devel libmcrypt-devel readline-devel libtidy-devel libxslt-devel bzip2 bzip2-devel libicu-devel  gcc-c++ tidyp make re2c file libtool-ltdl-devel autoconf automake patch mysql-devel
sudo yum install -y http://packages.psychotic.ninja/7/base/x86_64/RPMS/psychotic-release-1.0.0-1.el7.psychotic.noarch.rpm
sudo yum -y --enablerepo=psychotic-plus install libzip libzip-devel

次にインストールするPHPのバージョンを選びます

phpenv install --list

このコマンドを実行すると使用できるバージョンの一覧を確認できます。
今回は現時点で最新の7.3.4を導入します。

phpenv install 7.3.4

環境によってCompilingに2,30分かかる場合があります。

最後にphpenvで使用するPHPのバージョンを指定することで
PHPが使えるようになります。

phpenv global 7.3.4
php -v

php -vで選択したバージョンになっていれば成功です。

nginxのインストール

nginxとはwebサーバーを立てるためのものです。

デフォルトでyum installすると少し古いバージョンが入ってしまうので
リポジトリの設定をしましょう。

sudo vi /etc/yum.repos.d/nginx.repo

ここに以下を入力して保存します。

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

その後nginxをインストールします。

sudo yum install -y nginx

firewallの設定

次にwebページを外部に公開するためにfirewallの設定をして
80番portを開放します。以下のコマンドを入力してください。

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload

 

その後以下のコマンドを打ちnginxを起動し,ブラウザでサーバーのIPを
http://xxx.xxx.xxx.xxxのように打ち込むとWelcomeページが表示されます。

sudo systemctl start nginx

php-fpmの設定

このままではnginx上でPHPを使うことができません。
そこでphp-fpmというものを使うことによってnginxとPHPの橋渡しの
ようなことをしてくれます。

まずphp-fpmのglobal設定ファイルを開きます。

vi ~/.anyenv/envs/phpenv/versions/7.3.4/etc/php-fpm.conf

 

変更する箇所は以下です。

;pid = run/php-fpm.pid
↓
pid = /var/run/php-fpm.pid

;error_log = log/php-fpm.log
↓
error_log = /var/log/php-fpm.log

;events.mechanism = epoll
↓
events.mechanism = epoll

 

次にphp-fpmのwww設定ファイルを開きます。

vi ~/.anyenv/envs/phpenv/versions/7.3.4/etc/php-fpm.d/www.conf

変更する箇所は以下です。

user = nobody
group = nobody
↓
user = nginx
group = nginx

listen = 127.0.0.1:9000
↓
listen = /var/run/php-fpm.sock

;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660
↓
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

これでphp-fpmの設定は完了したのでsystemctlで起動できるように
起動スクリプトをコピーし、中身を少し変更します。

sudo cp /tmp/php-build/source/7.3.4/sapi/fpm/php-fpm.service.in /etc/systemd/system/php-fpm.service
sudo vi /etc/systemd/system/php-fpm.service

 

[service]の部分を全消しして代わりに以下を同じ場所に入力してください。
(ホームディレクトリやphpバージョンのpathは適宜変更してください)

Type=simple
PIDFile=/var/run/php-fpm.pid
ExecStart=/home/sasa/.anyenv/envs/phpenv/versions/7.3.4/sbin/php-fpm --nodaemonize --fpm-config /home/sasa/.anyenv/envs/phpenv/versions/7.3.4/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID

こうすることでsystemctlでphp-fpmが起動できるようになります。

sudo systemctl start php-fpm

nginxの設定

次にnginxの設定を弄ってphp-fpmを使えるようにします。
今回はVMware上で環境作成してるためdefault.confを使いますが
VPS上でドメインを持っているなどの方はexample.com.confなどを
default.confからコピーして設定してください。

ドメイン持ちの方
sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/example.com.conf
sudo vi /etc/nginx/conf.d/example.com.conf

VMware上の方
sudo vi /etc/nginx/conf.d/default.conf

 

以下のように変更してください。

ドメイン持ちの方のみ
server_name  localhost;
↓
server_name example.com;

以下共通
#charset koi8-r;
↓
charset utf-8;

location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
}
↓
location / {
    root   /usr/share/nginx/html;
    index  index.php index.html index.htm;
}

#location ~ \.php$ {
#    root           html;
#    fastcgi_pass   127.0.0.1:9000;
#    fastcgi_index  index.php;
#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
#    include        fastcgi_params;
#}
↓
location ~ \.php$ {
    include fastcgi_params;
    fastcgi_pass   unix:/var/run/php-fpm.sock;
    fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
}

設定が完了したらnginxを再起動します。

sudo systemctl restart nginx

SELinuxの無効化

このままではnginx上でphpを実行しようとしてもphp-fpmがPermission deniedになってしまいます。
これを回避するためにはSELinuxというCentOS7でデフォルトでオンになってるものを無効化します。

sudo vi /etc/selinux/config

以下の箇所を変更します。

SELINUX=enforcing
↓
SELINUX=disabled

自動起動設定

これですべての設定が完了したのでnginx,php-fpmをOS起動時に自動で起動するようにします。

sudo systemctl enable nginx
sudo systemctl enable php-fpm

再起動します。

 sudo reboot

phpinfoで確認

再起動できたらPHPが実行できるか確認してみましょう。
/usr/share/nginx/htmlにindex.phpをつくっていきます。

sudo vi /usr/share/nginx/html/index.php

以下を入力してください。

<?php
phpinfo();

またindex.phpの所有者をnginxにしておきましょう。

sudo chown nginx:nginx index.php

これでPHPの情報が表示されたら成功です。
ブラウザでhttp://xxx.xxx.xxx.xxxにアクセスしてみてください。

CentOS7, nginx, PHP, phpenv

Posted by sasa