LoginSignup
18
20

Dockerで環境構築(php-fpm+nginx)

Last updated at Posted at 2024-02-24

はじめに

初めまして!
エンジニアになって数年、今まで本を読むだけでしたが、もっとプライベートで楽しみながら成長したい!自分が学んだ足跡を残していきたい!と思い記事をかきました!
最終的には自在に開発できるようになりたいと思っています。:triumph:
いろいろな記事を参考にさせてもらっています。:bow_tone2:
その中でもこれってどういう意味?とかつまづいたところを念入りに書いていこうかと思います。:fist:

今回の目的

今回はこちらの記事で調べていた内容を実践してみたいと思い別の記事として作成しました!

「php:<version>-apache」は初歩のチュートリアルで使っていたような気がするけど、「php:<version>-fpm」というものは何ぞや、実際に動かせばなんかスッキリするかも?となったのが経緯です!

作成した環境

使用したものや事前準備

・Macbook Pro
・Docker
・Visual Studio Code
・PHP
・nginx

主に参考にさせていただいた記事

他参考サイト含めて本文でも紹介します!:fist:

FPMとnginxって?

実際に構築チャレンジしようにも、FPMとnginxって何を意味しているの?となったので自分なりに調べてみました。

FPM

FastCGI Process Managerの略称です。

・FastCGIとは
「プロセスの起動/終了」を省略し、従来のCGIよりも高速化やCPU負荷の軽減で優れている。モジュール版PHPと速度は同等。

※モジュール版PHPとは・・・WebサーバーのプロセスのなかでPHPを実行するという意味で高速な反面セキュリティ面に不安がある

・CGIとは
動的なページ作成に必要な仕組み。従来のCGIには弱みがあり、リクエストのたびに新しいプロセスを起動するため、大規模環境では負荷が大きく性能向上の妨げとなっている。Apacheが標準でサポートしているが、nginxはサポートしていない。
nginxはサポートしていない代わりにFastCGIなどのプロトコルを使用して、バックエンドのプロセス(FastCGI)と通信し効率的に処理をする。

nginx

エンジンエックスと読みます。Apacheと同様、Webサーバーです。
2022年に一位だったApacheとシェアが逆転したようです。
単体なら静的なページを返すのに使います。(スタイルシートやJSなどブラウザにそのまま返すもの)
下記の記事が読みやすいので紹介程度で止めておきます。

コンテナ内探索

なんとなく概要がつかめたところで、php:<version>-fpmとnginxのDockerイメージで環境構築をしていきます。
パパッとやってやるぜ〜って思いましたが、思ったより理解できていなかったので単体イメージで何を設定していくといいのかをみていきます。

php:<version>-fpm

あまり見るところはなかったですが、phpファイルを配置する場所を確認しておきましょう。
/var/www/htmlにphpファイルが配置されるようにするとよさそうですね。

docker container run -it --rm php:8.3-fpm-bookworm /bin/bash

ただここら辺ですが、フレームワーク入れたい時とか静的ファイルとか構成や配置どうなるの?というのが疑問点。
以下の記事が大変参考になりそうので興味ある方はこちらにどうぞ。:point_down:

nginx

FastCGI設定が難しそうです。下記を参考に確認していきます。

コンテナを立ち上げて中に入ります。

docker container run -it --rm nginx:1.25.4-bookworm /bin/bash

検証に必要なコマンドをインストールしておきます。

apt update
apt install -y vim
apt install -y tree

検証箇所へ移動し構成を確認をしましょう。

cd /etc/nginx/
tree /etc/nginx/

スクリーンショット 2024-02-24 11.50.22.png

今回は、default.confとfastcgi_paramsをマウントして対応していきます。
他のサイトを見ると、nginx.confを編集したりしていたりまだまだやらなくてはいけないことも多そうです。

fastcgi_paramsは、参考サイトの方が設定値多いのでとりあえずそちらを使います。

cat /etc/nginx/fastcgi_params 

