FileMakerServer での nginx チューニングをするための前準備

# はじめに
## 前書き
* 本記事は [FileMaker Advent Calendar 2022](https://qiita.com/advent-calendar/2022/filemaker) 21 日目の記事です。

https://qiita.com/advent-calendar/2022/filemaker

## 対象読者
* [Claris FileMaker Server](https://www.claris.com/ja/filemaker/server/) で [nginx](https://www.nginx.co.jp/) を運用している人

## 前提
* FileMaker Server は 19.5.1 より apache に代わって nginx がデフォルトの Web サーバとして採用されるようになりました
* この nginx チューニングでパフォーマンスに影響ある範囲は、以下くらいだと思います
  * AdminConsole
  * WebDirect

## 環境
* FileMaker Server 19.6.2
* Ubuntu 20.04

# FileMaker Server に依存した nginx についての事前調査
## 対象ディレクトリ
* 通常、nginx そのもののディレクトリは以下にあり、設定ファイルもその配下にあるものなのですが……

```
/etc/nginx/
```

* FileMaker Server では、設定ファイルを独自に有しており、以下に置かれてあります

```
/opt/FileMaker/FileMaker Server/NginxServer/
```

* とりわけ以下のファイルです

```
/opt/FileMaker/FileMaker Server/NginxServer/conf/fms_nginx.conf
```

## 設定ファイルの中身を見る
* 他にも 3 つのファイルがあり、合計で 4 ファイル、それぞれの中身を見てみましょう

### fms_fac.conf
* ファイル名アルファベット昇順で、まず上から 1 つめ
* いきなり `FAC` とか出てきましたが、何でしょうねコレ……ってなりますよね
* おそらく `FileMaker Admin Console` の略なんじゃないかな……と思います、設定として `proxy_pass` を見る限り
* FileMaker Server の AdminConsole がポート `443` で受け付けられるように設定変更されたわけですが、ここの設定で `16001` へ投げているわけですね
* このファイルについては弄る必要はないです

```nginx:fms_fac.conf
# Claris FAC nginx conf for https

location ^~ /admin-console {
  proxy_set_header X-Forwarded-Host $host:$server_port;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://127.0.0.1:16001/admin-console;
  proxy_set_header Host $host;
}

location ^~ /fmi/admin/ {
  proxy_set_header X-Forwarded-Proto https;
  proxy_set_header X-Forwarded-Host $host:$server_port;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://127.0.0.1:16001/fmi/admin/;
}

location ^~ /socket.io/ {
  proxy_pass http://127.0.0.1:16001;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection $connection_upgrade;
  proxy_set_header Host $http_host;          
}

location / {
# we try to look in the root first, then fall back to FAC proxy
  try_files $uri $uri/ @backend;
}

location @backend {
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $host;
  proxy_pass http://127.0.0.1:16001;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection  $connection_upgrade;
}
```

### fms_http.conf
* 2 つめ
* こちらは `http` 関連全般……ということで、FileMaker Server の管理画面まわりのリバースプロキシ設定であったり、http でアクセスされたものに対し https で返すようにしたり、といったことが書かれていました
* こちらもチューニングとして弄る必要はないですね
* ちなみに `mwpe` というのは `Multiple Web Publishing Engine` の略だそうです

```nginx:fms_http.conf
# Claris nginx http conf for port 80

index index.html index.htm index.nginx-debian.html;
   
# ideally all port 80 traffic should redirected to https
# Customer with custom cert (not self sign cert) can enable this
# return 301 https://$server_name$request_uri;

## below config from httpd httpd-rewrite conversion

location ^~ /Streaming/ {
  proxy_set_header X-Forwarded-Host $host:$server_port;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://127.0.0.1:1895/Streaming/;
}

location ^~ /Streaming_SSL/ {
  proxy_set_header X-Forwarded-Host $host:$server_port;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://127.0.0.1:1895/Streaming_SSL/;
}

location ^~/fmws {
  proxy_set_header X-Forwarded-Host $host:$server_port;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://127.0.0.1:1895/fmws;
}

location ^~ /docws {
  proxy_set_header X-Forwarded-Host $host:$server_port;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://127.0.0.1:1895/docws/;
}
      
location ^~ /oAuth {
  rewrite ^/oAuth* https://$host:443$request_uri redirect;
}

location ^~ /admin-console {
  rewrite ^/admin-console https://$host:443$request_uri redirect;
}

location ^~ /test {
  rewrite ^/test https://$host:443$request_uri redirect;
}

location ^~ /fmi/rest {
  rewrite ^/fmi/rest/* https://$host:443$request_uri redirect;
}

location ^~ /fmi/webd/PUSH {
  proxy_pass "http://127.0.0.1:16021/fmi/webd/PUSH";
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection  $connection_upgrade;
  proxy_set_header Host $http_host;
}

# mwpe
location ^~ /fmi/mwpem/ {
  proxy_set_header X-Forwarded-Host $host:$server_port;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://127.0.0.1:16002/fmswpem/;
  proxy_http_version 1.1;
}

location ^~ /fmi/mwpew/ {
  proxy_set_header X-Forwarded-Host $host:$server_port;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://127.0.0.1:16002/fmswpew/;
  proxy_http_version 1.1;
}
 
location ^~ /fmi/ {
  proxy_set_header X-Forwarded-Proto http;   # MWPE need this for redirect
  proxy_set_header X-Forwarded-Host $host:$server_port;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://127.0.0.1:16021/fmi/;
  proxy_http_version 1.1;
  proxy_cookie_path /fmi "/; HttpOnly; Max-Age=43200";
}
```

### fms_https.conf
* 3 つめは、解説不要なくらいシンプルですね
* こちらも弄る必要はないです

```nginx:fms_https.conf
# Claris nginx https conf for port 80
return 301 https://$host$request_uri;
```

### fms_nginx.conf
* というわけで本命の 4 つめですが……正直ちょっと、一つのファイルに設定盛り込みすぎ！！　って感じです
* チューニングのために弄る必要があるファイルはここなのですが、ここを直接書き換えるのは気が引けてきますので、別ファイルに切り分けるようにしてみましょう
* ひとまず中身はこんな感じです、ということでまずは全部貼っておきます
* この中を読んでいくと、上記 3 つの .conf ファイルについては、このファイルの中で include として読み込んでいることがわかります

```nginx:fms_nginx.conf
# Claris nginx conf

user       fmserver fmsadmin;
worker_processes  5;  ## Default: 1

events {
  worker_connections  4096;  ## Default: 1024
}

http {
 include "/etc/nginx/mime.types"; 
 map $http_upgrade $connection_upgrade {
   default upgrade;
   '' close;
 }

 # hide nginx version
 server_tokens off;

 # Set website folder
 root "/opt/FileMaker/FileMaker Server/NginxServer/htdocs/httpsRoot";

 access_log "/opt/FileMaker/FileMaker Server/NginxServer/logs/access.log"; # this can be set 'off' to improve performance
 error_log "/opt/FileMaker/FileMaker Server/NginxServer/logs/error.log";
 
 # Enable SSL
 ssl_certificate     "/opt/FileMaker/FileMaker Server/CStore/serverCustom.pem";
 ssl_certificate_key "/opt/FileMaker/FileMaker Server/CStore/serverKey.pem";
 ssl_password_file   "/opt/FileMaker/FileMaker Server/CStore/.passphrase";

 ssl_protocols TLSv1.2 TLSv1.3; 
 ssl_prefer_server_ciphers on;
 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:!DH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA;

 # Optimize session cache
 ssl_session_cache   shared:SSL:40m;
 ssl_session_timeout 4h;
 
 # Enable session tickets
 ssl_session_tickets on;

# Admin can enable gzip compression if needed   
 # compression
#  gunzip on;
#  gzip on;

 # Compress all the following MIME-types.
#  gzip_types
#   application/atom+xml
#   application/geo+json
#   application/javascript
#   application/x-javascript
#   application/json
#   application/ld+json
#   application/manifest+json
#   application/rdf+xml
#   application/rss+xml
#   application/vnd.ms-fontobject
#   application/wasm
#   application/x-web-app-manifest+json
#   application/xhtml+xml
#   application/xml
#   font/eot
#   font/otf
#   font/ttf
#   image/bmp
#   image/svg+xml
#   image/gif
#   image/jpeg
#   image/png
#   image/tiff
#   image/webp
#   image/x-icon
#   video/3gpp
#   video/avi
#   video/mp4
#   video/mpeg
#   video/ogg
#   video/quicktime
#   video/webm
#   text/cache-manifest
#   text/calendar
#   text/css
#   text/javascript
#   text/markdown
#   text/plain
#   text/xml
#   text/vcard
#   text/vnd.rim.location.xloc
#   text/vtt
#   text/x-component
#   text/x-cross-domain-policy;

#  gzip_proxied  no-cache no-store private expired auth;
#  gzip_min_length 1000;

 # set payload limit
 # currently, we have no limit. Admin can set to 20G, 200M or any value based on business spec
 client_max_body_size 0;

 proxy_request_buffering off; # we dont wait until the whole request is completed

 charset utf-8;
 source_charset utf-8; 

 server {
    listen 80;

    # Add headers for Cross-Origin Resource Sharing (CORS) policies
    add_header 'Access-Control-Allow-Origin' $hostname;
    add_header 'Access-Control-Allow-Credentials' 'True';
    add_header 'Access-Control-Allow-Headers' 'Content-Type,Authorization';

    ## http conf based on cert
    include "/opt/FileMaker/FileMaker Server/NginxServer/conf/fms_https.conf";	# HTTP conf  
 }

 server {
   listen 443 ssl http2;
   listen [::]:443 ssl http2;

   index index.html index.htm index.nginx-debian.html;
   
   add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

   # Prevent Clickjacking attack
   add_header X-Frame-Options "SAMEORIGIN";
  
   # Prevent cross-site scripting (XSS) attack
   add_header X-XSS-Protection "1; mode=block";
 
   add_header X-Content-Type-Options nosniff;
 
   # add_header Content-Security-Policy "script-src 'self' 'unsafe-inline' 'unsafe-eval';" always;
   
   # Add headers for Cross-Origin Resource Sharing (CORS) policies
   add_header 'Access-Control-Allow-Origin' $hostname;
   add_header 'Access-Control-Allow-Credentials' 'True';
   add_header 'Access-Control-Allow-Headers' 'Content-Type,Authorization';
   
## below config from httpd mod_proxy conversion

    location ^~ /fmi/fmwd_help/ {
      proxy_set_header X-Forwarded-Host $host:$server_port;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://127.0.0.1:16021/fmi/fmwd_help/;
      proxy_set_header Host $host;
    }

    location ^~ /fmi/conf {
      deny all;
      return 403;
    }

## Support XML on Linux on premise
#    location ^~ /fmi/xml {
#      deny all;
#      return 403;
#    }

    ## FAC admin console
    include "/opt/FileMaker/FileMaker Server/NginxServer/conf/fms_fac.conf";


## below config from httpd httpd-proxy conversion
    location ^~ /fmws {
      proxy_set_header X-Forwarded-Host $host:$server_port;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://127.0.0.1:1895/fmws;
      proxy_set_header Host $host;
    }

    location ^~ /docws {
      proxy_set_header X-Forwarded-Host $host:$server_port;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://127.0.0.1:1895/docws;
      proxy_set_header Host $host;
    }

    location ^~ /hss/ {
      proxy_set_header X-Forwarded-Host $host:$server_port;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://127.0.0.1:1895/hss/;
    }

    location ^~ /Streaming/ {
      proxy_set_header X-Forwarded-Host $host:$server_port;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://127.0.0.1:1895/Streaming/;
    }

    location ^~ /Streaming_SSL/ {
      proxy_set_header X-Forwarded-Host $host:$server_port;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://127.0.0.1:1895/Streaming_SSL/;
    }

    location ^~ /oauth/ {
      proxy_set_header X-Forwarded-Host $host:$server_port;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://127.0.0.1:1895/oauth/;
    }

    location ^~ /fmds/ {
      proxy_set_header X-Forwarded-Host $host:$server_port;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://127.0.0.1:16005/fmds/;
    }

    location ^~ /admin-server/adminhelper {
      proxy_set_header X-Forwarded-Host $host:$server_port;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://127.0.0.1:16001/admin-server/adminhelper;
    }

    location ^~ /fmi/data/ {
      proxy_set_header X-Forwarded-Proto https;
      proxy_set_header X-Forwarded-Host $host:$server_port;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://127.0.0.1:3000/fmi/data/;
    }

    location ^~ /fmi/odata/ {
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-Proto https;
      proxy_set_header X-Forwarded-Host $host:$server_port;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://127.0.0.1:3001/fmi/odata/;
    }

## below config from httpd httpd-proxy-fmiwebd conversion

    location ^~ /fmi/webd/PUSH {
      proxy_pass "http://127.0.0.1:16021/fmi/webd/PUSH";
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection  $connection_upgrade;
      proxy_set_header Host $http_host;
    }

    # mwpe
    location ^~ /fmi/mwpem/ {
      proxy_set_header X-Forwarded-Host $host:$server_port;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://127.0.0.1:16002/fmswpem/;
      proxy_http_version 1.1;
    }

    location ^~ /fmi/mwpew/ {
      proxy_set_header X-Forwarded-Host $host:$server_port;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://127.0.0.1:16002/fmswpew/;
      proxy_http_version 1.1;
    } 

    location ^~ /fmi/ {
      proxy_set_header X-Forwarded-Proto https;   # MWPE need this for redirect
      proxy_set_header X-Forwarded-Host $host:$server_port;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://127.0.0.1:16021/fmi/;
      proxy_http_version 1.1;
      proxy_set_header Connection "";
      # Set cookie expiration date (12 hours in seconds), path and httponly
      proxy_cookie_path /fmi "/; Secure; HttpOnly; Max-Age=43200";
    }

#   location / {
     # First attempt to serve request as file, then
     # as directory, then fall back to displaying a 404.
#     try_files $uri $uri/ =404;
#   }
 }
}
```

* ただ、実際のチューニングに入る前に、この設定ファイルをどこから呼び出しているのかなども、知っておきたいですよね
* ということで、もう少し周辺情報を洗っておきます


## nginx の起動／停止／再起動
### nginx の起動／停止
* FileMaker Server に依存している nginx の起動や停止などは、通常の `nginx` コマンドとは異なるものとなっています
* これらについてどこで定義されているかというと、以下に配置されている各ファイルです

```
/opt/FileMaker/etc/systemd/system/
```

* たとえば `com.filemaker.nginx.start.service` ファイルの中身を見てみますと、以下のように記述されています
* この中で、先ほど見ていた `fms_nginx.conf` を設定ファイルとして用いる旨が書かれていますね

```ini:com.filemaker.nginx.start.service
[Unit]
Description= Filemaker.com monitor system and start Nginx Server
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStart=/usr/sbin/nginx -c "/opt/FileMaker/FileMaker Server/NginxServer/conf/fms_nginx.conf"

[Install]
#WantedBy=multi-user.target
```

* この service ファイルによって、FileMaker Server が独自に用意した専用の nginx サービスがシステムに登録されることになるのですが、これが正しく稼働しているかどうかを確認するためには、以下のコマンドを打ちます

```sh
systemctl status com.filemaker.nginx.start
```

* ファイル名の最後の拡張子 `.service` を除いたものになりますね
* これを打つと、以下のように返ってくるはずです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/12aa4a14-3e56-ee04-9d29-7de8c5955737.png)

* 同じようにして `restart` や `stop` のサービスも登録されています
  * `start` と異なり、この 2 つは常時 active になるようなものではないですね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/2715d51e-0cfb-f7e1-1f8d-2e3b8fd81be6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/1a354647-a6ed-60c7-d4bc-9b5ea55b70d5.png)

