環境構築詳細リファレンス

この詳細リファレンスでは、BEAR.Sunday 開発環境の各設定ファイルとオプションについて包括的に解説します。


malt 設定詳細

malt.json

{
  "services": {
    "php": {
      "version": "8.4",
      "extensions": ["mysql", "redis", "apcu"],
      "ini": {
        "memory_limit": "256M",
        "max_execution_time": "30",
        "display_errors": "On",
        "error_reporting": "E_ALL"
      }
    },
    "mysql": {
      "version": "8.0",
      "port": 3306,
      "data_dir": "malt/data/mysql",
      "config": "malt/conf/my_3306.cnf"
    },
    "redis": {
      "version": "latest",
      "port": 6379,
      "data_dir": "malt/data/redis"
    },
    "apache": {
      "version": "2.4",
      "port": 8080,
      "config": "malt/conf/httpd_8080.conf",
      "document_root": "public"
    },
    "nginx": {
      "version": "latest", 
      "port": 80,
      "config": "malt/conf/nginx_80.conf",
      "document_root": "public"
    }
  },
  "env": {
    "PATH": "malt/bin:${PATH}",
    "DB_HOST": "127.0.0.1",
    "DB_PORT": "3306",
    "REDIS_HOST": "127.0.0.1:6379"
  }
}

主要設定項目:

  • services.php.version: PHP バージョン (8.1, 8.2, 8.3, 8.4)
  • services.php.extensions: 自動インストールする PHP 拡張
  • services.mysql.port: MySQL ポート(デフォルト 3306)
  • services.redis.port: Redis ポート(デフォルト 6379)
  • env: プロジェクト固有の環境変数

MySQL 設定 (my_3306.cnf)

[client]
port = 3306
socket = /tmp/mysql_3306.sock
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
# 基本設定
port = 3306
socket = /tmp/mysql_3306.sock
datadir = malt/data/mysql
pid-file = malt/tmp/mysql_3306.pid
log-error = malt/logs/mysql_error.log

# 文字セット
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# パフォーマンス設定
innodb_buffer_pool_size = 128M      # InnoDB バッファプールサイズ
innodb_log_file_size = 64M          # InnoDB ログファイルサイズ(注:MySQL 8.0.30+ではinnodb_redo_log_capacityを使用)
innodb_flush_log_at_trx_commit = 2  # ログフラッシュ設定(開発用)
innodb_dedicated_server = OFF       # 開発環境では通常無効

# クエリキャッシュ(MySQL 8.0で廃止、5.7以前のみ)
# query_cache_type = 1              # クエリキャッシュ有効
# query_cache_size = 32M            # クエリキャッシュサイズ

# 接続設定
max_connections = 100               # 最大接続数
wait_timeout = 600                  # 待機タイムアウト
interactive_timeout = 600           # インタラクティブタイムアウト

# バイナリログ(レプリケーション用、開発では通常無効)
# log-bin = mysql-bin
# server-id = 1

# スロークエリログ
slow_query_log = 1
slow_query_log_file = malt/logs/mysql_slow.log
long_query_time = 2

# 一般クエリログ(デバッグ用、パフォーマンス影響大)
# general_log = 1
# general_log_file = malt/logs/mysql_general.log

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

設定項目詳細:

項目 説明 開発推奨値 本番推奨値
innodb_buffer_pool_size InnoDB データとインデックスをキャッシュ 128M-512M RAM の 50-80%
innodb_log_file_size トランザクションログサイズ 64M 256M-1G
innodb_flush_log_at_trx_commit ログフラッシュ頻度
0: 1秒毎
1: 毎トランザクション
2: 毎トランザクション(OS任せ)
2 (高速) 1 (安全)
query_cache_size クエリキャッシュサイズ(MySQL 5.7まで) 32M 64M-256M
max_connections 最大同時接続数 100 200-1000
slow_query_log スロークエリログ記録 1 (有効) 1 (有効)
long_query_time スロークエリ判定時間(秒) 2 1

PHP 設定 (php.ini)

[PHP]
; エラー表示(開発用)
display_errors = On
display_startup_errors = On
log_errors = On
error_log = malt/logs/php_error.log
error_reporting = E_ALL

