NGINXで PHPを使うためのセッティングをします。
Laravelを使いたくなった…という訳ではなく、単にこのサイトがあるさくらインターネットのレンタルサーバーに掲示板を作りたいなと思って何か方便はないかとサービス内容を見た所 PHPだけは使えるので、本番リリース前にテストする環境が欲しかったのです。
PHPでの開発は一切やったことがありませんが、サーバーエンジニアとして環境構築はできるようにしておかないといけないと思うところもありました。
ということで、大したネタではないのですが、NGINXで PHPを動かす所まではやろうかと思います。
1.環境
2025年6月9日時点の最新バージョンを使いたかったのですが、phpのパッケージは若干古くなります。
- Ubuntu Server 24.04
- NGINX 1.24.0
- PHP 8.3.6
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ドメインソケットとネットワーク通信です。
絵にするとこんな感じでしょうか。
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を動かせるようになりましたので、目的の掲示板のテストをば。
さくらインターネットのライトプランでは SQLiteという DBも使えるようですが、とりあえずシンプルにファイルのデータベース(?)のやつをどこぞからパクってきました。
うん、動きました。
でもデータのサニタイズもしてないので、これをそのまま使うわけにはいかんな…。
どこかでセキュリティのしっかりしたのを探してこないといけません。
というわけで、この回はおしまい。
よろしければメッセージを残してやって下さい。
掲示板
サーバーエンジニアとしては PHP開発というより、PHPを使ったWEB系ミドルウェア環境の構築という面で本が欲しいところですね。