* ……で、nginx の起動状態が異常時であると、以下のように赤表示となります
  * わざと異常を起こしたわけですが、`start` が正常稼働している状態で `systemctl start com.filemaker.nginx.start` などとすると、こうなります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/592f79a1-3e17-1bec-c9ab-48b45e576c4a.png)

* 上記のようになってしまって nginx プロセスがダウンすると、以下のような `fmsadmin` コマンドでは復旧されなくなってしまいます

```
fmsadmin restart adminserver
fmsadmin restart server
fmsadmin restart wpe
```

* `fmsadmin help restart` コマンドで出てくる再起動対象は以下とのこと。それっぽいのが見当たらない

```
Description:
    Restarts the server or process(es) of specified TYPE. This command stops
    the server or process TYPE and then starts it after a short delay.

    Valid server TYPEs:
        ADMINSERVER     Stops then starts the Admin Server.
        SERVER          Stops then starts the Database Server.

    Valid process TYPEs:
        FMSE            Restarts the FileMaker Script Engine process.
        FMSIB           Restarts the Server Progressive Backup process.
        XDBC            Restarts the ODBC/JDBC listener process.
        WPE             Restarts all Web Publishing processes.
        FMDAPI          Restarts all FileMaker Data API processes.
        ODATA           Restarts the OData process.
```

