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

NGINXで PHPを使う

2024年8月7日

メニューへ戻る

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

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

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

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


1.環境

2024年8月7日時点の最新バージョンです。


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           2024.1.5      jetbrains✓        classic  PhpStorm
nextcloud          29.0.4snap2   nextcloud✓        -        Nextcloud Server - A safe home for all your data
eclipse            2024-06       snapcrafters✪     classic  Extensible Tool Platform and Java IDE
netbeans           22            apache-netbeans✓  classic  Apache NetBeans IDE
kdevelop           5.12.230804   kde✓              classic  Featureful, plugin-extensible IDE for C/C++ and other programming languages
kcachegrind        23.08.4       kde✓              -        Profiler Frontend
laradumps          3.2.4         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.7         nervatura         -        Open Source Business Management Framework
sectrain           9.6           joesecurity       -        A training tool displaying some techniques for secure web app development
osv-scanner        0.1           iosifache         -        Vulnerability scanner for project's dependencies
mqttx              1.10.1        emqx              -        MQTT X: An Elegant Cross-platform MQTT 5.0 Desktop Client
vmcloud-nextcloud  1.0.0         victoriususm      -        Nextcloud 16.0.3 Optimized-Boosted
lazfuck            1.2.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 IDE

aptリポジトリにはありましたけど Ver.8.3.6のようです。
2024年8月7日時点では Ver.8.3.10が出ています。

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

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

一応本家サイトのダウンロードページはこちら。(時間が経つとバージョンは変わります)
Current Stable PHP 8.3.10

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

[php]本体に加えて NGINXから利用するため [php-fpm] というのも入れます。

subro@UbuntuServer2404-1:~$ sudo apt install -y php php-fpm
〜〜〜 省略 〜〜〜

NOTICE: You are seeing this message because you have apache2 package installed.
libapache2-mod-php8.3 (8.3.6-0ubuntu0.24.04.1) のトリガを処理しています ...
Job for apache2.service failed because the control process exited with error code.
See "systemctl status apache2.service" and "journalctl -xeu apache2.service" for details.
invoke-rc.d: initscript apache2, action "restart" failed.
× apache2.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/apache2.service; enabled; preset: enabled)
     Active: failed (Result: exit-code) since Wed 2024-08-07 06:50:38 JST; 16ms ago
       Docs: https://httpd.apache.org/docs/2.4/
    Process: 52738 ExecStart=/usr/sbin/apachectl start (code=exited, status=1/FAILURE)
        CPU: 48ms

 8月 07 06:50:38 UbuntuServer2404-1 systemd[1]: Starting apache2.service - The Apache HTTP Server...
 8月 07 06:50:38 UbuntuServer2404-1 apachectl[52740]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
 8月 07 06:50:38 UbuntuServer2404-1 apachectl[52740]: (98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
 8月 07 06:50:38 UbuntuServer2404-1 apachectl[52740]: (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80
 8月 07 06:50:38 UbuntuServer2404-1 apachectl[52740]: no listening sockets available, shutting down
 8月 07 06:50:38 UbuntuServer2404-1 apachectl[52740]: AH00015: Unable to open logs
 8月 07 06:50:38 UbuntuServer2404-1 systemd[1]: apache2.service: Control process exited, code=exited, status=1/FAILURE
 8月 07 06:50:38 UbuntuServer2404-1 systemd[1]: apache2.service: Failed with result 'exit-code'.
 8月 07 06:50:38 UbuntuServer2404-1 systemd[1]: Failed to start apache2.service - The Apache HTTP Server.

〜〜〜 省略 〜〜〜

一応インストールできました。
エラーメッセージが出ますが、これは Apache Http Serverをインストールしていないから出るものです。

以前のバージョンでは出てなかったような気がしますが、ここでは NGINXを使おうって話をしているので無視します。

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

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

subro@UbuntuServer2404-1:~$ php -v
PHP 8.3.6 (cli) (built: Jun 13 2024 15:23:20) (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ですが、コイツは常駐プロセスとなっています。

subro@UbuntuServer2404-1:~$ ps -ef | grep php
root       52709       1  0 06:50 ?        00:00:00 php-fpm: master process (/etc/php/8.3/fpm/php-fpm.conf)
www-data   52710   52709  0 06:50 ?        00:00:00 php-fpm: pool www
www-data   52711   52709  0 06:50 ?        00:00:00 php-fpm: pool www
subro      74244    8776  0 07:04 pts/0    00:00:00 grep --color=auto php


php-fpmは他のプログラム(ここでは NGINXです)とのプロセス間通信用に UNIXドメインソケットも持っています。

ネットワークの機能で通信させることもできますが、折角 NGINXと同じサーバーにインストールしているので、こちらを使います。

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  8月  7 06:50 php-fpm.sock -> /etc/alternatives/php-fpm.sock
-rw-r--r-- 1 root     root      5  8月  7 06:50 php8.3-fpm.pid
srw-rw---- 1 www-data www-data  0  8月  7 06:50 php8.3-fpm.sock

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



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

        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ブラウザでアクセスします。
私の環境では [http://UbuntuServer2404-1/index.php]になります。

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


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

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

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

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

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

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


メジャーバージョンアップがないからか、1年以内に出た PHPはみつけられませんでした。