😸

PHARアーカイブをNginx+PHP-FPMで実行を行う

2024/08/22に公開

PHARアーカイブをNginx+PHP-FPMで実行を行う

はじめに

本記事では、DockerとDocker Composeを使用して、NginxとPHP-FPMを組み合わせたPHP実行環境を作成し、PHARアーカイブを実行する方法を紹介します。

プロジェクト構成

.
├── Dockerfile
├── docker-compose.yml
├── nginx
│   └── default.conf
└── src
    ├── composer.json
    ├── index.php
    └── index.phar (生成されるファイル)

環境構築

Dockerfile の作成

FROM php:8.2-fpm

RUN apt-get update && apt-get install -y \
    zip \
    unzip \
    git

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER=1

RUN git clone https://github.com/clue/phar-composer.git /usr/local/phar-composer \
    && cd /usr/local/phar-composer \
    && composer install \
    && ln -s /usr/local/phar-composer/bin/phar-composer /usr/local/bin/phar-composer

WORKDIR /var/www/html

RUN echo "security.limit_extensions = .php .phar" >> /usr/local/etc/php-fpm.d/www.conf
RUN echo "phar.readonly = Off" >> /usr/local/etc/php/conf.d/phar.ini

注目すべき点:

  • phar.readonly = Off: PHARの作成と実行を許可します。
  • security.limit_extensions = .php .phar: PHP-FPMがPHARファイルを実行できるようにします。

Nginx の設定ファイル作成

nginx/default.conf:

server {
    listen 80;
    server_name localhost;

    root /var/www/html;
    index index.php index.phar index.html;

    location / {
        try_files $uri $uri/ /index.phar$query_string;
    }

    location ~ \.(php|phar)(/.*)?$ {
        fastcgi_split_path_info ^(.+\.php|phar)(/.*)$;
        fastcgi_pass php-fpm:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

docker-compose.yml の作成

version: '3.8'

services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./src:/var/www/html
    depends_on:
      - php-fpm

  php-fpm:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./src:/var/www/html

PHPスクリプトの作成

src/index.php:

<?php
require 'vendor/autoload.php';

use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('GET', 'https://inet-ip.info/ip');
$body = $response->getBody();
$ip = trim($body);

echo "Your IP Address is: " . $ip;

composer.json の作成

src/composer.json:

{
    "require": {
        "guzzlehttp/guzzle": "^7.9"
    }
}

PHARアーカイブの作成

  1. 依存関係をインストールします:

    docker-compose run --rm php-fpm composer install
    
  2. PHARアーカイブを作成します:

    docker-compose run --rm php-fpm phar-composer build /var/www/html /var/www/html/index.phar
    
  3. 動作確認のために元のPHPファイルを削除します:

    docker-compose run --rm php-fpm rm /var/www/html/index.php
    

    この手順により、アプリケーションが確実にPHARアーカイブから実行されることを確認できます。

環境の起動と確認

  1. Docker環境を起動します:

    docker-compose up -d
    
  2. ブラウザで http://localhost:8080 にアクセスします。IPアドレスが表示されれば、環境が正しく構築されています。

まとめ

このプロジェクトでは、以下のことを実現しました:

  • DockerとDocker Composeを使用したNginx + PHP-FPM環境の構築
  • phar-composerを使用したPHPアプリケーションのPHARアーカイブ化
  • NginxでのPHARファイルの直接実行

主なポイント:

  • PHARアーカイブの使用によりアプリケーションの配布が容易に
  • Nginx + PHP-FPM構成による高いパフォーマンスと安定性
  • Dockerによる環境の一貫性と移植性の確保

おわりに

PHARアーカイブを使用することで、PHPアプリケーションの配布とデプロイが簡単になります。また、NginxとPHP-FPMの適切な設定により、PHARファイルを直接実行する環境を構築できました。

本記事で紹介した方法では、PHP-FPMの設定を調整してPHARファイルの実行を明示的に許可し、さらに元のPHPファイルを削除することで、アプリケーションが確実にPHARアーカイブから実行されていることを確認できます。

Discussion