サーバーの起動

起動スクリプトはプロジェクトルートディレクトリのbinディレクトリ以下にあります。

次のように起動できます。

./bin/ocean-start

デーモン

デーモン化したい場合は次のようにしてください。
設定ファイルでpidが適切に設定されていることを事前に確認しておくとよいでしょう。
詳しくはコンフィギュレーションガイド [ サーバーセクション ]を参考にしてください。

./bin/ocean-start --daemonize

デーモン化したプロセスを停止するには、次のようにocean-stopを利用してください。

./bin/ocean-stop

ログファイルについて

デーモン化してしまった場合、ログを標準出力などに出していたら意味がありません。
設定ファイルを編集し、ログタイプをprintではなく、fileなどにしておくとよいでしょう。こちらについても詳しくはコンフィギュレーションガイド [ ログセクション ]を参照してください。

ただしdaemontoolsなどを利用する場合はこの限りではありません。

DNSの設定

SRVレコードの利用が推奨されています。
C2S用のサーバーにはxmpp-client、S2S用のサーバーにはxmpp-serverというサービス名を利用します。

C2S Server
_xmpp-client._tcp.im.example.org. 86400 IN SRV 10 20 5222 im.example.org
S2S Server
_xmpp-server._tcp.im.example.org. 86400 IN SRV 20  0 5269 im.example.org

当然ながら、クライアントアプリケーションが、DNSのSRVレコードを利用したルックアップに対応してなければ利用できません。

サーバーを複数台ならべる場合は、次のように分散できます

C2S Server
_xmpp-client._tcp.im.example.org. 86400 IN SRV 10 20 5222 im1.example.org 
_xmpp-client._tcp.im.example.org. 86400 IN SRV 10  5 5222 im2.example.org 

ただし、サーバーの性能などを基準にした静的な分散設定であり、サーバーの負荷状況をリアルタイムに反映するような動的なロードバランシングではありません。

分散処理について詳しくはクラスターガイドを参考にしてください。

カーネルチューニング

ソケット数のリミット

サービスの規模次第では、サーバーに対するクライアントソケットの同時接続数がかなり増えることが予想されます。

Linuxでは、ファイルディスクリプタの数にあらかじめ制限がかけられています。制限を変更するには、次のうちのどれかを行う必要があります。

  • 現在のシェルでulimitコマンドを使って設定
  • ユーザーのログインシェルで設定
  • サーバー起動時にinitscriptで設定

ulimitコマンドを実行する場合は次のように設定できます。ソフト値(S)とハード値(H)があり、ソフトが実際に採用されている値で、ハードはユーザーが変更可能な最大値です。

ソフト値の変更
ulimit -SN 100000
ハード値の変更
ulimit -Hn 100000

ユーザーのログインシェルで設定する場合は/etc/security/limits.confで設定します。

/etc/security/limits.conf
* hard nofile 100000
* soft nofile 100000

サーバー起動時にプロセスを自動起動してそれに反映させる場合は、/etc/initscriptで設定します。

/etc/initscript
ulimit -Hn 100000 
ulimit -Sn 100000 
eval exec "S4"

ちなみに設定できる最大値は1048576です。

TCP設定

サービスを提供する際のサーバーやクライアントのネットワーク環境を考慮し、必要であれば 再送タイムアウトの秒数やリトライ数などを始めとする各種パラメータを利用して、 チューニングを行うとよいでしょう。

  • net.ipv4.tcp_syn_retries
  • net.ipv4.tcp_synack_retries
  • net.ipv4.tcp_retries2
  • net.ipv4.tcp_orphan_retries
  • net.ipv4.tcp_tw_recycle
  • net.ipv4.tcp_fin_timeout

TLS証明書の準備

TLSをサポートしてサービスを公開するためには、証明書を準備しなくてはなりません。

ここではopensslコマンドを利用して必要な書類を揃える例を挙げておきます。

あくまで一例なので細かいパラメータの解説はしません。詳しくはopensslなどのドキュメントをあたるとよいでしょう。

秘密鍵の作成

次のように、まずは秘密鍵を作成します。パスフレーズが要求されるので適切なパスワードを入力します。このフレーズは忘れないように覚えておきましょう。

openssl genrsa -des3 -out server.key 2048

秘密鍵であるserver.keyファイルが作成されました。

パスフレーズ無しのものを作成したい場合は、今作成したばかりのserver.keyを指定して、次のようにコマンドを実行します。

openssl rsa -n server.key -out server.nopass.key

パスフレーズなしの秘密鍵であるserver.nopass.keyファイルが作成されました。

署名要求書の作成

上で作った秘密鍵であるserver.keyを元にして、署名要求書を作成します。

openssl req -new -days 365 -key server.key -out csr.pem

いくつかの項目について入力を求められるので適切に回答して下さい。

これで、署名要求書であるcsr.pemファイルが作成されました。

署名

上で作った署名要求書であるcsr.pemを認証局運営事業者に送って、署名済みの証明書を作成してもらいます。

認証局運営事業者に作成してもらった証明書を適切に配置して、コンフィグファイルの設定を行うとよいでしょう。詳しくはコンフィギュレーションガイド [ TLSセクション] を参照して下さい。

これで準備は完了ですが、ここではテストのために、認証局を自分で作成して、自己署名を行う方法も解説しておきます。

自己署名の証明書はプロジェクトテンプレートとして生成されるので、本来であれば一から作成する必要はないですが、自分で作ってみたい場合のみ、以降の解説を参照するとよいでしょう。

まず自分でCA (認証局) を用意しなければなりません。

CA作成のための設定ファイルテンプレートや、シェルスクリプトは、たいていの環境で準備されています。

まず自分の環境から、設定ファイルのテンプレートを探してきます。

  • Cent: /etc/pki/openssl.cnf
  • Debian: /usr/lib/ssl/openssl.cnf

これを任意の場所にコピーして、中身を編集します。各種ディレクトリパスや暗号強度などを適切に編集して下さい。

編集された設定ファイルが利用されるように、環境変数を設定しておくとよいでしょう。

export OPENSSL_CONF=/path/to/testCA/conf/openssl.cnf

次にCA作成スクリプトを探してきます。

  • Cent: /etc/pki/tls/misc/CA
  • Debian: /usr/lib/ssl/misc/CA.sh

これを任意の場所にコピーしてきて次のような箇所を編集しておきます。

SSLEAY_CONFIG="-config /path/to/testCA/conf/openssl.cnf"
CATOP=/home/foobar/testCA
CAKEY=cakey.pem
CAREQ=careq.pem
CACERT=cacert.pem

編集が完了したら、このスクリプトを実行しましょう。

./CA -newca

このコマンドの結果、次のファイルが生成されます。

  • cacert.pem
  • private/cakey.pem

これでCAの準備が出来ました。

署名要求書であるcsr.pemから、証明書を生成するには次のようにします。

openssl ca -config /path/to/testCA/conf/openssl.cnf -in path/to/csr.pem -out path/to/cert.pem

これで証明書であるcert.pemが生成されました。この証明書を適切に設置して、コンフィグファイルの設定を行うとよいでしょう。

Diffie-Hellman鍵交換

Diffie-Hellmanで鍵交換する場合には次のようにパラメータを生成します。

512bit版

openssl dhparam -check -text -5 512 -out dh512.pem

1024bit版

openssl dhparam -check -text -5 1024 -out dh1024.pem