* ということで、この状態に陥ってしまったら、おとなしく OS 再起動するしかありませんでした……
  * 他に解決法を見つけられた方いらしたら教えてください🙏

### nginx の再起動について試行錯誤
* さて、 nginx の設定ファイルを書き換えた後は、nginx の再起動あるいは設定再読込が必要になるわけですが、どうしたらよいのかって話ですよね……
* なお、通常の nginx であれば、シンプルに以下のコマンドで設定再読込をしてもらえますが、今回は別プロセスなので意味がありません

```
nginx -s reload
```

* OS ごと再起動すればもちろん nginx の設定が再度読み込まれるわけですが、都度そんなことやってられんわーです
* `systemctl start com.filemaker.nginx.restart` で再起動できるんじゃない？　と思って試してみても、上記と同様でプロセスがお亡くなりになります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/592f79a1-3e17-1bec-c9ab-48b45e576c4a.png)

* 何が起きているのかもう少し調べてみたいわけですが `journalctl -u com.filemaker.nginx.start` で確認しても、大した情報は出てこない……

```
Dec 22 16:16:27 ubuntu-fms systemd[1]: Starting Filemaker.com monitor system and start Nginx Server...
Dec 22 16:16:27 ubuntu-fms systemd[1]: Started Filemaker.com monitor system and start Nginx Server.
Dec 22 17:23:20 ubuntu-fms systemd[1]: Stopping Filemaker.com monitor system and start Nginx Server...
Dec 22 17:23:20 ubuntu-fms systemd[1]: com.filemaker.nginx.start.service: Succeeded.
Dec 22 17:23:20 ubuntu-fms systemd[1]: Stopped Filemaker.com monitor system and start Nginx Server.
Dec 22 17:23:20 ubuntu-fms systemd[1]: Starting Filemaker.com monitor system and start Nginx Server...
Dec 22 17:24:51 ubuntu-fms systemd[1]: com.filemaker.nginx.start.service: start operation timed out. Term>
Dec 22 17:24:51 ubuntu-fms systemd[1]: com.filemaker.nginx.start.service: Failed with result 'timeout'.
Dec 22 17:24:51 ubuntu-fms systemd[1]: Failed to start Filemaker.com monitor system and start Nginx Serve>
Dec 22 17:36:24 ubuntu-fms systemd[1]: Starting Filemaker.com monitor system and start Nginx Server...
Dec 22 17:36:30 ubuntu-fms systemd[1]: com.filemaker.nginx.start.service: Succeeded.
Dec 22 17:36:30 ubuntu-fms systemd[1]: Stopped Filemaker.com monitor system and start Nginx Server.
Dec 22 17:38:20 ubuntu-fms systemd[1]: Starting Filemaker.com monitor system and start Nginx Server...
Dec 22 17:39:50 ubuntu-fms systemd[1]: com.filemaker.nginx.start.service: start operation timed out.
```

