NHPサーバ


NHP Top

NHPクライアント
NHPサーバ
仕様 (Ver. 0.3.0)
日本国の祝日
カレンダーサービス
管理運用情報
NHPサーバはhttpクライアントのリクエストに対し、リクエストされた期間または指定日の祝日データを返します。また、上位のサーバに同期して祝日データを常に最新のものとすることが可能です。

ここでは、nhp.cgiでのNHPサーバの運用法を紹介します。現在、NHPは、httpによるCGIによって運用されており、その設定はhttpサーバ(apache)の設定と不可分になっています。クイックスタートとして「3. apacheの設定」まで行えば、nhp.cgiは機能します。

また、nhp.cgiは、bashのシェルスクリプトとして実装されており、以下のrpmパッケージとして配布しています。実証環境は、Vine Linux 6.5です。
2017-12-15 

nhp-utils-0.3.0-0pe5.noarch.rpm
nhp-utils-0.3.0.tar.gz

1. インストール
2. nhp.cgiの設定
3. apacheの設定
4. 自動更新の設定
5. 祝日データの編集
6. DocumentRoot以外による運用
7. 複数国への対応
8. ルータ越えへの対応
9. ログ
10. セキュリティ
11. 想定される諸問題・障害


1. インストール

まず、rpmでnhp-utilsをインストールして下さい。次にNHPサーバの設定を行い、祝日データを取得(同期)して、最後にapacheでCGIの設定を行い終了です。祝日データの取得(同期)に関しては、現状、このNHPサーバ(http://nhp.karing.jp/nhp.cgi)は日本の祝日にしか対応していないので、他国の祝日に対応する場合は自力で祝日データを編集(5. 祝日データの編集)することになります。なお、ここでの説明は特段の注釈がないかぎり、デフォルトカントリーが日本になっており、コマンドの実行などの際、対象国を指定するcountry=JPNが省略されています。

・インストール
インストールは単純にrpmで行います。rootになり下記を実行します。

# rpm -Uvh nhp-utils-0.2.18-0pe1.i386.rpm

インストール先はデフォルトでは、/var/www/htmlで、いわゆるapacheのドキュメントルートになっています。NHPサーバの実体は、nhp.cgiというシェルスクリプトです。設定ファイルは/etc/nhp.conf、ログファイルは/var/log/nhp.logです。ログファイルに書き込み権限のないユーザーはnhp.cgiを実行できません。

nhp.cgiは、デフォルトの/var/www/html以外でも運用できますが、その方法については後述します(6. DocumentRoot以外による運用)。


2. nhp.cgiの設定

設定ファイル(/etc/nhp.conf)における重要な定数は、nhp_server_urlとcountry_dbです。nhp_server_urlは自分自身のURLを記述します。nhp_server_urlにはデフォルト値"http://$HOSTNAME/nhp.cgi"が存在しますが、設定ファイルに記述することを薦めます。country_dbには完全なデフォルト値は存在せず、未設定の場合にはエラーになります。なお、設定ファイルでは"#"以降、改行まではコメントになります。
ex.
nhp_server_url=http://nhp.example.jp/nhp.cgi
country_db=JPN,http://nhp.karing.jp/nhp.cgi,1,0,

country_dbは、","で区切って設定値を並記したもので、1番目はISO 3166-1に準拠したカントリーコードで、このNHPサーバが対応する国のカントリーコードを指定します。カントリーコードの一覧は、"./ISO_3166-1.sh -a"で取得できます。数値、アルファベットどちらでも指定できます。

2番目は祝日データを参照するNHPサーバのURLです。単に祝日データをリクエストする場合は、IPアドレスでもエリアスでもWebサーバが管理しているURLであれば問題なく祝日データを取得できますが、認証を要するリクエストでは参照サーバの正確なURLが必要です。このURLは、status=1で得られる参照サーバのステイタス情報のNHP_SERVER_URLがそれになります。自動更新の設定などはせず、ルートサーバとして運用する場合は不要です。なお、このNHPサーバは"http://nhp.karing.jp/nhp.cgi"です。また、このNHPサーバは日本の祝日にしか対応していないので日本以外の祝日に対応する場合はその祝日データを自己編集する必要があります。自己編集の方法は、5. 祝日データの編集です。

3番目はデフォルトリクエストレベル(サーバ任意の祝日のレベル)で通常は1(国の祝日)を指定します。デフォルトリクエストレベルの詳細は仕様(Ver. 0.3.0)を参照して下さい。

4番目は管理する下位サーバの最大数です。ex.では0になっており、このサーバは自動更新の登録を認めていません。この機能についての詳細は後述します(4. 自動更新の設定)。

5番目の数値は、祝日データの発信元・ルートサーバから何階層あるかを示すための設定ですが、通常は自動判定されるので未指定にします(","で終了する)。明確にルートサーバであることを示す場合のみ0を記入します(",0"で終了する)。

1番目の設定値以外はデフォルト値が存在するので省略可能ですが、各値をそれぞれ未記入にするときはセパレータの","は省略せず、値だけを未記入にします。

設定が終わったら、一旦、/var/www/htmlに移動し、nhp.cgiを引数status=1(ステイタス情報の取得)で端末から実行します。とくに意識する必要はありませんが、この実行によって必要な一時ファイルなどが作られます。nhp.cgiの端末からの実行は引数を空白で区切るか、いわゆるQUERY_STRINGの形(&は\でエスケープして下さい)でそのまま引数にします。

[root@YOUR.NHP.SERVER html]# ./nhp.cgi status=1
Content-type: text/plain

#2,20160602174805,0.3.0,JPN,1,status=1
#1,,,,,0,http://nhp.karing.jp/nhp.cgi
#COUNTRY,JPN
#NHP_SERVER_URL,http://YOUR.NHP.SERVER/nhp.cgi
#DEFAULT_REQUEST_LEVEL,1
#X_CONF_URL,NONE -
#X_REGISTER_GUEST_SERVER,NO
#X_AUTO_UPDATE,OFF
#X_LOG_STATUS,GET_STATUS
#X_CGI_VERSION,0.2.16-rc7.4

上記の2が返り値で祝日データが存在しないというエラーを表しています。

次に祝日データを同期します。祝日データを自己編集する場合の詳細は後述します(5. 祝日データの編集)。祝日データの同期は、status=3です。同期するNHPサーバは設定ファイルで指定されているNHPサーバです。設定ファイルとは異なるURLを","で区切って"3"に付加して実行した場合はそのURLのサーバと同期します。祝日データはcountry_code.dbというCSVファイルになります。

[root@YOUR.NHP.SERVER html]# ./nhp.cgi status=3

成功すると同期した祝日データそのものが端末にも表示されます。status=1でステイタス情報を確認し、返り値が0になっていればnhp.cgiの設定は終了です。

確認のため、2016年度の日本の祝日を取得してみます。

[root@YOUR.NHP.SERVER html]# ./nhp.cgi start=20160401 end=20170331
Content-type: text/plain

#0,20160602181226,0.3.0,JPN,1,start=20160401 end=20170331
#1,20150101,20180228,201606021804,201602170206,1,http://nhp.karing.jp/nhp.cgi
20170320,春分の日,1
20170211,建国記念の日,1
20170109,成人の日,1
20170102,振替休日,1
20170101,元日,1
20161223,天皇誕生日,1
20161123,勤労感謝の日,1
20161103,文化の日,1
20161010,体育の日,1
20160922,秋分の日,1
20160919,敬老の日,1
20160811,山の日,1
20160718,海の日,1
20160505,こどもの日,1
20160504,みどりの日,1
20160503,憲法記念日,1
20160429,昭和の日,1

また、NHPサーバの運用には祝日データを最新に保つための何らかの対応が必要です。nhp.cgiは参照サーバと祝日データを同期する機能(4.自動更新の設定)を有していますが、自動更新は仕様ではなく、まだ草案です。別解として、cronなどで単純に更新を定期実行することも可能です。下記がcronによる定期更新の一例です。これは、毎月10日 11:12に祝日データの更新を実行します。

12 11 10 * * cd /var/www/html; ./nhp.cgi status=3,http://nhp.karing.jp/nhp.cgi

この項の最後に、nhp.cgiのXMLHttpRequestへの対応についてですが、デフォルトではセキュリティの観点から無効化されています。しかし、NHPの目的・用法を考えると無効化されていると何かと不便ですので、有効化することをお薦めします。有効化は設定ファイルに以下を付加して下さい。
cross_origin_ok=1


3. apache(CGI)の設定

nhp.cgiの設定が終了したので、次に、これをネットワーク上から実行できるようにします。つまり、apacheのCGIとして実行可能にします。

nhp.cgiでは、apacheのユーザ名はapacheであると想定していますが、最新のapacheではユーザ名がwww-dataになっているようです。この場合は、設定ファイル(nhp.conf)で「http_gid=www-data」を指定して下さい。

apacheでCGIを有効化するには、大きく二つの設定が必要です。当該のディレクトリでCGIを実行可能にすることと実行ファイル(nhp.cgi)がCGIの実行ファイルであると設定することです。

まず、/var/www/htmlでのCGIの実行を可能にします。設定ファイル(/etc/apache2/conf/httpd.conf)のディレクトリ(/var/www/html)の設定でOptionsにExecCGIを加えます。

<Directory "/var/www/html">

    Options Indexes FollowSymLinks ExecCGI

    AllowOverride None

    Order allow,deny
    Allow from all

</Directory>

次にnhp.cgiがCGIの実行ファイルであることをapacheに認識させます。この設定は、CGIの実行ファイルであることを設定するAddHandlerディレクティブで行います。具体的には、設定ファイルの下記行の行頭の#を削除するだけです。

#AddHandler cgi-script .cgi
     ↓
AddHandler cgi-script .cgi

後は、apacheを再起動します。

[root@YOUR.NHP.SERVER html]# /etc/inint.d/apache restart

正常に機能しているか試してみます。
[root@YOUR.NHP.SERVER html]# wget -O - http://127.0.0.1/nhp.cgi?status=1

想定通りの値が返されればこれで基本設定は終了です。


4. 自動更新の設定

NHPは階層化・分散化したシステムを指向しています。一例としてはNTPのようなシステムを目指していますが、NHPとNTPには大きな違いがあります。それは、NTPが時刻データを常時更新しているのに対し、NHPのデータ更新は一時的で、また、そのタイミングが不特定・不定期であるということです。よって、NHPの場合、常時更新するのは無駄ですし、適当なタイミング、適切な頻度を考慮する必要があります。単純には、上位のサーバが祝日データを更新した時に下位のサーバも更新させるような機能が適切で、NHPの自動更新もそのように機能します。以下、自動更新など16以上のステイタスリクエストは仕様(0.3.0)ではなく、草案による規定であり、nhpdはnhp.cgiの実装によるものです。

自動更新は自動更新の登録を実行するだけです。設定ファイルのcountry_dbに設定された参照サーバが登録先になります。まず、nhp.cgiのディレクトリに移動し、status=18を実行します。

[root@YOUR.NHP.SERVER html]# ./nhp.cgi status=18

これで、成功ステイタスの0が返ってくれば終了です。自動更新が成功した場合、自動生成されたパスコードがnhp.[カントリーコード].keyに記録されます。自動更新の現状を表示する「X_AUTO_UPDATE」はこのファイルが空かどうかを調べています。原則的にこのファイルが空でなければ自動更新の登録はなされていることになりますが、なんらかの理由で参照サーバ側がその登録を抹消している場合もあります。自動更新の登録を確認する場合は端末からstatus=25を実行します。登録されている場合はステイタス情報に「X_THIS_SERVER_REGISTERED,OK」が表示されます。登録されていない場合はNOになります。

また、自動更新の登録に失敗し、508が返った場合は、そのNHPサーバは自動更新の登録を受け付けていません。おそらく、すでに登録最大数を越えています。登録の可否は、ステイタス情報の「X_REGISTER_GUEST_SERVER」でわかります。もし、これが「OK」なのに登録できない場合はサーバの管理者に問い合わせて下さい。なお、「X_REGISTER_GUEST_SERVER」は、OKかNOでしか表示されないので登録最大数に関してはわかりません。登録最大数は設定ファイル以外には表示されないので設定ファイルの可読ユーザ以外は知りえません。

自動更新の登録を抹消する場合は端末からstatus=21を実行します。成功すると「X_AUTO_UPDATE」がOFFになります。

実際の自動更新は具体的には祝日データが更新された時、その更新者、つまりそのルートサーバの管理人が端末からstatus=29で行います。status=29が実行されると登録されているサーバすべてに祝日データの更新を指示します。これにより各下位サーバは祝日データを更新し、さらに自己に登録されているサーバに祝日データの更新を指示します。

また、自動更新は、実際の更新があった時に最上位のサーバの管理者が任意に、一回、行うものですが、nhp.cgiには周期的なアクセスを行い祝日データを同期させる解法も有しています。それが、nhpdです。nhpdは設定ファイル(nhp.conf)に「nhpd_on=1」と設定することで有効化します。nhpdが起動していれば、「X_NHPD」に、START、RESTART、RUNNINGなどが表示されます。起動していないときは、OFFが表示されます。nhpdは設定されてさえいればnhp.cgiの動作に連動して自動で起動されますが、明示的に再起動したい時はstatus=31を実行します。停止させる時はstatus=31,stopを実行して下さい。nhpdは「ps ax」では、以下のように表示されます。
1310 ?        S      0:00 /bin/sh /var/www/html/nhp.cgi status=31
nhpdのデフォルトでは2時間毎に下位サーバにアクセスし、下位サーバの状態を確認しており、祝日データに差異があれば下位サーバを同期させます。デフォルトの2時間毎という間隔は検証の要があるかもしれませんが、nhp.cgiでは一日(1440分)に一回はアクセスすることになっており、それを異常の判断基準としています。下位サーバの状態は、nhp.server.[カントリーコード].dbに記述されており、各行末尾の数値がその状態を表しています(数値の意味は仕様および草案を参照)。

また、nhpdは何らかの原因で上位サーバからのアクセスが途絶えた時には自ら上位サーバにアクセスし、同期状況を確認します。上位サーバの状態はステイタス情報の「X_CONF_URL」に表示されます。状態の脇の数値はルートサーバからの時間的距離(分)になり、祝日データが更新された時は最大でもこの時間内に更新が終了します。この最大値は1440分(一日)で、それ以下に収める必要があります。
#X_CONF_URL,http://nhp.upper.example.com OK 480

nhpdはデフォルトではデフォルトカントリーにしか機能しません。複数国に対応したい場合は設定ファイルのsync_country_listで設定してください。カントリーコードを","で区切って列記します。
sync_country_list=JPN,USA,RUS

祝日データの更新は年に一、二回程度にもかかわらず、周期的なアクセスを維持するのは無駄な行為に見えますが、実際の更新時に対象のサーバと正常に通信できなければ対応が困難になります。祝日データが更新されていたのに、上位サーバがダウンしていたため、上位サーバがダウンしていることに気づかず、祝日データが更新されていないことにも気づかない、という事態を避けるためにNHPでは周期的なアクセスは必要だと考えています。

nhp.cgiによるNHPサーバは、自らが登録を受けつけることも可能です。この場合、nhpdを動作させる設定(nhpd_on=1)とcountry_dbの","で区切られた4番目(m)に最大登録数を設定することが必要です。ただし、nhp.cgiの実装では、この数値は単に登録の可否を判断するためのもので実際に登録されているサーバの数を制限するものではありません。なお、草案では、上位サーバの管理者は下位サーバからの登録を任意に抹消できるものとしています。
country_db=JPN,http://nhp.karing.jp/nhp.cgi,1,m,


5. 祝日データの編集

祝日データのファイル名は[ISO3166-1の数値コード].dbで、日本の場合は「392.db」になります。文字コードはUTF8で、改行はnhp.cgiがLinuxを想定しているため<LF>です。祝日データは、「日付,祝日名,データレベル」となり、慣例として昇順(上方が新しい)に並べます。ただし、nhp.cgiは内部的に祝日データをソートしているため順番の間違いが間違いとして顕在化しない場合があります。

祝日データの日付は8桁の数値のみで表し、データレベルは通常は1(国の祝日)です。また、祝日データにはデータレベル0の平日(土日を含む非祝日、以下同じ)を入れることができます。これによって祝日データの有効範囲を広げることができます。下の例では祝日データの有効範囲は、20150101〜20180228の期間となりますが、20180228の平日を削除した場合、その有効範囲は20150101〜20180211となります。データレベル(HL拡張)についての詳細は仕様を参照して下さい。

20180228,平日,0
20180211,建国記念の日,1
20180108,成人の日,1
-- -- -- -- 略 -- -- -- --
20150211,建国記念の日,1
20150112,成人の日,1
20150101,元日,1

祝日データには法律・政令等で確定している祝日のみを記述します。多くの祝日は確定しているものですが、日本の祝日において、春分の日、秋分の日は国立天文台の観測で確定するため3年後の春分の日、秋分の日はまだ未確定です。ですので、日本の場合、未来の祝日に関しては最大で二年分くらいが限界になります。

参照サーバから取得した祝日データファイルを再編集することも可能です。NHPの出力における改行は<CR><LF>になっていますが、nhp.cgiが同期させた祝日データファイルはLinux環境下では改行が<LF>になっています。Linux環境下に<CR>が混じっていると想定外・予測不能の挙動に混乱させられることがあるので、<CR>が混入する事態はできるだけ避けるのが無難です。

また、祝日データを再編集した場合、自己が祝日データの発信元となり、参照レベルは0になります。なお、自動更新やnhpd(上位サーバの設定をしている場合)を有効にしていると、当然、再編集以前のデータで上書きされてしまうので注意が必要です。


6. DocumentRoot以外での運用

ここでは、nhp.cgiをDocumentRoot(/var/www/html)以外で運用する方法を紹介します。一例としてもっとも一般的なホームディレクトリでの運用を想定し、ユーザーnhpがnhp.cgiを運用するディレクトリを/home/nhp/public_htmlとします。

まず、必要なファイルをpublic_htmlにコピーします。必要なファイルは、nhp.cgi、ISO_3166-1.sh、mkrsakeyの三種です。

[nhp@localhost public_html]$ cp /var/www/html/nhp.cgi .
[nhp@localhost public_html]$ cp /var/www/html/ISO_3166-1.sh .
[nhp@localhost public_html]$ cp /var/www/html/mkrsakey .

次に設定ファイルを作成します。nhp.cgiのデフォルトでは設定ファイルは/etc/nhp.confですが、nhp.cgiと同じディレクトリにnhp.confがある場合はこれを優先します。nhp_server_urlは、ドメイン名をhttp://nhp.example.jp/とした場合、http://nhp.example.jp/~nhp/nhp.cgiとなります。country_dbについては、2. nhp.cgiの設定を参照して下さい。そして、この項に特有な設定としてnhp_logがあります。nhp.cgiはログファイルの書き込み権限がないユーザーは実行できないので書き込み権限があるログファイルを設定します。ここでは、/home/nhp/public_html/nhp.logとします。

--- nhp.conf ---
nhp_server_url=http://nhp.example.jp/nhp.cgi
country_db=JPN,http://nhp.karing.jp/nhp.cgi,1,0,0
nhp_log=/home/nhp/public_html/nhp.log

なお、デフォルトのログである/var/log/nhp.logはlogrotateの管理下にあり、定期的にログが更新されますが、ここで設定したログは、当然、その管理下にありません。ただし、nhp.cgiはログを独自に更新しており、デフォルトでは日曜日毎に4週間分のログを保持しています。

設定ファイルが完成したところで、一旦、nhp.cgiを実行してみます。

[nhp@localhost public_html]$ ./nhp.cgi status=1
Content-type: text/plain

#2,20160614141153,0.3.0,JPN,1,status=1
#1,,,,,0,http://nhp.karing.jp/nhp.cgi
#COUNTRY,JPN
#NHP_SERVER_URL,http://nhp.example.jp/~nhp/nhp.cgi
#DEFAULT_REQUEST_LEVEL,1
#X_CONF_URL,NONE -
#X_REGISTER_GUEST_SERVER,NO
#X_AUTO_UPDATE,OFF
#X_LOG_STATUS,GET_STATUS
#X_CGI_VERSION,0.2.16-rc7.2

上記のような出力があるはずです。次に祝日データを同期します。これは、2. nhp.cgiの設定で行った操作と同様です。

[nhp@localhost public_html]$ ./nhp.cgi status=3

nhp.cgiの設定が完了したら、apacheの設定を行います。当該のディレクトリですでにCGIが利用できる環境であれば、apacheの設定は不要です。当該のディレクトリでCGIが利用できない場合に必要な設定は、UserDir(public_html)の有効化、ExecCGIの有効化、拡張子.cgiの有効化です。

ExecCGIの設定についてはWebサーバ(apache)の運用ポリシーに大きく左右されるので、ここでの例は参考程度のものと考え、それぞれの目的に合った適切な設定を行なって下さい。以下は、ExecCGIを有効化するもっとも簡単な設定です。OptipnsにExecCGIを付加しています。

<Directory />
    Options FollowSymLinks ExecCGI
    AllowOverride None
</Directory>

次に拡張子.cgiの有効化ですが、これは2. nhp.cgiの設定と同様ですのでそちらを参照して下さい。

最後にホームディレクトリの有効化を設定します。デフォルトでは、ホームディレクトリ(UserDir)は無効化されていると思いますが、これを有効化します。下記該当箇所のUserDir disableを#でコメントアウトし、UserDir public_htmlの#を削除します。

<IfModule mod_userdir.c>
-- -- -- -- 略 -- -- -- --
 UserDir disable

-- -- -- -- 略 -- -- -- --
    # the following line instead:
    #
    #UserDir public_html

</IfModule>

     ↓

<IfModule mod_userdir.c>
-- -- -- -- 略 -- -- -- --
 #UserDir disable

-- -- -- -- 略 -- -- -- --
    # the following line instead:
    #
    UserDir public_html

</IfModule>

設定が終わったらapacheを再起動します。

[root@localhost ~]# /etc/init.d/apache2 restart

正常に機能しているか試してみます。
[root@localhost ~]# wget -O - http://127.0.0.1/~nhp/nhp.cgi?status=1

想定通りの値が返されれば終了です。

DocumentRoot以外での運用では、rpmによるアップデートが効きません。ですので、アップデートする場合は、rpmでアップデートした後、DocumentRootから再度コピーして下さい。または、nhp-utils-VERSION.tar.gzをダウンロードして、直接、ファイル(nhp.cgi)を抜き出して下さい。


7. 複数国への対応

nhp.cgiは複数の国の祝日に対応することができます。設定ファイルのcountry_dbに空白で区切って国毎の設定を並記するだけです。ただし、引用符で囲って下さい。以下に一例を示します。左端にある設定がデフォルトカントリーになります。

country_db="JPN,http://nhp.karing.jp/nhp.cgi,1,0, USA,http://example.com/nhp.cgi,1,,,"


8. ルータ越えへの対応

LAN内でプライベートIPのアドレスを持つNHPサーバをグローバルに公開する場合を考えます。通常はルータのNAT機能などを利用するかと思います。単に祝日データへのアクセスだけならそれで何の問題も生じないのですが、自動更新などのNHPサーバ間通信がルータの内側と外側に生じる場合(外側に上位サーバ、内側に下位サーバを持つ場合など)には問題が生じます。NHPサーバ間通信の認証ではホスト名を用いるため、ルータの内側と外側で異なるホスト名を持つ場合はNHPサーバもそれに合わせてホスト名を変えなければなりません。

NHPサーバのURLは設定ファイル(nhp.conf)の「nhp_server_url」によって指定します(2. nhp.cgiの設定)が、複数のホスト名で運用する場合はIPアドレスによって適切なURLを出力するシェルスクリプトを「nhp_server_url」に指定します。仮に、nhp.lan.shとすると「nhp_server_url=nhp.lan.sh」とします。nhp.lan.shは実行権をつけてnhp.cgiと同じディレクトリに置いて下さい。
--- nhp.lan.sh ---
#!/bin/sh
addr=$1
if [ "${addr%.*}" = 192.168.1 ];then
    echo http://virgo.example.jp/nhp.cgi
else
    echo http://nhp1.example.com/nhp.cgi
fi

exit 0
上記は一例です。自己の環境に合わせて調整・修正して下さい。


9. ログ

ログフォーマットは以下のようになります。

Standard_IO [ Date_Time ] QUERY_STRING - LOG_STATUS Return_Value User Options

ex.
192.168.45.7 [ 2017-11-15 08:31:35 ] status=28,http://tampopo.karing.jp/nhp.cgi,28294062163328835 - RETURN_PUBLIC_KEY_END 0 yoshino "nhp-utils-0.2.17-rc2.3.9.7.6.2"
/dev/pts/4 [ 2017-11-15 09:52:05 ] status=1 - GET_STATUS 0 yoshino "nhp.cgi-0.2.17-rc2.3.9.8 on gnome-terminal"

Standard_IO は、nhp.cgiがネットワーク上からCGIによって実行された場合はそのIPアドレス(REMOUT_HOST)になり、端末から実行された場合はその端末デバイス名になります。また、nhp.cgiがシステムコマンドとして実行した場合はその対象サーバのURLになります。

[ Date_Time ] は、実行時の日付と時間です。

QUERY_STRING はネットワーク上から実行された場合とnhp.cgiがシステムコマンドとして実行した場合は単純にQUERY_STRINGですが、端末から実行された場合はその引数になります。

LOG_STATUS はその操作の大まかな内容です。詳細はLOG_STATUS一覧を参照して下さい。

Return_Value は返り値です。通常はスタイタス情報の最初の値と同値です。

User は実行したユーザーです。

Options は、NHP on HTTPでは、いわゆるUser Agentです。ネットワークアクセスではない場合は端末などが適宜記録されます。

nhp.cgiはユーザ側から見て一つの操作でもサーバ間で複数の通信を行うことがあります。この場合、当該の操作の開始時にLOG_STATUS_STARTの操作名を持つログが記録され、その操作の終了時にLOG_STATUS_ENDの操作名を持つログが記録されます。


10. セキュリティ

nhp.cgiはWebサーバを利用したCGIであるため、そのセキュリティもWebサーバの設定に大きく依存します。DoS攻撃やデータファイルの改竄等、一般的な攻撃に対してnhp.cgiにはほぼ対応策がありません。とくに、DocumentRoot以外で運用する場合は、各種権限の設定を精査して運用して下さい。

nhp.cgi独自のセキュリティシステムとしては、NHPサーバ間の通信に関して、成りすましを防ぐための認証システムとパスコードをやり取りするためのRSA暗号通信システムを実装しています。これらは管理者やユーザーが特に意識する必要のないものですが、ログには頻出します。


11. 想定される諸問題および障害

祝日データは常時必要なデータではありませんが、しかし、祝日データを必要とするアプリケーション等は起動時、または一日毎に祝日データを更新させるようなプログラムを無意識に開発することが十分に考えられます。なぜなら、アプリケーション側からすればそれは大した負荷ではないからです。では、この場合、どれくらいのNHPアクセスが生じるかを考えてみます。日本の労働人口の一人に一つ、祝日データを必要とするアプリケーションを持ち、それが一日に一度、祝日データにアクセスすると仮定すると一日で約8,640万のNHPアクセスが生じます。一日は86,400秒なので1秒間に約1,000回になります。これは単独のサーバが処理するには非現実的な数字です。

似たようなアクセスを生じるサービスにNTPがありますが、NTPは利用者が意識してアクセスを分散しているため上手く機能しています。NHPもNTP同様、利用者に意識してアクセスを分散してもらわないと機能不全に陥る危険性が少なからずあります。もっとも、実際のスマフォアプリなどでは強制的なアップデートが容易なので個々のアプリが単独で祝日データを更新するような方法論はとらないことが大半だとは思われますが、アクセス数の増大はNHPにとって常に課題であり、NHPが分散化・階層化を指向する最大の要因です。

また、NHPは、現在、組織的もしくは公共的な運用は行われてはいませんので、運用の継続性に対する信頼性の問題があります。このnhp.karing.jpに関しては最大の努力をもって永続的な運用を目指していますが、個人の力では、寿命、資金、外圧、等々、限界があるかもしれません。このような不安定性、不確実性に柔軟に対応するため、NHPでは、上位サーバによる登録サーバの任意の抹消など強力な管理権を保証しています。rsa.dbやidentkey.dbに残っている認証用データなども任意に削除でき、それにより生じる障害にも責を負いません。NHPサーバの最重要課題は正確な祝日データの維持と安定した接続を確保することであり、NHPサーバの管理人はそのためにその強力な管理権を行使することが望まれます。

最後にNHPにおける最大の事故について考えます。NHP最大の事故は誤った祝日データが伝搬してしまうことです。自動更新の機能は強力ですが、エラーも強力に伝搬してしまいます。ただ、自動更新で伝搬したものは自動更新で修正できるので、NHPサーバ自体の修正は容易ですが、誤った祝日データを取得したクライアントにはその祝日データに誤りがあったことを周知する適切な方法がありません。これは、NHPに限った問題ではなく、最終的にはメディアという対人コミュニケーションに頼らざるを得ないという、そういう類の問題なのですが、結局、ITという分野においても最も重要な問題は技術的には解決できないことを示す良い例だと思います。特に、技術的に高度なものはないNHPにおいては人の力に負うところが大きく、技術よりもマンパワーという泥臭い解法が必要になる局面が多々現出することが予想されます。最後は、人の力、これがNHP最大の難問です。