SE_BOKUのITな日常

SE_BOKUが知ってること・勉強したこと・考えたことetc

WSL2のUbuntu20.04LTSにインストールしたNginx・php-fpm(php8.1)を開発用に初期設定

目次

WSL2のUbuntu20.04LTSにインストールしたNginx・php-fpm(php8.1)の初期設定

WebサーバーNginxとphp8,1を連携して動かす設定をします。

WSL2:Ubuntu20.04LTSに、以下の記事でインストールしたところからの続きです。

arakan-pgm-ai.hatenablog.com

PHPとWebサーバーの連携について

設定する前に、PHPとWebサーバーの連携の仕方を確認します。

大きくわけて2通りあります。

  • PHPモジュールモード
  • CGIモード

です。

PHPモジュールモード

PHPモジュールモードはApacheのモジュール版のことです。

PHPモジュールモードではPHPはrootユーザで実行されます。

Webサーバーのプロセスの中で実行されるので高速化が期待できます。

ですが、rootで実行されることで共用サーバーなどでは他のユーザのファイルが参照できてしまうというセキュリティ面での不安要素ももってます。

CGIモード

CGIは「Common Gateway Interface」の略です。

NginxはCGIモードしか使えません。

CGIモードは、Webサーバープログラムを実行する仕組みでPHPを実行します。

ユーザー権限でPHPを実行し、Webサーバーと別のプロセスになるので、セキュリティ的には気を遣う部分が少ないですし、ディレクトリごとにPHPのバージョンなどを変えることができるなど、運用の柔軟性もあります。

従来のCGIだとPHPの読み込みを行い別プロセスで実行するオーバーヘッドが馬鹿にならないので、仕組み的に遅いといわれてました。

ですが、その欠点をカバーするため、立ち上がったプロセスを終了させることなく保持することで、処理の高速化、負荷軽減を実現するFastCGIが考案されたので、その問題もほぼ解消しています。

Nginx・php-fpmの設定

今回はNginxをWebサーバーに使います。

PHPとの連携には「FastCGI」を使います。

php-fpmはFastCGIPHP実装です。

ちなみに、「php-fpm」のFPMは「 FastCGI Process Manager」の略です。

ドキュメントルート・ポートなどを決める

WSL2で使う目的は「開発環境」なので、 $HOMEi以下でHTMLやPHPを編集してデプロイ無しですぐ実行できないと不便です。

($HOMEの部分は自分の環境に読み替えてください)

Nginxの使うポートをデフォルトの「80」とかにすると、他(Windowsにも他の言語とかはいっているので)とバッティングする可能性があるので避けることにします。

ということで。

今回は以下のようにします。

  • ドキュメントルート: $HOME/www/htdocs
  • アドレス:localhost
  • ポート:8099

あと、準備として「PHP8.1」のパスも調べておきます。

 which php8.1

結果は「/usr/bin/php8.1」でした。

設定ファイルの場所を確認

設定ファイルの場所を確認しておきます。

僕の環境(WSL2:Ubuntu20.04LTS)ではPHPの設定ファイルは以下でした。

/etc/php/8.1/fpm

同様に、Nginxの設定ファイルは以下でした。

/etc/nginx

php-fpmの設定

動かすだけなら、設定ファイルの修正はいりません。

なので、Nginxの設定時に必要な情報を確認するだけです。

僕の環境だと「/etc/php/8.1/fpm/php-fpm.conf」の最後の方に以下の記述があります。

include=/etc/php/8.1/fpm/pool.d/*.conf

設定を「pool.d」以下の拡張子「conf」ファイルから読み込んでいます。

その情報をもとに「pool.d」以下を見ると、www.confがありました。

「/etc/php/8.1/fpm/pool.d/www.conf」の中を見ます。

真ん中あたりに「Listen」の記載があります。

listen = /run/php/php8.1-fpm.sock

この「/run/php/php8.1-fpm.sock」がnginxの設定で必要になる情報です。

確認したら、php-fpmのサービスをスタートします。

sudo service php8.1-fpm start

ちゃんと動いていれば、ここで上記の「php8.1-fpm.sock」が生成されます。

nginxの設定

nginx.confにきちんと記述すべきと思いつつ、今回は手抜きで以下のファイルに記載されているデフォルトを直接修正することにします。

エディタは「vim」を「sudo vim」して使いました。

/etc/nginx/sites-enabled/default

変更点だけ書きます。

まず、ポートです。

  listen 8099 default_server;
  listen [::]:8099 default_server;

としてポートをデフォルトの「80」から変更しました。

 

ドキュメントルートも

 root /home/boku/www/htdocs;

としてデフォルト「/var/www/html」から変更しました。

 

そして、以下の部分がコメントになっているのをはずして、fastcgi_passの赤字の部分を先ほど確認したlistenのパス「/run/php/php8.1-fpm.sock」に書き換えます。

  location ~ \.php$ {
                include snippets/fastcgi-php.conf;

                # With php-fpm (or other unix sockets):
                #fastcgi_pass unix:/run/php/php8.1-fpm.sock;
                # With php-cgi (or other tcp sockets):
                fastcgi_pass 127.0.0.1:9000;
   }

これで上書き保存します。

 

設定のテストをします。

sudo nginx -t

大丈夫ですね。

ここまでできたら、Nginxをスタート、すでに動いている場合はリスタートします。

sudo service nginx start

すでに動いていた場合は

sudo service nginx restart

でもいいです。

上記の手順通りで大丈夫なのですが、うまくいかない場合もありえます。

その対処方法については、Qiitaのほうに書いているので、そちらのリンクをはっておきます。

qiita.com

上記記事にもちらっと書いているのですが、少し補足します。

実は、WSL2ではないUbuntuを対象にした記事だと、以下のように修正すべき書いてあることがよくあります。 

user = nginx
group = nginx

listen.owner = nginx
listen.group = nginx
listen.mode = 0660

これはWSL2のUbuntuだとうまくいきません。

WSL2では以下のようになっているデフォルトを変更してはいけないです。

user = www-data
group = www-data

listen.owner = www-data
listen.group = www-data
;listen.mode = 0660

理由は、php-fpmをインストールしたときに、/etc/phpフォルダが、www-dataユーザで作成されるからです。

なので、それ以外の権限だと「php8.1-fpm.sock」がうまく作成されません。

簡単なphpソースを書いて動作確認

ドキュメントルートを変えてしまっているので、urlにアクセスしてもおなじみのWelcome画面はでません。

動作確認のため、適当なHTMLとPHPを作って表示テストをします。

まずは「index.html」

<html>
<head>
    <meta charset="UTF-8">
</head>

<body>
    <h1>表示テスト</h1>
</body>

OKです。

次に「info.php

<?php
phpinfo();
?>

実行します。

大丈夫そうです。

ではでは。