* えー、どうしよう……そこで気づく。もう一つ service が存在していることに！

```
 /opt/FileMaker/etc/systemd/system/com.filemaker.nginx.graceful.service
```

* `com.filemaker.nginx.graceful.service` ！！　中身を見てみましょう

```ini:com.filemaker.nginx.graceful.service
[Unit]
Description= Filemaker.com monitor system and graceful Nginx Server

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStart=/usr/sbin/nginx -c "/opt/FileMaker/FileMaker Server/NginxServer/conf/fms_nginx.conf" -s reload

[Install]
#WantedBy=multi-user.target
```

* `-s reload` ！！　これだ、求めていたのは！　ということで、`systemctl start com.filemaker.nginx.graceful.service` を実行してみるものの……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/7deb33bd-32ee-2b7e-533f-e664ada7c25d.png)

* `activating` のままフリーズ……そして、 failed ！！　しかも、その後 stop しても failed のまま戻ってこない。タチ悪いなあ……
  * ということで OS 再起動するしかない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/57e89e93-a62f-49f9-5780-ed72445ef871.png)

* `ps ax | grep nginx`でプロセスを確認すると、以下のように表示される

```
    853 ?        Ss     0:00 nginx: master process /usr/sbin/nginx -c /opt/FileMaker/FileMaker Server/NginxServer/conf/fms_nginx.conf
    854 ?        S      0:00 nginx: worker process
    855 ?        S      0:00 nginx: worker process
    856 ?        S      0:00 nginx: worker process
    857 ?        S      0:00 nginx: worker process
    858 ?        S      0:00 nginx: worker process
   1372 pts/0    R+     0:00 grep --color=auto nginx
```

