PHP アプリケーション向け New Relic APM 設定ガイド

PHP アプリケーションでの New Relic APM 導入は、Web アプリケーションの包括的な監視と最適化を実現します。PHP エージェントは、PHP エンジンレベルでの統合により、Laravel、Symfony、WordPress などの主要フレームワークとCMSを自動的に監視対象とできます。

PHP エージェントの特徴

PHP エージェントの概要

New Relic PHP エージェントは、Zend Engine の拡張機能として動作し、PHP の実行時動作を詳細に監視します。既存のアプリケーションコードを変更することなく、関数呼び出し、データベースクエリ、外部API呼び出しを自動的に追跡します。

エージェントは以下の情報を自動的に収集します:

  • HTTP リクエストとレスポンスの処理時間
  • データベースクエリの実行時間
  • フレームワーク固有の処理(ルーティング、ミドルウェア等)
  • エラーとスタックトレース

事前準備

システム要件

  • PHP バージョン: 7.4 以降(PHP 8.2+ 推奨)
  • Web サーバー: Apache 2.4+、Nginx 1.18+、IIS 10+
  • PHP SAPI: mod_php、PHP-FPM、CGI、CLI
  • オペレーティングシステム: Linux (Ubuntu 20.04+, RHEL 8+)、macOS 12+、Windows Server 2019+

サポートフレームワーク:

  • Laravel: 8.x, 9.x, 10.x, 11.x
  • Symfony: 5.x, 6.x, 7.x
  • WordPress: 5.8+
  • Drupal: 9.x, 10.x
  • CodeIgniter: 4.x

PHP エージェントを導入する前に、以下の要件を確認してください:

  • PHP 7.0 以降(PHP 8.x 推奨)
  • Web サーバー: Apache、Nginx、IIS
  • PHP SAPI: mod_php、PHP-FPM、CGI
  • 必要な権限: PHP 拡張機能のインストール権限

New Relic アカウントの準備

New Relic のアカウント作成とライセンスキーの取得が必要です。アカウント作成後、「APM & Services」から新しいアプリケーションを追加し、PHP を選択してライセンスキーを取得してください。

エージェントのインストール

Linux(Ubuntu/Debian)でのインストール

bash
# New Relic リポジトリの追加
echo 'deb http://apt.newrelic.com/debian/ newrelic non-free' | sudo tee /etc/apt/sources.list.d/newrelic.list
wget -O- https://download.newrelic.com/548C16BF.gpg | sudo apt-key add -

# パッケージの更新とインストール
sudo apt-get update
sudo apt-get install newrelic-php5

# 設定スクリプトの実行
sudo newrelic-install install

Linux(CentOS/RHEL)でのインストール

bash
# RHEL/CentOS/Amazon Linux 2 用の最新リポジトリ
# GPGキーの追加
sudo rpm --import https://download.newrelic.com/infrastructure_agent/gpg/newrelic-infra.gpg

# リポジトリの追加
sudo tee /etc/yum.repos.d/newrelic-infra.repo <<EOF
[newrelic-infra]
name=New Relic Infrastructure
baseurl=https://download.newrelic.com/infrastructure_agent/linux/yum/el/\$releasever/\$basearch
enabled=1
gpgcheck=1
gpgkey=https://download.newrelic.com/infrastructure_agent/gpg/newrelic-infra.gpg
EOF

# エージェントのインストール
sudo yum update -y
sudo yum install -y newrelic-php5

# 設定スクリプトの実行
sudo newrelic-install install

手動インストール

RPMやDEBパッケージが使用できない環境では、手動インストールも可能です:

bash
# Ubuntu/Debian 用の最新リポジトリ
# GPGキーの追加
wget -O - https://download.newrelic.com/infrastructure_agent/gpg/newrelic-infra.gpg | sudo gpg --dearmor -o /usr/share/keyrings/newrelic-infra-archive-keyring.gpg

# リポジトリの追加
echo "deb [signed-by=/usr/share/keyrings/newrelic-infra-archive-keyring.gpg] https://download.newrelic.com/infrastructure_agent/linux/apt $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/newrelic-infra.list

# パッケージリストの更新とインストール
sudo apt-get update
sudo apt-get install -y newrelic-php5

# 設定スクリプトの実行
sudo newrelic-install install

Docker コンテナでのインストール

dockerfile
# マルチステージビルドでセキュリティ強化
FROM php:8.3-apache AS base

