はじめに
Windows11のWSL2にUbuntu20.04LTSを入れてます。
先日、そこにNginxとphp-fpm(php8.1)を入れて連携設定したときの「WSL2」ならではのハマりどころがあるので、それをまとめておこうと思います。
なお、php-fpmは最新版をえるため「 ppa:ondrej/php」をリポジトリに追加しています。
localhostの解決
WSL2上のUbuntuにWebサーバー「Nginx」サービスをスタートさせれば
「http://localhost:xxx」(xxxはNginxに設定したポート)
でページ表示可能です。
これは、WSL2 の localhostForwarding 機能が、Windows側から localhost でWSL2側で listen しているポートにアクセスできるようにしてくれているからです。
これ動いていない(localhostForwarding=false)だと、Windowsのブラウザで
「http://localhost」
でWSL2でlistenしているNginxにアクセスすることはできません。
でも、WSL2では「localhostForwarding=true」がデフォルトなので気にすることはありません。
しかし、僕のようにWSL1からWSL2にアップグレードした環境だと、まれに、こういうことがあるみたいです(理由や条件までは調べてませんが、僕はたまたまハマりました(;_:))
そんなときは。
Windowsの「C:\Users<user>」の直下に、「.wslconfig」というファイルを作って、以下のように記入して保存して、
[wsl2]
localhostForwarding=true
PowerShellを管理者権限で立ち上げて「wsl --shutdown」を実行してから、WindowsターミナルでUbuntuのbashを起動して設定を反映させます。
それで
「http://localhost:xxx」
でアクセスできるようになります。
ちなみに。
「http://localhost:xxx」
でアクセスできないとき一番に疑うべきなのは、Ubuntu上のNginxがエラーなくスタートできているかどうかですけどね。
スタートしているのにうまくいかないと相談されて見に行って「sudo nginx -t」してみると、設定ファイルにエラーがあった・・何てことは・・まま・・ありますので。
PHPを動かしたときの「502 Bad Gateway」エラー
これが発生したら、とりあえずエラーログを見ます。
less /var/log/nginx/error.log
エラーメッセージのパターンは、ほぼ以下の2通りが多いです。
connect() failed (111: Connection refused) while connecting to upstream
connect() to unix:/run/php/php8.1-fpm.sock failed (2: No such file or directory
ひとつめの「while connecting to upstream」エラー
僕の知る限り、このエラーの時は「php-fpm」サービスの立ち上げ忘れが多いです。
php-fpmはFastCGIのPHP実装です
FastCGIは「CGI]の高速版で、CGIというのはPHPをプログラムとして動かす仕組みです。
なので、FastCGIの実装である「php-fpm」が動いていないと、NginxからPHPを実行することはできなくて、このエラーになります。
service --status-all
でサービスの名前を調べて
sudo service php8.1-fpm start
みたいにします。
8.1のところは、ターゲットバージョンで変わりますのでご注意を。
ふたつめの「No such file or directory」エラー
文字通り、php-fpmがNginxからの要求をlistenするUNIXソケットファイル「php8.1-fpm.sock」がないのが原因です。
このファイルは、php-fpmの設定ファイル「/etc/php/8.1/fpm/pool.d/www.conf」(8.1の場合)の中で「listen = /run/php/php8.1-fpm.sock」と書かれていれば、php-fpmのサービス起動時に作成されるはずですが、それが失敗しているわけです。
このエラーになるケースの例をとして。
・php8.1を間違ってインストールしていて、それを「remove」して、後から「php-fpm」をインストールした場合
・www.confのlisten.ownerやlisten.groupを「www-data」以外(例えばnginx)に変更してしまている場合
などがあります。
これは「/run/php」フォルダのパーミッションが原因であることがほとんどのようです。
僕がやったとき、デフォルトで、listen.ownerやlisten.groupは「www-data」になってました。
それは「sudo apt install php-fpm」したときに、/runの下に「php」フォルダをowner・groupとも「www-data」で作成することを前提にしているからでした。
ところが、別のphpパッケージをインストールしていると、異なるowner・groupで「/run/php」フォルダが作成されてしまいます。
そのフォルダは「remove」しても消えません。(purgeが必要です)
それで、例えば「root」で作成された「/run/php」ディレクトリが残っていると、パーミッションの関係でインストール時にその下に「php8.1-fpm.sock」を作成できなかったりするわけです。
逆パターンで、www.confを変更して、listen.ownerやlisten.groupを「www-data」以外にしてしまった場合も、同じ理屈でパーミッションではじかれて「php8.1-fpm.sock」を作成できません。
それで「見当たらない」となってしまうというパターンです。
この場合は、とにかく、その前に間違ってインストールしてしまった設定ファイルやディレクトリを「purge」を使って消して、「php-fpm」をインストールしなおすのが早いです。
まとめ
レアかもしれませんが、ハマりやすいと僕が感じた例をいくつか書きました。
Nbinxとphp-fpm関係の記事はたくさんありますが、WSL2上のUbuntuと、サーバーのUbuntuでは異なる部分が多く、異なる切り口の情報が多すぎて、結構迷います。
なので、WSL2に特化してまとめておくことにします。
ではでは。