* じゃあ systemctl 使わずに直接 `-s reload` コマンドを送ってやったらどうだ？　ということで、次のコマンドを試す

```
/usr/sbin/nginx -c "/opt/FileMaker/FileMaker Server/NginxServer/conf/fms_nginx.conf" -s reload
```

* ……フリーズして返ってこない
* じゃあもう nginx の master process を kill しちゃえ！

```
kill 853
```

* 確かに kill されたもよう。しかし、ここから `systemctl start com.filemaker.nginx.start` しても `/usr/sbin/nginx -c "/opt/FileMaker/FileMaker Server/NginxServer/conf/fms_nginx.conf"` しても、生き返りません。参ったなあ……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/615966ac-0c96-e0d9-2fd6-3c2c3a8314ab.png)

### nginx 設定再読み込み方法の解
* さあ、もう最終手段です。 `com.filemaker.nginx.start.service` ファイルの中に reload の定義を書き加えてやりましょう！！
* `ExecReload=/bin/kill -s HUP $MAINPID` という記述を `ExecStart` の下の行に追記する。以下のように

```ini:com.filemaker.nginx.start.service
[Unit]
Description= Filemaker.com monitor system and start Nginx Server
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStart=/usr/sbin/nginx -c "/opt/FileMaker/FileMaker Server/NginxServer/conf/fms_nginx.conf"
ExecReload=/bin/kill -s HUP $MAINPID

[Install]
#WantedBy=multi-user.target
```