# セキュリティアップデートと必要パッケージ
RUN apt-get update && apt-get install -y --no-install-recommends \
    curl \
    unzip \
    ca-certificates \
    gnupg \
    && rm -rf /var/lib/apt/lists/*

# New Relic PHP エージェントの最新版インストール
RUN curl -L "https://download.newrelic.com/php_agent/release/newrelic-php5-10.20.0.0-linux.tar.gz" \
    -o /tmp/newrelic.tar.gz \
    && tar -C /tmp -zxf /tmp/newrelic.tar.gz \
    && NR_INSTALL_USE_CP_NOT_LN=1 NR_INSTALL_SILENT=1 \
       /tmp/newrelic-php5-*/newrelic-install install \
    && rm -rf /tmp/newrelic* /tmp/nrinstall*

# 本番用コンテナ
FROM php:8.3-apache AS production

# セキュリティ強化: 非特権ユーザー作成
RUN groupadd -r phpuser && useradd -r -g phpuser -d /var/www -s /bin/bash phpuser

# New Relic エージェントをコピー
COPY --from=base /usr/local/lib/php/extensions/ /usr/local/lib/php/extensions/
COPY --from=base /usr/local/etc/php/conf.d/newrelic.ini /usr/local/etc/php/conf.d/

# PHP設定ファイルの作成(セキュリティ強化)
RUN echo "extension=newrelic.so" > /usr/local/etc/php/conf.d/99-newrelic.ini && \
    echo "newrelic.enabled = true" >> /usr/local/etc/php/conf.d/99-newrelic.ini && \
    echo "newrelic.distributed_tracing_enabled = true" >> /usr/local/etc/php/conf.d/99-newrelic.ini && \
    echo "newrelic.span_events_enabled = true" >> /usr/local/etc/php/conf.d/99-newrelic.ini

# アプリケーションコードをコピー
COPY --chown=phpuser:phpuser . /var/www/html/

# Apache設定の最適化
RUN a2enmod rewrite headers

# 環境変数のデフォルト値
ENV NEW_RELIC_ENABLED=true
ENV NEW_RELIC_LOG_LEVEL=info
ENV APACHE_RUN_USER=phpuser
ENV APACHE_RUN_GROUP=phpuser

# ヘルスチェック
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
    CMD curl -f http://localhost/health.php || exit 1

EXPOSE 80

Composer を使用したランタイムインストール

一部の環境では、Composer パッケージを使用してエージェントを統合できます。

bash
composer require newrelic/monolog-enricher

基本設定の構成

php.ini での設定

インストール後、php.ini ファイルに以下の設定を追加します:

ini
; New Relic PHP エージェントの有効化
extension=newrelic.so

; ライセンスキーとアプリケーション名
newrelic.license = "YOUR_LICENSE_KEY_HERE"
newrelic.appname = "My PHP Application"

; エージェントの有効化
newrelic.enabled = true

; ログ設定
newrelic.logfile = "/var/log/newrelic/php_agent.log"
newrelic.loglevel = "info"

YOUR_LICENSE_KEY_HERE の部分を、取得したライセンスキーに置き換えてください。

環境変数での設定

.env ファイルを使用する場合:

bash
# .env ファイル (セキュリティ強化)
# 本番環境では環境変数管理システムを使用
NEW_RELIC_LICENSE_KEY=${NEW_RELIC_LICENSE_KEY}
NEW_RELIC_APP_NAME="My PHP Application"
NEW_RELIC_ENABLED=true
NEW_RELIC_LOG_LEVEL=info
NEW_RELIC_DISTRIBUTED_TRACING_ENABLED=true
NEW_RELIC_SPAN_EVENTS_ENABLED=true

# PHP環境設定
PHP_ENV=production
PHP_DISPLAY_ERRORS=Off
PHP_LOG_ERRORS=On

フレームワーク別の設定例

Laravel アプリケーション

Laravel では、環境設定ファイルで New Relic を設定できます:

php
// config/app.php または .env ファイル
'providers' => [
    // 既存のプロバイダー
    App\Providers\NewRelicServiceProvider::class,
],

設定情報を環境変数で管理:

bash
# .env ファイル
NEW_RELIC_LICENSE_KEY=your_license_key
NEW_RELIC_APP_NAME="${APP_NAME} (${APP_ENV})"

Symfony アプリケーション

Symfony では、設定ファイルで New Relic を管理できます:

yaml
# config/packages/newrelic.yaml (作成)
newrelic:
    app_name: '%env(NEW_RELIC_APP_NAME)%'
    license_key: '%env(NEW_RELIC_LICENSE_KEY)%'

WordPress サイト

WordPress では、テーマの functions.php またはプラグインで基本的な設定を行います:

php
// wp-content/themes/your-theme/functions.php
if (extension_loaded('newrelic')) {
    // アプリケーション名の設定
    newrelic_set_appname(get_bloginfo('name') . ' (WordPress)');
    
    // ユーザー情報の追加
    if (is_user_logged_in()) {
        $user = wp_get_current_user();
        newrelic_set_user_attributes($user->ID, $user->display_name, $user->user_email);
    }
}

