お金をかけずにサーバーの勉強をしよう

NGINXで PHPを使う

2025年6月9日

メニューへ戻る

NGINXで PHPを使うためのセッティングをします。

Laravelを使いたくなった…という訳ではなく、単にこのサイトがあるさくらインターネットのレンタルサーバーに掲示板を作りたいなと思って何か方便はないかとサービス内容を見た所 PHPだけは使えるので、本番リリース前にテストする環境が欲しかったのです。

PHPでの開発は一切やったことがありませんが、サーバーエンジニアとして環境構築はできるようにしておかないといけないと思うところもありました。

ということで、大したネタではないのですが、NGINXで PHPを動かす所まではやろうかと思います。


1.環境

2025年6月9日時点の最新バージョンを使いたかったのですが、phpのパッケージは若干古くなります。


Ubuntu Serverのインストールについては「Ubuntu 24.04 Server インストール」に、NGINXのインストールについては「NGiNXサーバーを作る」にそれぞれ書いています。

NGINXが動いているところからのスタートになります。


2.PHPインストール

パッケージがあるか確認します。

Ubuntuの snapのリポジトリにはなさそうです。

subro@UbuntuServer2404-1:~$ snap search php
Name               Version       Publisher           Notes    Summary
phpstorm           2025.1.1      jetbrains✓          classic  PhpStorm
nextcloud          31.0.5snap1   nextcloud✓          -        Nextcloud Server - A safe home for all your data
eclipse            2025-03       eclipsefoundation✓  classic  Extensible Tool Platform and Java IDE
netbeans           26            apache-netbeans✓    classic  Apache NetBeans IDE
kcachegrind        25.04.1       kde✓                -        Profiler Frontend
kdevelop           6.2.250401    kde✓                classic  Featureful, plugin-extensible IDE for C/C++ and other programming languages
syft               v1.26.1       popey✪              classic  SBOM Generator
grype              v0.92.2       popey✪              classic  Vulnerability scanner
laradumps          4.2.3         laradumps           -        LaraDumps
imagick            3.7.0         kz6fittycent        -        Imagick is a PHP extension to create and modify images
nodemailerapp      1.0.16        andrisreinman       -        The ultimate email debugging tool
nervatura          5.2.12        nervatura           -        Open Source Business Management Framework
sectrain           9.6           joesecurity         -        A training tool displaying some techniques for secure web app development
osv-scanner        1.9.0         iosifache           -        Vulnerability scanner for project's dependencies
djlint             1.36.4        pedro-avalos        -        HTML Template Linter and Formatter
mqttx              1.11.1        emqx                -        MQTT X: An Elegant Cross-platform MQTT 5.0 Desktop Client
tweakphp           0.7.2         saeedvaziry         -        Easily tweak your PHP code
vmcloud-nextcloud  1.0.0         victoriususm        -        Nextcloud 16.0.3 Optimized-Boosted
lazfuck            1.3.0         chronoscz           -        A simple BrainFuck IDE written in Lazarus/FPC.
laravel-mhall119   1.3.3         mhall119            classic  Laravel PHP framework
direnv             v2.18.2       nullboxorg          -        direnv -- Unclutter your .profile
graphpath          v1.0          nsg                 -        Graphpath generates an ASCII network diagram from the route table
lighttpd-php       0.1           jcverdie            -        lighttpd with php-fpm
eclipse-s-heuer    2020-09snap1  s-heuer             -        Extensible Tool Platform and Java IDEs

aptリポジトリには Ver.8.3.6がありました。

subro@UbuntuServer2404-1:~$ apt search php
〜〜〜 略 〜〜〜
php8.3/noble-updates,noble-security 8.3.6-0ubuntu0.24.04.4 all
  サーバサイドの HTML 組込みスクリプト言語 (メタパッケージ)
〜〜〜 略 〜〜〜

最新版が欲しかったので本家サイトからダウンロードしようとしたんですが、本家は C言語のソース配布なんですね。
今後のアップデートを鑑みるとちょっと面倒臭くなりそうなのでやめておきます。

一応本家サイトのダウンロードページはこちら。
Downloads & Installation Instructions

一応有名な PPA(Personal Package Archive)リポジトリ(ppa:ondrej/php)もあって Ubuntuではそれを使う方法を示してくれるブログも多いですが「業務用の本番環境で PPAじゃね」って人も多かろうと思いますので Ubuntuの aptリポジトリからインストールします。

PHP本体に加えて NGINXから利用するためにプロセスマネージャと呼ばれるFastCGI Process Manager (FPM)というのも入れます。

[php-fpm]パッケージをインストールすれば PHP本体も前提になる関連パッケージとして一緒にインストールされます。

subro@UbuntuServer2404-1:~$ sudo apt install -y php-fpm
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  php-common php8.3-cli php8.3-common php8.3-fpm php8.3-opcache php8.3-readline
提案パッケージ:
  php-pear
以下のパッケージが新たにインストールされます:
  php-common php-fpm php8.3-cli php8.3-common php8.3-fpm php8.3-opcache php8.3-readline
〜〜〜 省略 〜〜〜

