Lua-resty-auto-ssl: ロックの問題

䜜成日 2017幎02月01日  Â·  20コメント  Â·  ゜ヌス: auto-ssl/lua-resty-auto-ssl

リバヌスプロキシnginxサヌバヌでクラッシュしおいるずいう問題が発生しおいたす。 圌らは芁求に完党に応答するのをやめ、圌ら自身でこの状態から抜け出しおいないようです。 これらのサヌバヌは、倧量のリク゚スト1日あたり500䞇を超えるを凊理したす。

過去数日間、私は少し途方に暮れおいお、監芖によっおこれを譊告されたずきはい぀でも手動でDockerむンスタンスを再起動したしたが、nginxがただ応答しおいるかどうかをチェックするヘルパヌcronスクリプトを配眮するこずにしたした問題が発生した堎合は、supervisordを介しお再起動したす。

最初にDockerコンテナヌを再起動しおいたため、実際にはデバッグ情報を取埗しおいたせんでした。ロギングが停止するだけでした。 ただし、これを倉曎しお代わりにコンテナ内でnginxを再起動した埌、ログに次の情報が蚘録されたす。

2017/02/01 01:14:16 [alert] 489#0: worker process 501 exited on signal 9
2017/02/01 01:14:16 [alert] 489#0: shared memory zone "auto_ssl" was locked by 501
2017/02/01 01:14:16 [alert] 489#0: worker process 502 exited on signal 9

私はGoogleを利甚しおいたしたが、参照できるのはhttps://github.com/18F/api.data.gov/issues/325だけです

同じDockerコンテナを䜿甚しおも、このバグをロヌカルで再珟するこずはできたせん。

私は少し途方に暮れおいたす、私たちの自動再起動スクリプトは今のずころ問題を敎理したしたが、誰かがアむデアを持っおいるかどうかを確認するのはいいこずです。 远加のログをオンにしおデバッグログを詊行できれば幞いです本番サヌバヌでオンにするのは少し怖かったです。

最も参考になるコメント

たた、本番環境でこの問題が発生したした–

OpenRestyを>1.15.8.1曎新したす

これは非垞に有害であるように思われるので、f66bb61f11a654f66d35dd793ceaf0293d9c0f46をすぐにリリヌスするか、少なくずも掚奚事項ではなく、芁件に合わせおドキュメントを曎新する䟡倀があるかもしれたせん。

党おのコメント20件

ああ、これが停止に぀ながったず聞いお申し蚳ありたせん

残念ながら、私たちのむンストヌルでは、かなりの量のトラフィックを取埗するこのようなものは芋おいたせん昚幎3月の事件以来。 ただし、29で報告されたこのような別のやや類䌌した問題があり、関連しおいる可胜性のある問題を修正したしたが、問題を完党に説明しおいない可胜性がありたす。 ただし、その問題は関連しおいない可胜性もありたす登録が発生した時期に固有でした。

これをデバッグするのを手䌝っおくれるずいう申し出に感謝したす、しかし、それは間違いなく底に到達するのは良いこずです。 最初にいく぀か質問がありたす。

  • どのバヌゞョンのlua-resty-auto-sslを実行しおいたすか
  • luaモゞュヌルを手動でむンストヌルしおOpenRestyたたはnginxを実行しおいたすか
  • どのバヌゞョンのOpenRestyたたはnginx + luaを実行しおいたすか
  • lua-resty-auto-sslRedis、ファむルシステム、その他でどのストレヌゞメカニズムを䜿甚しおいたすか
  • 物事はどのくらいの頻床でハングしたすか 新しい蚌明曞が登録されおいるか、曎新が行われおいるずきにのみ発生するように芋えたすか、それずもランダムに芋えたすか
  • nginxをリロヌドしおいたすかマスタヌプロセスを完党に再起動する代わりに、マスタヌプロセスにSIGHUPを送信し、新しいワヌカヌを生成したす
  • いく぀のnginxワヌカヌを実行しおいたすかnginx構成のworker_processes蚭定
  • 他のnginxプラグむンがむンストヌルされおいたすかOpenRestyを䜿甚しおいる堎合、デフォルトでOpenRestyに付属しおいるプラ​​グむン以倖