監視データの確認

New Relic UI でのデータ確認

エージェント導入後、数分で New Relic のダッシュボードにデータが表示されます。確認できる主要な情報:

  • 概要: アプリケーションの全体的なパフォーマンス
  • トランザクション: 各ページやエンドポイントの処理時間
  • データベース: SQLクエリの実行時間と頻度
  • エラー: PHP エラーと例外の詳細

基本的なメトリクス

自動的に収集される基本メトリクス:

  • 平均レスポンス時間
  • スループット(リクエスト/分)
  • エラー率
  • Apdex スコア(ユーザー満足度指標)

よくある問題と解決方法

エージェントが動作しない場合

  1. 拡張機能の確認: php -m | grep newrelic でモジュールが読み込まれているか確認
  2. ライセンスキー: 設定ファイルに正しいキーが記載されているか確認
  3. Webサーバーの再起動: Apache や Nginx を再起動
  4. ログの確認: /var/log/newrelic/php_agent.log でエラーを確認

パフォーマンスへの影響を最小化

本番環境での設定例:

ini
; パフォーマンス最適化設定
newrelic.framework = "laravel"
newrelic.transaction_tracer.transaction_threshold = 2.0
newrelic.error_collector.max_stack_trace_lines = 50

セキュリティ設定

機密情報を保護するための基本設定:

ini
; SQLパラメータの難読化
newrelic.transaction_tracer.record_sql = "obfuscated"

; HTTPパラメータのキャプチャを無効化
newrelic.capture_params = false

; 機密情報を含むパラメータを除外
newrelic.ignored_params = "password,credit_card,ssn"

Docker での設定

Docker コンテナでの使用例:

dockerfile
FROM php:8.2-apache

# New Relic エージェントのインストール
RUN curl -L https://download.newrelic.com/php_agent/release/newrelic-php5-10.13.0.3-linux.tar.gz | tar -C /tmp -zx \
    && cd /tmp/newrelic-php5-* \
    && ./newrelic-install install \
    && rm -rf /tmp/newrelic-php5-*

# 設定ファイルの追加
RUN echo "extension=newrelic.so" > /usr/local/etc/php/conf.d/newrelic.ini \
    && echo 'newrelic.license = "YOUR_LICENSE_KEY"' >> /usr/local/etc/php/conf.d/newrelic.ini \
    && echo 'newrelic.appname = "My PHP App"' >> /usr/local/etc/php/conf.d/newrelic.ini

COPY . /var/www/html/

まとめ

PHP アプリケーションでの New Relic APM 導入は、エージェントのインストールと基本設定により、既存のアプリケーションを変更することなく包括的な監視を開始できます。Laravel、Symfony、WordPress などの主要フレームワークでは、自動的に重要なメトリクスが収集されます。

まずは基本設定でデータ収集を開始し、アプリケーションの特性に応じて詳細設定を調整することで、効果的なパフォーマンス監視システムを構築できます。

初心者向けトラブルシューティング