; リソース制限
memory_limit = 256M
max_execution_time = 30
max_input_time = 60
upload_max_filesize = 64M
post_max_size = 64M
max_file_uploads = 20

; パフォーマンス
realpath_cache_size = 4M
realpath_cache_ttl = 600
opcache.enable = 1
opcache.enable_cli = 0
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 8000     # PHP 8.4推奨値(増加)
opcache.revalidate_freq = 2
opcache.save_comments = 1
opcache.enable_file_override = 0

; セッション
session.save_handler = files
session.save_path = malt/tmp/sessions
session.gc_maxlifetime = 1440
session.cookie_httponly = 1
session.cookie_secure = 0    # 開発用(HTTPSでは1に設定)
session.cookie_samesite = Lax    # 本番ではStrictを推奨

; 日本語設定
default_charset = UTF-8
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
date.timezone = Asia/Tokyo

[xdebug]
; Xdebug 3.x 設定(パフォーマンス影響のため通常はコメントアウト)
; xdebug.mode = debug
; xdebug.start_with_request = yes
; xdebug.client_host = 127.0.0.1
; xdebug.client_port = 9003
; xdebug.log = malt/logs/xdebug.log

[xhprof]
; XHProf 設定(パフォーマンス影響のため通常はコメントアウト)
; xhprof.output_dir = malt/tmp/xhprof

設定項目詳細:

項目 説明 開発推奨値 本番推奨値
memory_limit PHP スクリプトの最大メモリ使用量 256M 128M-512M
max_execution_time スクリプト最大実行時間(秒) 30 30
upload_max_filesize アップロード可能な最大ファイルサイズ 64M 用途に応じて
opcache.memory_consumption OPcache メモリ使用量(MB) 128 256-512
opcache.revalidate_freq ファイル更新チェック間隔(秒) 2 60
realpath_cache_size パスキャッシュサイズ 4M 16M
session.gc_maxlifetime セッション有効期限(秒) 1440 1440

Apache 設定 (httpd_8080.conf)

# 基本設定
ServerRoot malt/apache
PidFile malt/tmp/httpd_8080.pid
Listen 127.0.0.1:8080
ServerName localhost:8080

# モジュール(パスは環境に応じて調整)
# macOS Homebrew の例: /opt/homebrew/lib/httpd/modules/
# Ubuntu/CentOS の例: /usr/lib/apache2/modules/ または /usr/lib64/httpd/modules/
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule php_module modules/libphp.so
LoadModule dir_module modules/mod_dir.so

# PHP
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

# ドキュメントルート
DocumentRoot "public"
<Directory "public">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
    
    # URL書き換え
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php [QSA,L]
</Directory>

# ログ
ErrorLog malt/logs/apache_error.log
CustomLog malt/logs/apache_access.log combined
LogLevel warn

# セキュリティ
ServerTokens Prod
ServerSignature Off

# パフォーマンス
<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/css text/javascript application/javascript application/json
</IfModule>

# キャッシュ
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 month"
    ExpiresByType image/png "access plus 1 month"
    ExpiresByType image/jpg "access plus 1 month"
    ExpiresByType image/jpeg "access plus 1 month"
    ExpiresByType image/gif "access plus 1 month"
</IfModule>

Nginx 設定 (nginx_80.conf)

# 基本設定
# ユーザーは環境に応じて調整(Ubuntu: www-data, CentOS: nginx, macOS: _www)
user www-data;  # または nginx, _www など
worker_processes auto;
pid malt/tmp/nginx.pid;
error_log malt/logs/nginx_error.log;

events {
    worker_connections 1024;
    use epoll;
}