* このあと `systemctl daemon-reload` を実行し、書き換えた設定ファイルを読み込み直す
* そして以下コマンドを実行！

```
systemctl reload com.filemaker.nginx.start
```

* ……フリーズしない！　status を確認してみると……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/a0ffccaf-b764-d13f-918d-f2d92bddcde8.png)

* ダウンしていない！　リロードできている！　やった、遂にたたかいに勝利した……

### nginx 設定再読み込み方法のまとめ
* というわけで、まとめると……
  * `/opt/FileMaker/etc/systemd/system/com.filemaker.nginx.start.service` ファイル内に `ExecReload=/bin/kill -s HUP $MAINPID` を追記
  * `systemctl daemon-reload` で systemd のリロード
  * 以後 `systemctl reload com.filemaker.nginx.start` コマンドで nginx の設定再読込がおこなわれるように
* ……って、フツーのひとがわかるかい！　って感じですよね

### 2022/12/23 追記
* ……と、たたかいに勝利したかのように見えたわけですが、その後、実際に nginx の設定ファイルを書き換えてリロードしてみても……反映されない！？　ということが判明。後日、検証のうえ、あらためて別方策を考えます……


## nginx のログ
* また、ログの出力先もデフォルトのものではなく、FileMaker Server 独自のところに指定されていますので、nginx での運用に慣れている人ほど、要注意

```
/opt/FileMaker/FileMaker Server/NginxServer/logs/
```

# nginx のチューニング
## ファイルの分割
* はい、というわけでようやく、チューニングに入っていきましょう
* まずはファイルが長大になりすぎるのを避けて運用をしやすくするために、分割しておきます
* どこで分割するのがよいかというと、以下のあたり、 `sorce_charset utf-8;` と `server {` との間あたりにするのがよいでしょう

```nginx:fms_nginx.conf
### 前略 ###

proxy_request_buffering off; # we dont wait until the whole request is completed

charset utf-8;
source_charset utf-8; 

server {
  listen 80;

  # Add headers for Cross-Origin Resource Sharing (CORS) policies

### 後略 ###
```

* さあ、そしてここから先は、後編記事に続く……

# 後編記事
* [Qiita - FileMakerServer での nginx チューニング](https://qiita.com/Hi_Noguchi/items/e57b8bb18c0b6efb6324)

https://qiita.com/Hi_Noguchi/items/e57b8bb18c0b6efb6324


# おわりに
## 雑感
* nginx の再起動方法を探り当てるのに疲れ果てました。まさかこんなに試行錯誤することになろうとは……
* fmsadmin コマンドで簡単に再起動 or 設定再読込できるとよいですよね。というか `com.filemaker.nginx.graceful.service` が用意されているのだから、できるのではという気がするのですが……私が何か見落としているだけ……？

## 参考
* nginx から apache に戻すこともできるようです。よほどの apache ファンでもなければやる必要はないでしょうけれど……
  * [Claris Community - FileMaker Server を 19.5.1 に、Ubuntu を 20.04 にアップグレードする - ステップ 5. Web サーバーの切り替え（オプション）](https://community.claris.com/ja/s/article/Upgrading-FileMaker-Server-to-19-5-1-and-Ubuntu-to-20-04#a5)