LoginSignup
0
0

More than 1 year has passed since last update.

WSL2/UbuntuでPHP-FPMとNginx連携のハマりどころ

Posted at

はじめに

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に特化してまとめておくことにします。
ではでは。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0