http {
    # 基本設定
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    client_max_body_size 64M;
    
    # MIME タイプ
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    
    # ログ形式
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                   '$status $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" "$http_x_forwarded_for"';
    
    access_log malt/logs/nginx_access.log main;
    
    # Gzip 圧縮
    gzip on;
    gzip_vary on;
    gzip_min_length 1000;
    gzip_types
        text/plain
        text/css
        text/xml
        text/javascript
        application/javascript
        application/json
        application/xml+rss;
    
    # サーバー設定
    server {
        listen 127.0.0.1:80;
        server_name localhost;
        root public;
        index index.php index.html;
        
        # アクセスログ
        access_log malt/logs/nginx_site_access.log;
        error_log malt/logs/nginx_site_error.log;
        
        # PHP処理
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
        
        # URL書き換え(BEAR.Sunday)
        location / {
            try_files $uri $uri/ @rewrite;
        }
        
        location @rewrite {
            rewrite ^(.*)$ /index.php last;
        }
        
        # 静的ファイルキャッシュ
        location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
            expires 1M;
            add_header Cache-Control "public, immutable";
        }
        
        # セキュリティ
        location ~ /\. {
            deny all;
        }
        
        location ~* \.(md|lock|json|xml|yml|yaml|log)$ {
            deny all;
        }
    }
}

Docker 設定詳細

docker-compose.yml(本格版)

version: '3.8'

services:
  php:
    build:
      context: .
      dockerfile: docker/php/Dockerfile
    volumes:
      - .:/var/www/html
      - ./docker/php/php.ini:/usr/local/etc/php/conf.d/custom.ini
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_started
    environment:
      - DB_HOST=mysql
      - DB_PORT=3306
      - REDIS_HOST=redis:6379
    networks:
      - bear-network

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - .:/var/www/html
      - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./docker/nginx/ssl:/etc/nginx/ssl
    depends_on:
      - php
    networks:
      - bear-network

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-secret}
      MYSQL_DATABASE: ${DB_NAME:-myapp}
      MYSQL_USER: ${DB_USER:-user}
      MYSQL_PASSWORD: ${DB_PASSWORD:-password}
    ports:
      - "${DB_PORT:-3306}:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./docker/mysql/my.cnf:/etc/mysql/conf.d/custom.cnf
      - ./docker/mysql/init:/docker-entrypoint-initdb.d
    command: >
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci
      --default-authentication-plugin=mysql_native_password
      --innodb-buffer-pool-size=256M
      --innodb-log-file-size=128M
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s
    networks:
      - bear-network

  redis:
    image: redis:alpine
    ports:
      - "${REDIS_PORT:-6379}:6379"
    volumes:
      - redis_data:/data
      - ./docker/redis/redis.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 3
    networks:
      - bear-network

  memcached:
    image: memcached:alpine
    ports:
      - "${MEMCACHED_PORT:-11211}:11211"
    command: ["-m", "64"]
    networks:
      - bear-network

  # 開発用ツール
  phpmyadmin:
    image: phpmyadmin:latest
    environment:
      PMA_HOST: mysql
      PMA_PORT: 3306
    ports:
      - "8080:80"
    depends_on:
      mysql:
        condition: service_healthy
    networks:
      - bear-network

  redis-commander:
    image: rediscommander/redis-commander:latest
    environment:
      REDIS_HOSTS: local:redis:6379
    ports:
      - "8081:8081"
    depends_on:
      - redis
    networks:
      - bear-network

volumes:
  mysql_data:
    driver: local
  redis_data:
    driver: local

networks:
  bear-network:
    driver: bridge

Docker PHP Dockerfile

FROM php:8.4-fpm-alpine

# システム依存関係のインストール
RUN apk add --no-cache \
    git \
    curl \
    libpng-dev \
    oniguruma-dev \
    libxml2-dev \
    libzip-dev \
    freetype-dev \
    libjpeg-turbo-dev \
    icu-dev \
    autoconf \
    g++ \
    make

# PHP 拡張のインストール
RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install \
        pdo_mysql \
        mysqli \
        mbstring \
        exif \
        pcntl \
        bcmath \
        gd \
        zip \
        intl \
        opcache

# Redis 拡張
RUN pecl install redis \
    && docker-php-ext-enable redis

# APCu 拡張
RUN pecl install apcu \
    && docker-php-ext-enable apcu

# Xdebug(開発時のみ)
ARG INSTALL_XDEBUG=false
RUN if [ ${INSTALL_XDEBUG} = true ]; then \
    pecl install xdebug \
    && docker-php-ext-enable xdebug; \