インストールできました。

バージョンを確認してみます。

subro@UbuntuServer2404-1:~$ which php
/usr/bin/php

subro@UbuntuServer2404-1:~$ php -v
PHP 8.3.6 (cli) (built: Mar 19 2025 10:08:38) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.6, Copyright (c) Zend Technologies
    with Zend OPcache v8.3.6, Copyright (c), by Zend Technologies

なお [php-fpm] ですが、コイツは常駐プロセスとなっています。
[www-data]ユーザーで実行されていますね。

subro@UbuntuServer2404-1:~$ ps -ef | grep php
root        8487       1  0 07:06 ?        00:00:00 php-fpm: master process (/etc/php/8.3/fpm/php-fpm.conf)
www-data    8488    8487  0 07:06 ?        00:00:00 php-fpm: pool www
www-data    8489    8487  0 07:06 ?        00:00:00 php-fpm: pool www
subro       8623    1351  0 07:16 pts/0    00:00:00 grep --color=auto php



3.NGINXと php-fpmの連携

php-fpm は他のプログラム(ここでは NGINXです)とのプロセス間通信方法を2つ持っていて、UNIXドメインソケットネットワーク通信です。

絵にするとこんな感じでしょうか。
php-fpmのプロセス間通信方法

UNIXドメインソケットはパフォーマンスが良いのですがローカルでの通信しかできません。
今回は NGINXと php-fpmを同じサーバーにインストールしているので UNIXドメインソケットを使います。
両者が別ノードにインストールされている場合は必然的にネットワーク通信になります。

UNIXドメインソケットの説明は省きますが「ファイルを介してプロセス間通信を行う」というイメージでいれば良いと思います。

当のUNIXドメインソケット(ファイルのようなもの)は、複数バージョンに柔軟に対応できるようにする Alternativesの機能でシンボリックリンクを使ってアチコチ飛んで、結局 [/run/php/php8.3-fpm.sock]ファイル(UNIXドメインソケット)が実体となっています。
今後のバージョンアップの事を鑑みると [/run/php/php-fpm.sock]を使うのが良いですね。

subro@UbuntuServer2404-1:~$ ls -l /run/php
合計 4
lrwxrwxrwx 1 root     root     30  6月  9 07:06 php-fpm.sock -> /etc/alternatives/php-fpm.sock
-rw-r--r-- 1 root     root      4  6月  9 07:06 php8.3-fpm.pid
srw-rw---- 1 www-data www-data  0  6月  9 07:06 php8.3-fpm.sock

subro@UbuntuServer2404-1:~$ ls -l /etc/alternatives/php-fpm.sock
lrwxrwxrwx 1 root root 24  6月  9 07:06 /etc/alternatives/php-fpm.sock -> /run/php/php8.3-fpm.sock

ls -l コマンドの結果、[/run/php/php8.3-fpm.sock]ファイル(UNIXドメインソケット)のファイルの行の一番前の文字が「Socket」の「s」になっていますよね。


4.NGINXの設定変更

ここでは [/etc/nginx/sites-available/default]ファイルを書き換えてしまいますが、実際は WEBサイトの構成によってそれぞれのサイトの設定ファイルを作ると思うので、そちらに書いて下さい。

以下の通り変更しました。
ピンクのところが追加です。

[/etc/nginx/sites-available/default]

        index index.html index.htm index.nginx-debian.html;
      ↓ この行を書き換え
        index index.html index.htm index.php index.nginx-debian.html;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }

        ↓追加 リクエストで[.php]が付くファイルを指定されたら UNIXドメインソケットを介してphp-fpmに作業を渡す
        location ~ \.php$ {
                include         snippets/fastcgi-php.conf;
                fastcgi_pass    unix:/run/php/php-fpm.sock;
        }

設定ファイルを変更したでフォーマットのテストをします。

subro@UbuntuServer2404-1:~$ sudo nginx -T
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
〜〜〜 以下略 〜〜〜

テストに通りました。

NGINXを再起動します。

subro@UbuntuServer2404-1:~$ sudo systemctl restart nginx

再起動しました。


4.動作確認

下の内容のファイルを作ります。

[/var/www/html/index.php]

<?php phpinfo(); ?>

WEBブラウザで NGINXに上で作った [index.php]ファイルを指定してアクセスします。
私の環境では [http://UbuntuServer2404-1/index.php]になります。

出ましたね。いつものが。
PHPの Info画面


==========
PHPを動かせるようになりましたので、目的の掲示板のテストをば。

さくらインターネットのライトプランでは SQLiteという DBも使えるようですが、とりあえずシンプルにファイルのデータベース(?)のやつをどこぞからパクってきました。

うん、動きました。
PHPの掲示板

でもデータのサニタイズもしてないので、これをそのまま使うわけにはいかんな…。
どこかでセキュリティのしっかりしたのを探してこないといけません。

というわけで、この回はおしまい。

よろしければメッセージを残してやって下さい。
掲示板


サーバーエンジニアとしては PHP開発というより、PHPを使ったWEB系ミドルウェア環境の構築という面で本が欲しいところですね。