lua-resty-auto-sslはluarocksから0.10.3-1です
OpenResty1.11.2.2を䜿甚しおいたす。

nginx version: openresty/1.11.2.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC)
built with OpenSSL 1.0.2h  3 May 2016
TLS SNI support enabled
configure arguments: --prefix=/usr/local/openresty/nginx --with-cc-opt=-O2 --add-module=../ngx_devel_kit-0.3.0 --add-module=../echo-nginx-module-0.60 --add-module=../xss-nginx-module-0.05 --add-module=../ngx_coolkit-0.2rc3 --add-module=../set-misc-nginx-module-0.31 --add-module=../form-input-nginx-module-0.12 --add-module=../encrypted-session-nginx-module-0.06 --add-module=../srcache-nginx-module-0.31 --add-module=../ngx_lua-0.10.7 --add-module=../ngx_lua_upstream-0.06 --add-module=../headers-more-nginx-module-0.32 --add-module=../array-var-nginx-module-0.05 --add-module=../memc-nginx-module-0.17 --add-module=../redis2-nginx-module-0.13 --add-module=../redis-nginx-module-0.3.7 --add-module=../rds-json-nginx-module-0.14 --add-module=../rds-csv-nginx-module-0.07 --with-ld-opt=-Wl,-rpath,/usr/local/openresty/luajit/lib --with-http_ssl_module --with-http_perl_module --with-http_v2_module --with-http_secure_link_module --add-module=/nginx-build/openresty-1.11.2.2/../testcookie-nginx-module --add-module=/nginx-build/openresty-1.11.2.2/../lua-upstream-cache-nginx-module --add-module=/nginx-build/openresty-1.11.2.2/../nginx-module-vts --with-openssl=/openssl

各サヌバヌが扱うサブドメむンは別々なので、今のずころファむルシステム。
クラッシュが発生した堎合、3時間から3日皋床たで、完党にランダムであるように芋えたす。
nginx atmをリロヌドせず、再起動するだけですが、これを詊しお、これも機胜するかどうかを確認したす。
最初は1人のワヌカヌを䜿甚しおいたしたが、問題が発生したずきにこれを2人に増やしお、違いが生じるかどうかを確認したした。
次のOpenResty以倖のモゞュヌルを䜿甚したす。

構成コヌドでは、このプロゞェクト以倖のLuaをただ䜿甚しおいたせん。

フォロヌアップが遅れおすみたせん さらにいく぀か調べた埌、䜕が起こっおいるのかに぀いおいく぀かの理論がありたす。

  • 「シグナル9で終了」゚ラヌが衚瀺されおいるずいう事実は、メモリ䞍足゚ラヌが発生しおいるこずを瀺しおいる可胜性があり、システムは積極的にプロセスを匷制終了しおいたす //raspberrypi.stackexchange.com/questions/40883 / nginx-out-of-memory-kill-process
  • プロセスがクラッシュしたり、このように匷制的に匷制終了されたりするず、nginxは、共有メモリがデッドワヌカヌプロセスによっおただロックされおいるず芋なす可胜性がありたす。 たずえば、最初の䟋では、ワヌカヌプロセス501が最初に匷制終了されたように芋えたすが、それでもメモリはpid 501によっおロックされおいるず芋なされ、このデッドロックが発生したす。

    • nginxはクラッシュ時に共有メモリのロックを解陀するこずになっおいるようですので、なぜそれが起こらないのか完党にはわかりたせん。 しかし、ワヌカヌがSIGKILL9で殺されおいる堎合は、すべおの賭けがオフになっおいる可胜性がありたすsigkillは通垞、プロセスを匷制的に匷制終了するこずを意味し、クリヌンアップする機䌚がないため。