fi

# Composer のインストール
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# 作業ディレクトリ設定
WORKDIR /var/www/html

# ユーザー設定
RUN addgroup -g 1000 -S www \
    && adduser -u 1000 -S www -G www

# 権限設定
RUN chown -R www:www /var/www/html
USER www

EXPOSE 9000

CMD ["php-fpm"]

本番環境最適化設定

PHP 本番設定

[PHP]
; セキュリティ
expose_php = Off
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php/error.log

; パフォーマンス
memory_limit = 128M
max_execution_time = 30
realpath_cache_size = 16M
realpath_cache_ttl = 3600

; OPcache(本番最適化)
opcache.enable = 1
opcache.enable_cli = 0
opcache.memory_consumption = 512
opcache.interned_strings_buffer = 64
opcache.max_accelerated_files = 32531
opcache.revalidate_freq = 60
opcache.validate_timestamps = 0
opcache.save_comments = 0
opcache.enable_file_override = 1

; セッション(Redis使用)
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"
session.gc_maxlifetime = 3600
session.cookie_secure = 1
session.cookie_httponly = 1
session.cookie_samesite = Strict
session.use_strict_mode = 1      # セッションIDの厳密モード

MySQL 本番設定

[mysqld]
# パフォーマンス最適化
innodb_buffer_pool_size = 2G
innodb_log_file_size = 512M         # MySQL 8.0.30+ではinnodb_redo_log_capacityを使用
innodb_redo_log_capacity = 512M     # MySQL 8.0.30+ 新しいredo log設定
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_dedicated_server = ON        # MySQL 8.0.3+ サーバー専用最適化

# 接続設定
max_connections = 500
thread_cache_size = 50
table_open_cache = 4000

# クエリキャッシュ(MySQL 5.7まで、8.0では廃止)
# query_cache_type = 1
# query_cache_size = 128M

# バイナリログ
log-bin = mysql-bin
binlog_format = ROW
expire_logs_days = 7

# セキュリティ
skip-name-resolve
local-infile = 0

パフォーマンス監視設定

New Relic 設定例

; New Relic PHP エージェント
extension = newrelic.so
newrelic.license = "YOUR_LICENSE_KEY"
newrelic.appname = "BEAR.Sunday App"
newrelic.daemon.address = "/tmp/.newrelic.sock"
newrelic.logfile = "/var/log/newrelic/php_agent.log"
newrelic.loglevel = "info"

Xdebug プロファイリング設定

# プロファイリング実行例
php -dzend_extension=xdebug.so \
    -dxdebug.mode=profile \
    -dxdebug.output_dir=/tmp/xdebug \
    -dxdebug.profiler_output_name=cachegrind.out.%p \
    script.php

XHProf 設定例

<?php
// XHProf プロファイリング開始
if (extension_loaded('xhprof')) {
    xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}

// アプリケーション実行
// ...

// プロファイリング結果保存
if (extension_loaded('xhprof')) {
    $xhprof_data = xhprof_disable();
    $xhprof_runs = new XHProfRuns_Default();
    $run_id = $xhprof_runs->save_run($xhprof_data, "myapp");
    echo "XHProf Run ID: {$run_id}\n";
}
?>

トラブルシューティング詳細

ログ分析

# PHP エラーログ分析
tail -f malt/logs/php_error.log | grep -E "(Fatal|Error|Warning)"

# MySQL スロークエリ分析
mysqldumpslow -s t -t 10 malt/logs/mysql_slow.log

# Apache/Nginx アクセスログ分析
awk '{print $1}' malt/logs/apache_access.log | sort | uniq -c | sort -nr

パフォーマンス測定

# Apache Bench テスト
ab -n 1000 -c 10 http://localhost:8080/

# シンプルな負荷テスト
for i in {1..100}; do
    curl -w "@curl-format.txt" -o /dev/null -s http://localhost:8080/
done

この詳細リファレンスは、開発チームが BEAR.Sunday 環境を深く理解し、適切にカスタマイズするための包括的なガイドです。