2014年5月16日金曜日

作業ログを確実にとる

最近仕事で後輩に対しても作業ログをしっかりとることを指導している。
クライアントのロガー機能でとるのもそうなんだけど、どうも忘れがち。
そこでteeを使って、作業ログを取ることを提案した。
ssh user@server | tee -a work-20140516.log
これで作業ログを残してかつ、遠隔地でのダブルチェックをすることができる。
作業者: $ ssh user@server | tee -a work-20140516.log
ダブルチェック者: $ tail -f work-20140516.log
これでもいいんだけど、たまに忘れてしまうので、下記のコマンドを踏み台サーバの/etc/bashrcに入れる。
おまけでReadonlyにすることで確実に記録がのこる。
$ function ssh () { command ssh $@ |tee -a `whoami`-`date +%Y%m%d%H%M%S`.log ;}$ readonly -f ssh
簡易的なトレースアビリティの確保にはちょうどいいかもしれない。

Nginx - https 2GB以上POSTできない(curl: (56) SSL read: errno -5961)

特異な事象にぶち当たったので、自分用メモと解決方法をメモしておきます。

事象はNginxのSSL通信において、2GB以上のPOSTができない。
POSTをしようとすると以下のようなエラーが出てClientから切断される。
非SSLの場合は転送ができるのでよくわからない。

$ curl -ikv -X PUT -T test4GB.img "https://server/upload/test.txt" 
HTTP/1.1 100 Continue
* SSL read: errno -5961* Closing connection #0curl: (56) SSL read: errno -5961
Nginxのログを見ても以下の通り。

2014/05/10 14:56:44 [info] 16121#0: *973320 client prematurely closed connection, client: client01, server: server001, request: "PUT /upload/test.txt HTTP/1.1", host: "server001"
原因はNginxの client_body_buffer_size の設定。この設定値が大きかった。
client_body_buffer_size    3096m;

パフォーマンス向上になるかと値を大きくしたのだが、この設定はそれだけメモリを食う様子。
しかし、なぜかOut of MemoryにもならずNginxが起動してしまったので、これでいいかと思っていたが、そうではなかった。
おまけに、この値大きく変えても、POSTできないサイズは2GBで固定だったのでわからなかった。

設定値を小さくしてNginxをReload。これで解消された。
client_body_buffer_size    256k;
何が起こっていたかは、これは予想だが以下の通りだと思われる。

  • Nginxは正常に起動、しかしメモリがいっぱいいっぱい。
  • SSL通信時にOpenSSLのライブラリがラージファイル用にメモリを確保?
  • 確保できないのでハンドシェイクでエラーを返す?
  • クライアントが通信を切断。
直ってしまったのでこれ以上の調査はしないけれど、この予想、間違ってたらだれか教えてください。