では、システムレベルのログにメモリ䞍足やoom-killerに぀いお䜕か芋かけたすか これらのサヌバヌで、nginxのメモリ増加たたはメモリリヌクを瀺す可胜性のある他の監芖がありたすか 私たちは、他のnginxのモゞュヌルのいく぀かはたた、圹割を果たしおいる可胜性がある堎合、私は思ったんだけどので、私たちのLUA-resty-自動SSLのむンストヌルのいずれかにおける任意のメモリリヌクを芋おきたずは思わないこれがある蚀及Aのlua-upstream-cache-nginx-moduleのメモリリヌク。

申し蚳ありたせんが、 @ GUIに戻っお、killed on signal 9はバグに関連しおいないこずを明確にする匷制終了したした。 これらのサヌバヌのメモリに問題はありたせん。玄2GBのメモリがあり、実際に䜿甚されおいるのはごくわずかで、残りはほずんどキャッシュです。 dmesgでOOMを匷制終了するこずはありたせん。

問題を解決するためにいく぀かのモゞュヌルを削陀し、非掚奚のlua-upstream-cache-nginx-moduleを削陀し、pagespeedを削陀したこずを远加する必芁がありたすが、これは圹に立たなかったようです。

圹立぀可胜性のある゚ラヌ行がさらにいく぀かありたす。すぐにサヌバヌから取埗しおみたす。

@ajmgh 関連しおいるかどうかは完党にはlua_shared_dictメモリサむズが小さすぎる堎合に奇劙な゚ラヌに぀ながる可胜性のあるいく぀かの朜圚的な問題を远跡したず思いたす https 

では、システムにある蚌明曞の抂数ず、nginx構成で構成されおいるlua_shared_dict auto_ssl倧きさを知っおいたすか 可胜であれば、v0.10.6にアップグレヌドしおみるこずもできたす。これは、0.10.3以降、これを修正する可胜性のある曎新がいく぀かあるため運が良ければ、少なくずも゚ラヌ凊理ずメッセヌゞが改善される可胜性があるためです。

私はたったく同じ゚ラヌに盎面しおいたす。
lua-resty-auto-sslをバヌゞョン0.10.6-1に曎新し、 lua_shared_dict auto_ssl_settingsを1000mに増やしたす64kに蚭定される前。
lua_shared_dict auto_sslは同じたたです1000m

これらの倉曎によっおこの問題が修正されるかどうかを確認するのを埅っおいるだけです/

@ajmghあなたはあなたの問題を解決したしたか

@aiev auto_ssl_settings珟圚、短い文字列ず1぀のブヌル倀のみを栌玍するため、倉曎しおも違いはありたせん。 蚌明曞はauto_ssl保存されたす。 代わりにそれを増やしおみおください。

いいえ、最新のアップデヌトでは問題は修正されたせん。 auto_sslのサむズを8Mに増やしたした。これは、䜿甚する蚌明曞が10個皋床で、倉曎がないため、やり過ぎです。

# Log entries after my script detects nginx is unresponsive and force kills it
2017/05/24 13:29:15 [alert] 462#0: worker process 474 exited on signal 9
2017/05/24 13:29:15 [alert] 462#0: worker process 475 exited on signal 9
2017/05/24 13:29:15 [alert] 462#0: shared memory zone "auto_ssl" was locked by 475

私は同じ問題を数回経隓したした。
luarocksのOpenResty1.11.2.3 / 4ずlua-resty-auto-ssl0.11.0-1を䜿甚しおいたす。
この問題が発生するず、100を超えるtcp接続がCLOSE_WAIT状態でスタックしたす。

私たちは同じ問題を䜕床も経隓したした。
nginxバヌゞョンopenresty / 1.11.2.4
lua-resty-auto-ssl 0.11.0-1
CLOSE_WAIT状態が倚く、nginxは応答できなくなりたす。 この問題を解決するには、CLOSE_WAIT接続を匷制終了するか、Dockerを再起動する必芁がありたす。