エージェントが動作しない場合

  1. PHP拡張機能の確認

    bash
    php -m | grep newrelic
  2. 設定ファイルの確認

    bash
    php --ini | grep newrelic
  3. Webサーバーの再起動

    bash
    # Apache
    sudo systemctl restart apache2
    
    # Nginx + PHP-FPM
    sudo systemctl restart nginx php8.3-fpm
  4. ライセンスキーの確認

    bash
    grep license_key /etc/php/*/cli/conf.d/newrelic.ini

PHP エージェント設定パラメータ完全リファレンス

基本設定パラメータ

設定項目データ型デフォルト値説明設定例
newrelic.licensestringなしNew Relicライセンスキー(必須)your_license_key_here
newrelic.appnamestringPHP Applicationアプリケーション名(最大3個、セミコロン区切り)My PHP App;Staging;Development
newrelic.enabledbooleantrueエージェント全体の有効化true
newrelic.daemon.locationstring自動検出デーモンの場所/var/run/newrelic/newrelic.sock
newrelic.daemon.loglevelstringinfoデーモンログレベルerror, warning, info, debug
newrelic.daemon.pidfilestring/tmp/newrelic.pidデーモンPIDファイル/var/run/newrelic/newrelic.pid
newrelic.daemon.portstring/tmp/.newrelic.sockデーモン接続ポートまたはソケット@newrelic

ログ設定

設定項目データ型デフォルト値説明設定例
newrelic.logfilestring/var/log/newrelic/php_agent.logエージェントログファイル/var/log/newrelic/php_agent.log
newrelic.loglevelstringinfoエージェントログレベルerror, warning, info, debug
newrelic.daemon.logfilestring/var/log/newrelic/newrelic-daemon.logデーモンログファイル/var/log/newrelic/newrelic-daemon.log

トランザクション追跡設定

設定項目データ型デフォルト値説明設定例
newrelic.transaction_tracer.enabledbooleantrueトランザクション追跡有効化true
newrelic.transaction_tracer.thresholddouble2.0トランザクション追跡閾値(秒)1.0
newrelic.transaction_tracer.detailint1トランザクション詳細レベル(0-2)2
newrelic.transaction_tracer.record_sqlstringobfuscatedSQL記録モードoff, obfuscated, raw
newrelic.transaction_tracer.explain_enabledbooleantrueSQL実行計画取得有効化true
newrelic.transaction_tracer.explain_thresholdint500実行計画取得閾値(ミリ秒)1000
newrelic.transaction_tracer.slow_sqlbooleantrue低速SQL追跡有効化true

エラー収集設定

設定項目データ型デフォルト値説明設定例
newrelic.error_collector.enabledbooleantrueエラー収集有効化true
newrelic.error_collector.record_database_errorsbooleantrueデータベースエラー記録true
newrelic.error_collector.prioritize_api_errorsbooleanfalseAPI経由のエラーを優先true
newrelic.error_collector.ignore_errorsstringなし無視するエラータイプ(カンマ区切り)E_ERROR,E_WARNING
newrelic.error_collector.ignore_user_exception_handlerbooleanfalseユーザー例外ハンドラーを無視true

ブラウザ監視設定

設定項目データ型デフォルト値説明設定例
newrelic.browser_monitoring.auto_instrumentbooleantrueブラウザ監視自動挿入true
newrelic.browser_monitoring.loaderstringrumブラウザローダータイプrum, full

分散トレーシング設定

設定項目データ型デフォルト値説明設定例
newrelic.distributed_tracing_enabledbooleantrue分散トレーシング有効化true
newrelic.span_events_enabledbooleantrueスパンイベント有効化true

フレームワーク固有設定

設定項目データ型デフォルト値説明設定例
newrelic.frameworkstring自動検出フレームワーク種別laravel, symfony, wordpress, drupal
newrelic.webtransaction.name.remove_trailing_pathbooleanfalseパス末尾の除去true
newrelic.webtransaction.name.functionsstringなしトランザクション名生成関数my_naming_function

カスタム属性設定

設定項目データ型デフォルト値説明設定例
newrelic.capture_paramsbooleanfalseHTTPパラメータ収集true
newrelic.ignored_paramsstringなし無視するパラメータ(カンマ区切り)password,ssn,credit_card
newrelic.attributes.enabledbooleantrue属性収集有効化true
newrelic.attributes.includestringなし含める属性パターンrequest.parameters.*
newrelic.attributes.excludestringデフォルト除外設定除外する属性パターンrequest.headers.cookie

パフォーマンス最適化設定

設定項目データ型デフォルト値説明推奨値
newrelic.transaction_tracer.max_segments_webint2000Web最大セグメント数1000
newrelic.transaction_tracer.max_segments_cliint100000CLI最大セグメント数50000
newrelic.daemon.max_threadsint8デーモン最大スレッド数16
newrelic.daemon.metric_address_timeint120メトリクス送信間隔(秒)60

特殊設定

設定項目データ型デフォルト値説明設定例
newrelic.high_securitybooleanfalse高セキュリティモードtrue
newrelic.labelsstringなしカスタムラベル(セミコロン区切り)env:prod;team:backend
newrelic.custom_insights_events.enabledbooleantrueカスタムInsightsイベント有効化true
newrelic.application_logging.enabledbooleantrueアプリケーションログ連携true
newrelic.application_logging.forwarding.enabledbooleantrueログ転送有効化true
newrelic.application_logging.metrics.enabledbooleantrueログメトリクス有効化true

環境変数(Heroku等)

パラメータ名データ型デフォルト値説明使用例
NEW_RELIC_LICENSE_KEYstringなしNew Relicライセンスキーyour_license_key_here
NEW_RELIC_APP_NAMEstringなしアプリケーション名My PHP App (Heroku)
NEW_RELIC_METADATA_COMMITstringなしコミットSHA(git情報)734713b

per-directory設定(.htaccess/Apache)

設定方法説明
Apache VirtualHostphp_value newrelic.appname "VHost App"仮想ホスト単位での設定
.htaccessphp_value newrelic.enabled 1ディレクトリ単位での設定
PHP APIini_set('newrelic.appname', 'API App');実行時設定変更

Code Level Metrics設定

設定項目データ型デフォルト値説明設定例
newrelic.code_level_metrics.enabledbooleantrueコードレベルメトリクス有効化true
newrelic.package_reporting.enabledbooleantrueパッケージ検出情報送信true

関連記事