nginxとphp-fpmでphpのサイトを実行するための環境を構築します。

各バージョン

  • CentOS 7.9
  • nginx 1.22.0
  • php 8.1.7
  • php-fpm 8.1.7

nginxのインストール

repoを追加

nginxのリポジトリを追加します。

# vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=https://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

nginxのインストール

nginxのインストールを行います。

# yum install -y nginx

nginxの起動

nginxの起動

# systemctl start nginx

起動の確認(active)

# systemctl status nginx
● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since 水 2022-06-22 09:43:50 JST; 4s ago
     Docs: http://nginx.org/en/docs/

firewalldの許可設定

ファイヤーウォールでhttpの80ポートを許可します。(無効にしていたら不要)

# firewall-cmd --permanent --zone public --add-service http

ファイアウォールの反映

# firewall-cmd --reload

web画面の確認

サーバのURLにアクセスしてwelcomeページが表示されればOK

http://{サーバIP}

nginx welcome page

PHPのインストール

今回は、RemiリポジトリからPHP8.1をインストールします。

Remiリポジトリをインストール

CentOS8は標準がPHP5なのでRemiリポジトリをインストールします。

# yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm

opensslをインストール(SSL不要ならやらない)

SSLにする予定がないなら不要です。

# yum install -y openssl openssl-devel

PHPと拡張モジュールのインストール

拡張モジュールは必要なやつを入れてください。

wordpressを構築予定ならphp81-php-mysqlndやphp81-php-pecl-imagick-im6が必要かもです。

# yum install -y php81 php81-php php81-php-pdo php81-php-mbstring php81-php-pecl-crypto php81-php-xml php81-php-pecl-zip

シンボリックリンク作成

phpでコマンドを認識させるためにシンボリックリンクを作成

# ln -sf /usr/bin/php81 /usr/bin/php

PHPのバージョン確認

php -vでバージョンが表示されれば、phpのインストールは完了です。

# php -v
PHP 8.1.7 (cli) (built: Jun  7 2022 18:21:38) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.1.7, Copyright (c) Zend Technologies

PHP-FPMのインストール

NginxとPHPをつなげるPHP-FPMのインストールと設定をします。

php-fpmインストール

# yum install -y php81-php-fpm

php-fpm設定ファイルを編集

今回はUNIXドメインソケットを使ってnginxとのやり取りをします。

変更した個所だけ記載しています、それ以外はデフォルトで。

# vi /etc/opt/remi/php81/php-fpm.d/www.conf
listen = /var/run/php-fpm/php-fpm.sock

listen.owner = nginx
listen.group = nginx
listen.mode = 0660

pm = static
pm.max_children = 2

「pm = static」と「pm.max_children = 2」の設定は、常に子プロセスを2つ起動するって意味です。

この辺のチューニングはサーバや運用サイトごとに調整が必要になります。

php-fpmの起動

ソケットの配置ディレクトリを作成

# mkdir /var/run/php-fpm

/var/runの下って再起動とかすると消える(元に戻る)んですよね。SELinuxが原因みたいですが。

サーバ再起動後にphp-fpmが起動しなければ確認してください。

systemctlで起動します。

# systemctl start php81-php-fpm

php-fpmのソケットがnginx:nginxになっていることを確認

# ll /var/run/php-fpm/
合計 0
srw-rw----. 1 nginx nginx 0  6月 22 10:29 php-fpm.sock

PHPページの作成

テスト用のページを作成、おなじみのphpinfo。

/var/wwwの下にnginxのディレクトリは無ければ作成してください。

# echo "<?php phpinfo() ?>" > /var/www/nginx/index.php

Nginxの設定ファイル変更

nginxの設定変更

PHPのページが表示できるようにNginxの設定ファイルを変更します。

# vi /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;
    root /var/www/nginx;

    location / {
        root   /var/www/nginx;
        index  index.php index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

serverディレクティブの直下のrootは結構重要です、これが無いとdocument_rootは参照できません。

fastcgi_passはUNIXソケットのパスを指定します。

fastcgi_paramも結構ハマるポイント、デフォルトの記載だと/scriptsみたいなフォルダを参照します。

構成にもよりますが、$document_rootに書き換えると幸運になれます。

nginxの再起動

設定を反映させるためにnginxを再起動

# systemctl restart nginx

PHPページの確認

サーバのURLのアクセスしてPHPのページが表示されればOK

http://{サーバIP}/index.php

nginx phpinfo

まとめ

nginxとphp-fpmでphpページを表示させる環境を構築しました。

apacheとphp-fpmでphpページを表示させることが多いようですが、最近はnginxも増えてきていると思います。

まぁ、自分でサーバ環境を用意する機会は多くないかもですが。