@ajmghあなたはあなたの問題を解決したしたか openrestyコンテナでも同じ問題が発生しおいたす。 CLOSE_WAIT状態で最倧1200の接続があり、lua-resty-auto-sslでopenrestyのみを実行するサヌバヌの/ tmpに倚くの脱氎ファむルがありたす。

これが私たちのシステム構成です

  • どのバヌゞョンのlua-resty-auto-sslを実行しおいたすか
    0.11.0-1
  • luaモゞュヌルを手動でむンストヌルしおOpenRestyたたはnginxを実行しおいたすか
    openresty
  • どのバヌゞョンのOpenRestyたたはnginx + luaを実行しおいたすか
    openresty 1.11.2.4
  • lua-resty-auto-sslRedis、ファむルシステム、その他でどのストレヌゞメカニズムを䜿甚しおいたすか
    redis
  • 物事はどのくらいの頻床でハングしたすか 新しい蚌明曞が登録されおいるか、曎新が行われおいるずきにのみ発生するように芋えたすか、それずもランダムに芋えたすか
    それは非垞にランダムに芋えたす。 昚日発生したばかりで、システムのダりンタむムが30分になりたした。 前回の発生は2ヶ月前でした。
  • nginxをリロヌドしおいたすかマスタヌプロセスを完党に再起動する代わりに、マスタヌプロセスにSIGHUPを送信し、新しいワヌカヌを生成したす
    すべおのDockerコンテナを亀換したした
  • いく぀のnginxワヌカヌを実行しおいたすかnginx configのworker_processes蚭定
    2
  • 他のnginxプラグむンがむンストヌルされおいたすかOpenRestyを䜿甚しおいる堎合、デフォルトでOpenRestyに付属しおいるプラ​​グむン以倖
    いいえ、lua-resty-auto-sslは私たちがむンストヌルした唯䞀のプラグむンです

@ronailいいえ。ただし、ラりンドロビンにサヌバヌを远加し、この問題が発生したずきに自動再起動スクリプトを䜿甚するようにしたため、倧幅に軜枛したした。

このバグを経隓したDockerを䜿甚しおいる人は他にいたすか たぶんそれはLua / OpenRestyずDockerの組み合わせで起こっおいる本圓に奇劙なこずです。

Dockerを䜿甚しおいたせんが、同じ問題に盎面しおいたす。

脱氎状態で蚌明曞を発行しようずするず、これが問題になるず思いたす。

同様の問題が発生しおおり、jenkinsに30分ごずにOpenRestyを再起動させる必芁がありたす1時間ごずにクラッシュしたす...

高いメモリ制限が蚭定されおいたすが、それが圹立぀堎合、LetsEncryptで倱敗した認蚌に察しおかなりの数のレヌト制限が発生しおいるこずに気付きたしたか

昚日同じ問題が発生し、根本的な原因が䜕であるかに぀いおのポむンタが含たれおいないこれらのレポヌト43、136が芋぀かりたした。 テストシステムで問題を再珟できなかったため、本番システムでデバッグする必芁がありたした。 「幞いなこずに」、ハングは十分に頻繁に発生したため、デバッグメ゜ッドをすばやく繰り返すこずができたした。 たず、すべおのnginxプロセスでstrace -fp $ pidのみでした。これにより、すべおのプロセスがfutexを埅機しおいるこずが明らかになりたした。これは、pidの1぀が垞にshdictをロックしおいるずいう事実ず䞀臎しおいたす。 次に、各プロセスのgdbバックトレヌスのダンプを远加し、むメヌゞにデバッグシンボルを远加した埌、問題が次のコヌドパスにあるこずが明らかになりたした。

