docker composeでNginxとPHP-FPMの環境構築 | アントレプログラマー

docker composeでNginxとPHP-FPMの環境構築

Docker

こんにちは、ニキです。

この記事はこんな方におすすめです。

  • docker composeやNginx の基本的なことは分かる。
  • NginxとPHP-FPMをFastCGIで通信したい
  • SSL通信できるようにしたい。

今回の記事では、NginxとPHP-FPMをFastCGIで通信する方法を解説します。

Takaharu Niki

・Webエンジニア5年目。
・バックエンドを中心に、フロントエンドやDevOps業務も経験。
・現在は、自社サービス企業のテックリードとして従事。

Takaharu Nikiをフォローする

PHP-FPMとは

PHP-FPMはFastCGIを実装しています。

FastCGIはプロトコル。つまり、通信手段です。

PHPのWebサーバーとしてNginxと通信するには、FastCGIを使用する必要があります。

PHP-FPMについての詳細は以下のページで紹介されています。 https://php-fpm.org/

PHP-FPMのDockerイメージの選び方

イメージのバリエーション

  • php:<version>-cli
  • php:<version>-apache
  • php:<version>-fpm
  • php:<version>-alpine

php:8.2-fpm-alpine のような組み合わせたイメージもあります。

このほかにも、bullseye等のDebianベースのイメージもあり、軽量化の手段として利用されます。

イメージの選び方

今回はphp-fpmは必須なので、以下のどれかにします。

  • php:<version>-fpm ← production向き
  • php:<version>-fpm-alpine ← 開発環境向き。パッケージの要件やパフォーマンスの面で、本番に使えるかは要検討です。
  • php:<version>-fpm-bullseye ← 開発環境・本番環境共に使えます。

今回は、開発環境を想定しているので、php:<version>-fpm-aplineを選択します。

PHPのDockerイメージについてはDockerHubに詳しい説明があります。

https://hub.docker.com/_/php

NginxとPHP-FPMの環境の設定

default.confの作成

default.confを作成します。https://localhost:8443/index.phpへのリクエストをNginxコンテナが受け取り、PHPコンテナの/var/www/html/index.phpをレスポンスする設定です。

server {
    listen 443 ssl;
    server_name localhost;
    ssl_certificate     /etc/nginx/conf.d/localhost.pem;
    ssl_certificate_key /etc/nginx/conf.d/localhost-key.pem;
    root /var/www/html;

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

秘密鍵とSSL証明書を新たに用意するなら以下の記事が参考になります。

compose.yamlの作成

動作確認用のindex.phpを作成します。

<?php

echo 'Hello PHP-FPM';

compose.yamlを作成します。

services:
  nginx:
    image: nginx:1.25.1-alpine-slim
    container_name: nginx
    ports:
      - 8443:443
    volumes:
      - $PWD/default.conf:/etc/nginx/conf.d/default.conf
      - $PWD/localhost.pem:/etc/nginx/conf.d/localhost.pem
      - $PWD/localhost-key.pem:/etc/nginx/conf.d/localhost-key.pem
  php:
    image: php:8.2.8-fpm-alpine3.18
    container_name: php
    volumes:
      - $PWD/index.php:/var/www/html/index.php

NginxとPHP-FPM環境の動作確認

コンテナを作成・起動します。

% docker compose up -d

コンテナのリストを確認します。

% docker compose ps 

以下のように表示されていればOKです。

% docker compose ps
NAME                IMAGE                      COMMAND                  SERVICE             CREATED             STATUS              PORTS
nginx               nginx:1.25.1-alpine-slim   "/docker-entrypoint.…"   nginx               8 minutes ago       Up 8 minutes        80/tcp, 0.0.0.0:8443->443/tcp
php                 php:8.2.8-fpm-alpine3.18   "docker-php-entrypoi…"   php                 8 minutes ago       Up 8 minutes        9000/tcp

https://localhost:8443/index.phpへアクセスします。以下のように表示されていればOKです。

Hello PHP-FPM

PHP-FPMのポート確認方法

9000番ポートの設定は、PHPコンテナ内で確認できます。

# cat /usr/local/etc/php-fpm.d/www.conf | grep 9000

以下のような表示を確認できます。

listen = 127.0.0.1:9000

参考

https://hub.docker.com/_/php

https://nginx.org/en/docs/http/configuring_https_servers.html

まとめ

今回の記事では、NginxとPHP-FPMをFastCGIで通信する方法を解説しました。

効率的に学習するならプログラミングスクールの検討もありです。

さらに詳しく学びたい方は、以下の書籍がおすすめです。

Docker/Kubernetes 実践コンテナ開発入門

コンテナ技術をこれから学びたい方、あるいはすでに基本的な知識を持っているが実践的なスキルを伸ばしたい方に最適な書籍です。この書籍では、Dockerの基本操作から始まり、Kubernetesでのクラスタ管理、サービスの自動化、スケーリング、ネットワークの設定といった高度な内容に至るまで、手厚くガイドしてくれます。

nginx実践入門

Nginxの構築と運用に関する幅広い知識を得られます。リアルなユースケースを元にした具体例が豊富に紹介されており、初心者から上級者まで、あらゆるレベルのエンジニアにとって実際の問題解決に役立ちます。

Takaharu Niki

・Webエンジニア5年目。
・バックエンドを中心に、フロントエンドやDevOps業務も経験。
・現在は、自社サービス企業のテックリードとして従事。

Takaharu Nikiをフォローする
Docker
Takaharu Nikiをフォローする
アントレプログラマー
タイトルとURLをコピーしました