これはなに
SPAやネイティブアプリなど、クライアントがサーバから独立している場合、時間情報はクライアントの情報を使うことになりがちです。
しかし、要件によってはサーバが指定する時間(あるいは運営者がコントロールしている時間情報)を指定したい場合があります。
その場合、Nginxでレスポンスすることでアプリケーションの負荷を下げることができます。
locationディレクティブ
location = /now.json {
if ($msec ~ "(\d+)\.(\d+)") {
set $unix_ts $1;
}
default_type application/json;
add_header Cache-Control "private, no-store";
add_header Date $date_gmt;
return 200 '{"unix": $unix_ts, "unix_msec": $msec, "iso8601": "$time_iso8601"}';
}
レスポンス
$ curl localhost/now.json -v
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /now.json HTTP/1.1
> Host: localhost
> User-Agent: curl/7.47.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.10.3 (Ubuntu)
< Date: Mon, 23 Jul 2018 02:50:13 GMT
< Content-Type: application/json
< Content-Length: 89
< Connection: keep-alive
< Cache-Control: private, no-store
< Date: Monday, 23-Jul-2018 02:50:13 GMT
<
* Connection #0 to host localhost left intact
{"unix": 1532314213, "unix_msec": 1532314213.183, "iso8601": "2018-07-23T02:50:13+00:00"}%
解説
- JSONの時間データ
- unixには秒単位のUnix Timestamp
- unix_msecにはミリ秒単位のUnix Timestamp
- iso8601にはISO 8601もしくはRFC 3339で定められた時間形式
- DateヘッダにはRFC 850の時間が入る
- Cache-controlでキャッシュの無効化
- 要件とリクエスト数とCDNの有無よっては1秒程度のキャッシュは有効かも?