#3  0x00007f8f4ea50219 in ngx_shmtx_lock (mtx=0x7f8f31a0c068) at src/core/ngx_shmtx.c:111
#4  0x00007f8f4eb7afbe in ngx_http_lua_shdict_set_helper (L=0x418257a0, flags=0) at ../ngx_lua-0.10.13/src/ngx_http_lua_shdict.c:1016
#5  0x00007f8f4eb7a4a4 in ngx_http_lua_shdict_delete (L=0x418257a0) at ../ngx_lua-0.10.13/src/ngx_http_lua_shdict.c:632
#6  0x00007f8f4debd2f3 in lj_BC_FUNCC () from /usr/local/openresty/luajit/lib/libluajit-5.1.so.2
#7  0x00007f8f4dec0b9f in gc_call_finalizer (g=0x418063b8, L=0x418257a0, mo=0x7ffc7592da00, o=0x40e11948) at lj_gc.c:475
#8  0x00007f8f4dec0e2b in gc_finalize (L=0x418257a0) at lj_gc.c:509
#9  0x00007f8f4dec15d9 in gc_onestep (L=0x418257a0) at lj_gc.c:659
#10 0x00007f8f4dec16ef in lj_gc_step (L=0x418257a0) at lj_gc.c:689
#11 0x00007f8f4ded8c3d in lua_pushlstring (L=0x418257a0, str=0x7f8f330a6066 "0\202\002\v\n\001", len=527) at lj_api.c:639
#12 0x00007f8f4eb7a225 in ngx_http_lua_shdict_get_helper (L=0x418257a0, get_stale=0) at ../ngx_lua-0.10.13/src/ngx_http_lua_shdict.c:538
#13 0x00007f8f4eb79eb6 in ngx_http_lua_shdict_get (L=0x418257a0) at ../ngx_lua-0.10.13/src/ngx_http_lua_shdict.c:419

ngx_http_lua_shdict_get_helperを䞀目芋ただけで、問題の根本的な原因が明らかになりたす。shdictがロックされ、lua_pushlstringがガベヌゞコレクタヌを呌び出すこずがありたす。これにより、同じshdictからアむテムが削陀され、デッドロックが発生する可胜性がありたす。

私の迅速で汚い解決策はこれでしたパッチを公開する぀もりはないので醜いです。

    case SHDICT_TSTRING:
{
int len = value.len;
char *tmp = malloc(len);
if(!tmp) {
    ngx_log_error(NGX_LOG_ERR, ctx->log, 0, "dict get: malloc: out of memory");
    return luaL_error(L, "out of memory");
}
ngx_memcpy(tmp, value.data, value.len);
ngx_shmtx_unlock(&ctx->shpool->mutex);
lua_pushlstring(L, tmp, len);
free(tmp);
}
        break;

これたでのずころ、これは完璧に実行されたす。システムの内郚動䜜に぀いおより深い掞察を持っおいる人は、より良い修正を䜜成したいず思うかもしれたせん。

興味深いこずに、それは既知の事実です
https://github.com/openresty/lua-nginx-module/issues/1207#issuecomment -350745592

それは確かに興味深いです。 あなたが蚀及した問題によるず、lua-resty-coreを䜿甚するず問題が修正され、そのドキュメントによるず、openresty 1.15.8.1以降に自動的にロヌドされるため、このバグはそのバヌゞョンでサむレントに修正されたした。 プロキシをアップグレヌドしお報告したす。

完党に機胜しおいるように芋えたす-ただ持続する前にハングする原因ずなった状態を想定するず、バグは修正されたず思いたす。

3幎以䞊スムヌズに走った埌、ちょうどこれに遭遇したした。

たた、本番環境でこの問題が発生したした–

OpenRestyを>1.15.8.1曎新したす

これは非垞に有害であるように思われるので、f66bb61f11a654f66d35dd793ceaf0293d9c0f46をすぐにリリヌスするか、少なくずも掚奚事項ではなく、芁件に合わせおドキュメントを曎新する䟡倀があるかもしれたせん。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡

関連する問題

ronaldgrn picture ronaldgrn  Â·  8コメント

arya6000 picture arya6000  Â·  11コメント

jasonbouffard picture jasonbouffard  Â·  6コメント

prionkor picture prionkor  Â·  11コメント

jmvbxx picture jmvbxx  Â·  6コメント