CentOS 7.5 PHP7.3(php-fpm)の環境をNew Relic APMで監視する

真っ新なCentOS 7.5の環境にPHP7.3をインストールし、New Relicでアプリケーション監視の設定をした際に、躓くポイントがいくつかありました。
構築手順をこちらに残します。

## CentOS 7.5 環境構築
vagrantでローカルマシンに作成します。

```
vagrant init centos/7
vagrant up
```

## Nginxのセットアップ

### EPELリポジトリ追加とインストール
nginxはEPELリポジトリのものを使用します。

```
sudo yum -y install epel-release
sudo yum -y install nginx
```

### Nginxからphp-fpmを実行する設定
phpのファイルが呼ばれた際にphp-fpmで実行する設定を、設定ファイルのserverディレクティブ内に記述します。

```/etc/nginx/nginx.conf
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
```

### 起動設定

```
sudo systemctl start nginx.service
sudo systemctl enable nginx.service
```

## php-fpmの導入

### Remiリポジトリの追加とインストール

CentOS標準のリポジトリにはPHP5系のパッケージしか用意されていません。
php-fpmはRemiリポジトリのものを使用します。

```
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
sudo yum -y install php73-php.x86_64 php73-php-fpm.x86_64
```

### 起動設定

```
sudo systemctl start php73-php-fpm.service
sudo systemctl enable php73-php-fpm.service
```


## New Relic PHP拡張とAgentの導入

### New Relicリポジトリの追加とインストール

```
sudo rpm -Uvh http://yum.newrelic.com/pub/newrelic/el5/x86_64/newrelic-repo-5-3.noarch.rpm
sudo yum install newrelic-php5
```

### php-fpmでnewrelic拡張を使用する設定
New Relicを使用する設定は通常 `newrelic-install` を用います。コマンドを実行するだけでほとんどの設定が完了します。
しかし、この環境ではRemiのphp-fpmを使用している都合により `newrelic-install` コマンドを使用できません。
なので必要な設定を手動で行います。

#### newrelic-php 設定ファイルの作成

```
sudo cp /usr/lib/newrelic-php5/scripts/newrelic.ini.template /etc/opt/remi/php73/php.d/newrelic.ini
sudo chmod u+w /etc/opt/remi/php73/php.d/newrelic.ini                                                                                            
```
php-fpmの設定ディレクトリにテンプレートをコピーし、書き込み権限を付与します。

#### newrelic-php 設定ファイルの編集

```/etc/opt/remi/php73/php.d/newrelic.ini
extension = "/usr/lib/newrelic-php5/agent/x64/newrelic-20180731.so"

newrelic.license = "REPLACE_WITH_REAL_KEY"

newrelic.appname = "アプリケーション名"

newrelic.daemon.port = "/var/run/.newrelic.sock"
```
※上記は変更箇所のみ記述しています。
`extension` で拡張ライブラリを絶対パスで指定します。(あるいはここの記述は変更せず、ライブラリファイルを適切な場所へコピーしても良いです)
`newrelic.licence`と`newrelic.appname`は自身の環境に合わせて変更します。
`newrelic.daemon.port`の初期値は`/tmp/.newrelic.sock`ですが、CentOS 7系で動くサービスはPrivateTmpが有効となっているため、/tmp直下のファイルにアクセスできません。
ソケットファイルを/var/runに置くことで利用できるようになります。(あるいは通信にTCPを使用するか、php-fpmではPrivateTmpを無効にすることでも可能です)

#### php-fpmの再起動

```
sudo systemctl restart php73-php-fpm.service
```

#### newrelic-daemon 設定ファイルの作成

```
sudo cp /etc/newrelic/newrelic.cfg.template /etc/newrelic/newrelic.cfg
sudo chmod u+w /etc/newrelic/newrelic.cfg
```

#### newrelic-daemon 設定ファイルの編集

```/etc/newrelic/newrelic.cfg
port="/var/run/.newrelic.sock"
```
※上記は変更箇所のみ記述しています。
`port`の値が、newrelic.iniの`newrelic.daemon.port`と一致するようにします。

#### newrelic-daemonの起動設定

```
sudo service newrelic-daemon start
sudo chkconfig newrelic-daemon on
```

## 動作確認

### phpinfoを出力するファイルを作成

```/usr/share/nginx/html
<?php
phpinfo();
```

### Webアクセス
```
watch -n 1 curl localhost/index.php
```

### New Relicの管理画面で確認
<img width="606" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/13038/6ad9852a-f380-44c8-27cd-4572ab7f5b66.png">
数分待ち、Webトランザクションの情報が入ってくれば成功です。

## まとめ
CentOS 7はPrivateTmpやSELinuxが有効になっていたり、php7のパッケージが標準で用意されていなかったりと、ハマりどころが多いです。
意外とハマりどころが多いです。
何かうまくいかないことがあったら、各サービスのログを見ながら対応を行いましょう。