nginx
apache2
docker
centos7
fpm

CentOS7でapacheからnginxへの移行 (PHP)

More than 1 year has passed since last update.

Webサービスを運用していると色々な問題が起こってくる。
・ 分散管理をしたい!!!
・ リバースプロキシを置きたい!!!
ということがDockerなどを併用して運用する時には生じてくる。
このような状況下ではapacheでの運用よりもnginxでの運用の方がconfigをスッキリ簡単に書くことができる。
moduleの拡張も必要ないので簡単に環境を構築できるなどの利点もある。
今回は、Webサービスを元から運用していたCentOS7にDockerを導入した際にapacheからnginxに移行する時の設定法を書く。

はじめに

今回はこちらの記事で紹介したLaravelでの環境にDockerを導入し、nginxにWebサーバを切り替えた。

構成する実行環境・およびマシン環境

・CentOS7.3
・PHP7
・MySQL5.7
・apache2.4

上記の環境を構築する。
マシンはさくらVPSを利用しているが、環境はOS依存なので、
さくらのVPSに限らずCentOS7.3の環境なら基本的に再現できる。

導入

apacheの停止

まず、現在起動しているapacheを停止する
$ systemctl stop httpd.service
* ここでアンインストールしたい方はyum remove -y httpdを実行する

nginxの環境を作る

まず、最新の安定板のnginxをインストールするためにリポジトリを追加する。
以下のファイルを作成し、リポジトリの情報を書く。
$ vim /etc/yum.repos.d/nginx.repo

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

リポジトリ情報を登録したら、以下のコマンドでインストールする
$ yum -y --enablerepo=nginx install nginx

インストールが終わったらnginxを起動する
$ systemctl start nginx.service

PHP環境の導入

ここからが重要である。
/usr/share/nginx/htmlに移動して、index.htmlを消してindex.phpを置くだけではfpmが動作しない。
まともにこの部分について記載されている記事が見つからなかったので苦労した。

ということで、設定していく。まず、以下のconfigを編集する。
$ /etc/nginx/conf.d/default.conf

default.conf
server {
    listen       80;
    server_name  localhost;

・・・・(省略)
}

#以下の3行を追加する
upstream php-fpm {
    server 127.0.0.1:9000;
}

これで、ようやくfpmがnginx上で動作するようになる!
その後、各Virtual Hostごとにfpmの設定を行う。
今回は以下の階層に新しくファイルを作成して、そこに記載した。
$ /etc/nginx/conf.d/VirtualHost.conf

VirtualHost.conf
server {
    listen 80;
    server_name hogehoge.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/hogehoge.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/hogehoge.com/privkey.pem;
    server_name hogehoge.com;
    root /path/to/hogehoge/public;
    index index.php index.html;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    location / {
        try_files $uri /index.php?$query_string; 
    }

    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;
    }
}

最後にfpmで実行するユーザをnginxに変更する。
$ vim /etc/php-fpm.d/www.conf

www.conf
user = nginx
group = nginx

これで最低限動く環境はできるはずである。
適宜、nginxでセキュリティに関する設定をすることを推奨する。
あとはすべての設定を適応させるために以下のコマンドを実行する。

$ systemctl restart php-fpm.service
$ systemctl restart nginx.service

これで完了である。
/usr/share/nginx/htmlディレクトリ配下に.phpファイルを置いてphpが実行されていることを確認する。

Dockerのインストール

ここまでで一応apacheからnginxの導入までは完了したが、ついでにDockerもインストールしたので、そのこともおまけで書いておく。
多分、nginx使ってる人のほとんどはDocker使ってると思うから、書いてあって損はないはず!!
コピペするだけで使えるようにしておく。

docker_script.sh
curl -sSL https://get.docker.com/ | sh
sudo usermod -aG docker root
systemctl start docker
doceker version

curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose version

終わりに

今回は、apacheからnginxにWebサーバ環境を移行する方法を記載した。
環境構築は割とよくやるので、毎回調べるの面倒臭いし、一連の流れが書いてある記事があってもいいよね?ってことで書きました。
何か、問題のある記述等がありましたら、コメント頂けると嬉しいです。

参考文献

EC2にnginx+php(php-fpm socket)環境を最速で構築したときにハマった事
*このサイトに助けられました!

nginxとphp-fpmの設定
nginx+php-fpmでphpを動かす
CentOS 7 (5, 6) で "安定版 (最新版)" のNginxをインストールする方法
nginx連載5回目: nginxの設定、その3 - locationディレクティブ