default.confは、参考サイトのほかに、listenやrootは最低限、必要そうです。

cat /etc/nginx/conf.d/default.conf

またnginxはmainlineとstableがあります。
stableはサポート終了後にmainlineへ取り込まれるので、なるべくmainlineのバージョンを選択しましょう。

Dockerで環境構築

作業PCのディレクトリ構成はこんな感じ。先ほどの内容をこちらに反映させます。

スクリーンショット 2024-02-24 17.50.53.png

test.php

参考サイトのまま使いましょう。index.phpは自由です。

compose.yml

nginxのポートを開いて、経由でapiコンテナのphpファイルを返却します。
networksを設定してコンテナ間の通信のみに制限しています。コンテナが増えてきたらそれぞれで制限をかけていきたい。

version: '3'
services:
  nginx:
    image: nginx:1.25.4-bookworm
    ports:
      - 8080:80
    volumes:
      - ./nginx/fastcgi_params:/etc/nginx/fastcgi_params
      - ./nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - app
    networks:
      - app-network
  app:
    image: php:8.3-fpm-bookworm
    volumes:
      - ./app:/var/www/html
    networks:
      - app-network 

networks:
  app-network:
    driver: bridge

default.conf

rootをphp:<version>-fpmコンテナに対応させています。
【api:9000;】のような記述は、左が「compose.ymlに記載しているサービス名(コンテナ名)」になります。DBコンテナに接続する時にも使うので覚えておきたいです。

server {
    listen       80;
    server_name  localhost;
    root /var/www/html;
    location / {
       fastcgi_param HTTP_PROXY "";
       fastcgi_pass api:9000;
       fastcgi_index index.php;
       include fastcgi_params;
    }
    location ~ [^/]\.php(/|$) {
       fastcgi_param HTTP_PROXY "";
       fastcgi_pass api:9000;
       include fastcgi_params;
    }
}

fastcgi_params

参考サイトと同様です。

fastcgi_param   QUERY_STRING            $query_string;
fastcgi_param   REQUEST_METHOD          $request_method;
fastcgi_param   CONTENT_TYPE            $content_type;
fastcgi_param   CONTENT_LENGTH          $content_length;

fastcgi_param   SCRIPT_FILENAME         $document_root$fastcgi_script_name;
fastcgi_param   SCRIPT_NAME             $fastcgi_script_name;
fastcgi_param   PATH_INFO               $fastcgi_path_info;
fastcgi_param   PATH_TRANSLATED         $document_root$fastcgi_path_info;
fastcgi_param   REQUEST_URI             $request_uri;
fastcgi_param   DOCUMENT_URI            $document_uri;
fastcgi_param   DOCUMENT_ROOT           $document_root;
fastcgi_param   SERVER_PROTOCOL         $server_protocol;

fastcgi_param   GATEWAY_INTERFACE       CGI/1.1;
fastcgi_param   SERVER_SOFTWARE         nginx/$nginx_version;

fastcgi_param   REMOTE_ADDR             $remote_addr;
fastcgi_param   REMOTE_PORT             $remote_port;
fastcgi_param   SERVER_ADDR             $server_addr;
fastcgi_param   SERVER_PORT             $server_port;
fastcgi_param   SERVER_NAME             $server_name;

fastcgi_param   HTTPS                   $https;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param   REDIRECT_STATUS         200;

コンテナ起動&アクセス

docker compose up -d

起動したらアクセスしてみましょう。
http://localhost:8080/test.php

下記の画像のような情報が改行なしで表示されたら成功です!

スクリーンショット 2024-02-24 18.47.12.png

最後に

今回はなんとか動くレベルまでいけました。途中でnginxからphp呼べなくて数時間、頭の中を猫ミームが流れていました・・・。
参考にしたサイトも多いので、上で紹介できていないサイトを書けるだけ書いておきます!ぜひご参考ください!

参考

おまけ

より広く構築してみました

18
20
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
18
20