[macOS] macOS 版 FileMaker Server で PHP を使う

## 使用環境
Mac mini (M1, 2020)
macOS Sequoia 15.3.1
FileMaker Server 21.1.1.40

## テスト環境用に FileMaker Server 兼 Web サーバ にしてしまう

私は、通常 Ubuntu(AMD) 版の FileMaker Server を使用していますが、テスト環境用に、Mac mini (M1, 2020) で、macOS 版も使用しています。
 Ubuntu 版の登場で、色々と都合が良くなったりしていますが、macOS 版もまだまだ使っています。

 FileMaker Server にした Mac を Web サーバとしても設定したいという要請はあると思いますが、PHP がそのままでは動かない、また、Mac のセキュリティの問題もあって、Ubuntu 版とは少々、違った作業が必要になります。

## PHP をインストールしてしまう

 FileMaker Server が既にインストールされている前提で、Mac への PHP のインストールは、[Homeberew](https://brew.sh/ja/) を使うのが簡便でしょう。詳細は Homebrew サイトを参照してもらうとして、最低限度でコマンドだけ書いておきます。

```
% brew install php
```

 これで最新版の PHP がインストールできます。もし、バージョン選択したい場合は、次のコマンドでインストール可能なバージョンを確認します。

```
% brew search php
```

 例えば、8.1 をインストールしたいときは、

```
% brew install php@8.1
```

 以上で、PHP のインストールは完了するので、`php -v` 等で、存在を確認しておけばいいでしょう。

 　ここまでは、なんてことのない作業ですが、Mac の場合、未署名のソフトウェア、この場合、 libphp.so になりますが、そのまま使用することができません。

## Command Line Tools for Xcode のインストール

 libphp.so にコード署名するためのコマンドが含まれている Command Line Tools for Xcode をインストールします。

```
% xcode-select --install
```

　これで、コード署名ができるようになります。

## 認証局の作成

　自己署名用の証明書を発行する認証局を作成しておくと、Web サーバとして Mac を SSL 化してテストするのに便利ですし、認証局発行の証明書をデフォルトで信頼とすることもできますし、キーチェーンアクセスも見やすくなります。
 
  これには、「キーチェーンアクセス」アプリケーションを使用しますが、macOS Sequoia では、アプリケーションの場所が、`/System/Library/CoreServices/Application/` に移動しています。それ以前の場合は、`/System/Applications/Utilities/` にあります。

　起動すると、macOS Sonima 以降は、「パスワード」を開くか「キーチェーンアクセス」を開くか聞いてくるので、「キーチェーンアクセス」を選択して開きます。

### 認証局を作成

　起動したら、左のペインで、`ログイン` を選んで、`キーチェーン > 証明書アシスタント > 認証局作成...` を選び、以下のように設定します。

- 名前: 任意の認証局名（ex. Qiita CA）
- 固有名のタイプ: 自己証明ルート CA
- コード署名
- ✅ デフォルトを無効化
- ✅ この CA をデフォルトにする
- メールの送信元: （メールアドレス）

### 証明書情報

　`続ける` をクリックし、次のページに進み、以下の設定をします。
 
 - シリアル番号: 1
 - 有効期間（日数）: 任意の日数（ex. 5年なら 1826）
 - （他のチェック項目はチェックしない）

### 証明書情報（2ページ目）

　`続ける` をクリックし、次のページに進み、以下の設定をします。

 - メールアドレス: （メールアドレス）
 - 名前: 設定した認証局名
 - 組織: （会社名 ex. Apple inc.）
 - 部署: （部署 ex. iPhone Development Division）
 - 都市（地域）: （市区町村 ex. Yokohama）
 - 都道府県/州: （ex. Kanagawa）
 - 国または地域: JP

### この CA の鍵ペア情報

 `続ける` をクリックし、次のページに進み、以下の設定をします。

 - 鍵のサイズ: 2048 ビット
 - アルゴリズム RSA

### この CA のユーザが使う鍵ペア情報を指定

 - 鍵のサイズ: 2048 ビット
 - アルゴリズム RSA

### この CA が使う鍵用途拡張領域

 `続ける` をクリックし、次のページに進み、以下の設定をします。

 **次の項目にチェックを入れ、他はチェックしない**
 - ✅ 鍵用途拡張領域を含める
 - ✅ 署名
 - ✅ 証明書署名

### この CA のユーザが使う鍵用途拡張領域

 `続ける` をクリックし、次のページに進み、以下の設定をします。

 **次の項目にチェックを入れ、他はチェックしない**
 - ✅ 鍵用途拡張領域を含める
 - ✅ この拡張領域は重要
 - ✅ 署名

### この CA が使う拡張鍵用途拡張領域

 `続ける` をクリックし、次のページに進み、以下の設定をします。

 **次の項目にチェックを入れ、他はチェックしない**
 - ✅ 拡張鍵用途拡張領域を含める
 - ✅ 任意
 - ✅ コード署名

### この CA のユーザが使う拡張鍵用途拡張領域

 `続ける` をクリックし、次のページに進み、以下の設定をします。

 **次の項目にチェックを入れ、他はチェックしない**
 - ✅ 拡張鍵用途拡張領域を含める
 - ✅ この拡張領域は重
 - ✅ コード署名

### この CA が使う基本制約拡張領域

 `続ける` をクリックし、次のページに進み、以下の設定をします。

 **次の項目にチェックを入れ、他はチェックしない**
 - ✅ 基本制約拡張領域を含める
 - ✅ この証明書を認証局として使用

### この CA のユーザが使う基本制約拡張領域

 `続ける` をクリックし、次のページに進み、以下の設定をします。

 **何もチェックしない**

### この CA が使うサブジェクト代替名拡張領域

 `続ける` をクリックし、次のページに進み、以下の設定をします。

 **何もチェックしない**

### この CA のユーザが使うサブジェクト代替名拡張領域

 `続ける` をクリックし、次のページに進み、以下の設定をします。

 **次の項目にチェックを入れ、他はチェックしない**
 - ✅ サブジェクト代替名拡張領域を含める

### 証明書の場所を指定

 `続ける` をクリックし、次のページに進み、以下の設定をします。

 **次の項目にチェックを入れ、他はチェックしない**
 - キーチェーン: ログイン
 - ✅ このコンピュータ上ではこの CA に署名された証明書を信頼

 `作成`をクリックして認証局を作成します。

  `設定結果`が表示されたら、確認後、ウィンドウを閉じます。

## コード署名の証明書の作成

 作成した認証局を使って、証明書を作成します。
 `キーチェーンアクセス > 証明書アシスタント > 証明書を作成...` を選択します。

### 証明書を作成
- 名前: （証明書の名前 ex FileMaker Server Admin）
- 固有名のタイプ: リーフ
- 証明書のタイプ: コード署名

### 発行者を選択

 `続ける` をクリックし、次のページに進み、先ほど作った認証局を選択し、`作成`をクリックします。

 　コード署名の準備はこれで完了です。

## コード署名する

 証明書が出来たので、その証明書を使って署名します。パスは Homebrew 使って PHP をインストールしている場合を想定して書いていますので、適宜、読み替えてください。

 尚、この部分の作業はローカルで行う必要があります。リモートでは出来ません。

### Apple Silicon 搭載の Mac の場合
```
codesign --sign "（発行した証明書名）" --force --keychain ~/Library/Keychains/login.keychain-db /opt/homebrew/opt/php/lib/httpd/modules/libphp.so
```

### Intel Mac の場合
```
codesign --sign "（発行した証明書名）" --force --keychain ~/Library/Keychains/login.keychain-db /usr/local/opt/php/lib/httpd/modules/libphp.so
```

 これでコード署名済みの libphp.so が出来ました。

 次のコマンドで確認できます。

### Apple Silicon 搭載の Mac の場合
```
codesign -vd /opt/homebrew/opt/php/lib/httpd/modules/libphp.so
```

### Intel Mac の場合
```
codesign -vd /usr/local/opt/php/lib/httpd/modules/libphp.so
```

 正しく署名ができていれば、次のような情報が表示されます。
```
Executable=/opt/homebrew/Cellar/php/8.4.4/lib/httpd/modules/libphp.so
Identifier=libphp
Format=Mach-O thin (arm64)
CodeDirectory v=20400 size=159679 flags=0x0(none) hashes=4985+2 location=embedded
Signature size=3088
Signed Time=Feb 28, 2025 at 11:11:44
Info.plist=not bound
TeamIdentifier=not set
Sealed Resources=none
Internal requirements count=1 size=84

```



## httpd.conf.2.4 の編集

 FileMaker Server の Apache の設定は、httpd.conf を編集するのではなく、httpd.conf.2.4 を編集し、FileMaker Server 起動時にそれを読み込ませるという方法が採られています。

 まず、デフォルトの httpd.conf.2.4 をバックアップしておきます。
```
% cd /Library/FileMaker\ Server/HTTPServer/conf/
% cp httpd.conf.2.4 httpd.conf.2.4_default
```

 編集を開始します。ここでは `vi` を使いますが、お好きなエディタでもちろん構いません。

```
% vi httpd.conf.2.4
```

 `LoadModule` の行が沢山あるので、一番下の `LoadModule hfs_apple_module /usr/libexec/apache2/mod_hfs_apple.so` の次の行にインサートモード（i を打つ）で追加します。

```
# Added by me (20250228)
LoadModule php_module /opt/homebrew/opt/php/lib/httpd/modules/libphp.so "（発行した証明書名）"
```

 パスは、Homebrew でインストールした PHP かつ Apple Silicon の Mac です。Intel Mac の場合は、以下のようになります。

```
# Added by me (20250228)
LoadModule php_module /usr/local/opt/php/lib/httpd/modules/libphp.so "（発行した証明書名）"
```
 次に、インサートモードを抜けて（esc を打つ）、`htdocs` で検索します。

```
/htdocs
```

 以下のように再び、インサートモードで書き換えます。
```
DocumentRoot "${HTTP_ROOT}/htdocs"
<Directory "${HTTP_ROOT}/htdocs">
    #AllowOverride none
    #Options None
    #Require all granted
    AllowOverride All
    Options Multiviews FollowSymLinks
    MultiviewsMatch Any
    Require all granted
</Directory> 
```

 次に、インサートモードを抜けて、`DirectroyIndex` で検索します。

```
/DirectroyIndex
```

 以下のように再び、インサートモードで書き換えます。
```
<IfModule dir_module>
    #DirectoryIndex index.html
    DirectoryIndex index.html index.php
</IfModule>
```

 次に、インサートモードを抜けて、`FilesMatch` で検索し、`<FilesMatch "\.php$">` を探し、次のように書き換えます。
```
<FilesMatch "\.php$">
#   Require all denied
    SetHandler application/x-httpd-php
    Require all granted
</FilesMatch>

<FilesMatch "\.phps$">
    SetHandler application/x-httpd-php-source
    Require all granted
</FilesMatch>
```

 続いて、最下行まで移動して、次のようインサートモードで追加します。

```
# Added by me (20250228)
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
```

 インサートモードを抜けて保存終了します。
```
:wq
```

## Admin Console での設定

 Admin Console で、FileMaker Server マシンが Web サーバとしても機能するように設定しておく必要があります。

 `コネクタ > Web 公開 > Web 公開エンジン` をオンにします。

## FileMaker Server の再起動 2回

 2回続けて、FileMaker Server を再起動します。

```
% sudo /Library/FileMaker\ Server/HTTPServer/bin/httpdctl restart
% sudo /Library/FileMaker\ Server/HTTPServer/bin/httpdctl restart
```

## phpinfo() で確認

　phpinfo() を表示させて、PHP が動作しているか確認します。

```
% cd /Library/FileMaker\ Server/HTTPServer/htdocs/httpsRoot/
% vi phpinfo.php
```

 インサートモードにして、次のコードを入力し、保存終了します。
```
<?php phpinfo();
```

　ブラウザで、FileMaker Server の phpinfo.php にアクセスします。

```
https://（FileMaker Server のドメイン名）/phpinfo.php
```

 phpinfo() の情報が表示されれば成功です。

 CGI、SSI、autoindex 等、設定したい項目があれば、同じように httpd.conf.2.4 を編集して設定していくことになります。
 小技を python、ruby、node、R 等で作っておいて、FileMaker Server から実行するということも設定次第で可能になります。