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