Lua-resty-auto-ssl: 잠금 문제

에 λ§Œλ“  2017λ…„ 02μ›” 01일  Β·  20μ½”λ©˜νŠΈ  Β·  좜처: auto-ssl/lua-resty-auto-ssl

(μ—­λ°©ν–₯ ν”„λ‘μ‹œ) nginx μ„œλ²„κ°€ μΆ©λŒν•˜λŠ” λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 그듀은 μš”μ²­μ— μ™„μ „νžˆ μ‘λ‹΅ν•˜μ§€ μ•ŠμœΌλ©° 슀슀둜 이 μƒνƒœλ₯Ό λ²—μ–΄λ‚˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ„œλ²„λŠ” λ§Žμ€ μ–‘μ˜ μš”μ²­(ν•˜λ£¨ 500만 이상)을 μ²˜λ¦¬ν•©λ‹ˆλ‹€.

μ§€λ‚œ λ©°μΉ  λ™μ•ˆ λ‚˜λŠ” μ•½κ°„μ˜ 손싀을 μž…μ—ˆκ³  λͺ¨λ‹ˆν„°λ§μ„ 톡해 이에 λŒ€ν•΄ κ²½κ³ λ₯Ό 받을 λ•Œλ§ˆλ‹€ Docker μΈμŠ€ν„΄μŠ€λ₯Ό μˆ˜λ™μœΌλ‘œ λ‹€μ‹œ μ‹œμž‘ν–ˆμ§€λ§Œ nginxκ°€ μ—¬μ „νžˆ μ‘λ‹΅ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” λ„μš°λ―Έ cron 슀크립트λ₯Ό μ œμžλ¦¬μ— λ°°μΉ˜ν•˜κΈ°λ‘œ κ²°μ •ν–ˆμŠ΅λ‹ˆλ‹€. λ¬Έμ œκ°€ μžˆλŠ” 경우 κ°λ…μžλ₯Ό 톡해 λ‹€μ‹œ μ‹œμž‘ν•©λ‹ˆλ‹€.

μ²˜μŒμ— 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μž…λ‹ˆλ‹€ . κ·ΈλŸ¬λ‚˜ λ§Œλ£Œκ°€ 적용된 κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ 이것은 μ•„λ‹Œ 것 κ°™μŠ΅λ‹ˆλ‹€. (λ‚˜μœ λͺ¨λ‹ˆν„°λ§μœΌλ‘œ 인해) μ΅œκ·Όμ— μ•½ 7μ‹œκ°„μ˜ λ‹€μš΄νƒ€μž„μ΄ λ°œμƒν–ˆκΈ° λ•Œλ¬Έμ— μ„€μ • μž‘μ—…μ„ ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λ™μΌν•œ Docker μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚¬μš©ν•˜λ”λΌλ„ 이 버그λ₯Ό λ‘œμ»¬μ—μ„œ μ „ν˜€ μž¬ν˜„ν•  수 μ—†λ‹€λŠ” 점을 μ–ΈκΈ‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ§€κΈˆμ€ μžλ™ μž¬μ‹œμž‘ μŠ€ν¬λ¦½νŠΈκ°€ 문제λ₯Ό ν•΄κ²°ν–ˆμ§€λ§Œ 아이디어가 μžˆλŠ” μ‚¬λžŒμ΄ μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. μΆ”κ°€ λ‘œκΉ…μ„ 켜고 디버그 둜그λ₯Ό μ‹œλ„ν•˜κ²Œ λ˜μ–΄ κΈ°μ©λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ˜ν•œ ν”„λ‘œλ•μ…˜μ—μ„œ 이 λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. @koszik 및 alμ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. 확인을 μœ„ν•΄ 이 문제λ₯Ό ν•΄κ²°ν•˜λ €λ©΄ λ‹€μŒ 단계λ₯Ό λ”°λ₯΄μ„Έμš”.

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μž…λ‹ˆλ‹€.
μš°λ¦¬λŠ” OpenResty 1.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λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

후속 μ‘°μΉ˜κ°€ λŠ¦μ–΄μ Έμ„œ μ£„μ†‘ν•©λ‹ˆλ‹€! λͺ‡ 가지 더 κ²€μƒ‰ν•œ 후에 무슨 일이 일어날 수 μžˆλŠ”μ§€μ— λŒ€ν•œ λͺ‡ 가지 이둠이 μžˆμŠ΅λ‹ˆλ‹€.

  • "exited on signal 9" 였λ₯˜κ°€ ν‘œμ‹œλœλ‹€λŠ” 사싀은 λ©”λͺ¨λ¦¬ λΆ€μ‘± 였λ₯˜κ°€ λ°œμƒν•˜κ³  μ‹œμŠ€ν…œμ΄ 적극적으둜 ν”„λ‘œμ„ΈμŠ€λ₯Ό μ’…λ£Œν•˜κ³  μžˆμŒμ„ λ‚˜νƒ€λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€ .
  • 이와 같이 ν”„λ‘œμ„ΈμŠ€κ°€ μΆ©λŒν•˜κ±°λ‚˜ κ°•μ œλ‘œ μ’…λ£Œλ˜λ©΄ nginxκ°€ 곡유 λ©”λͺ¨λ¦¬κ°€ 죽은 μž‘μ—…μž ν”„λ‘œμ„ΈμŠ€μ— μ˜ν•΄ μ—¬μ „νžˆ 잠겨 μžˆλ‹€κ³  μƒκ°ν•˜κ²Œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 초기 μ˜ˆμ œμ—μ„œ μž‘μ—…μž ν”„λ‘œμ„ΈμŠ€ 501이 λ¨Όμ € μ’…λ£Œλœ κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ μ—¬μ „νžˆ λ©”λͺ¨λ¦¬κ°€ pid 501에 μ˜ν•΄ 잠겨 μžˆλ‹€κ³  μƒκ°ν•˜μ—¬ 이 ꡐ착 μƒνƒœλ‘œ μ΄μ–΄μ§‘λ‹ˆλ‹€.

    • nginxλŠ” 좩돌 μ‹œ 곡유 λ©”λͺ¨λ¦¬μ˜ μž κΈˆμ„ ν•΄μ œν•΄μ•Ό ν•˜λŠ” 것 κ°™μœΌ λ―€λ‘œ μ™œ 그런 일이 μΌμ–΄λ‚˜μ§€ μ•Šμ„ 수 μžˆλŠ”μ§€ μ™„μ „νžˆ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μž‘μ—…μžκ°€ SIGKILL(9)둜 μ’…λ£Œλ˜λŠ” 경우 λͺ¨λ“  λ² νŒ…μ΄ ν•΄μ œλ  수 μžˆμŠ΅λ‹ˆλ‹€(sigkill은 일반적으둜 ν”„λ‘œμ„ΈμŠ€λ₯Ό κ°•μ œλ‘œ μ’…λ£Œν•˜κ³  정리할 κΈ°νšŒκ°€ μ—†μŒμ„ μ˜λ―Έν•˜κΈ° λ•Œλ¬Έμ—).

μ‹œμŠ€ν…œ μˆ˜μ€€ λ‘œκ·Έμ— λ©”λͺ¨λ¦¬ λΆ€μ‘± λ˜λŠ” oom-killer에 λŒ€ν•œ λ‚΄μš©μ΄ μžˆμŠ΅λ‹ˆκΉŒ? nginxμ—μ„œ λ©”λͺ¨λ¦¬ 증가 λ˜λŠ” λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” μ΄λŸ¬ν•œ μ„œλ²„μ— λŒ€ν•œ λ‹€λ₯Έ λͺ¨λ‹ˆν„°λ§μ΄ μžˆμŠ΅λ‹ˆκΉŒ? λ‚˜λŠ” μš°λ¦¬κ°€ λ‹€λ₯Έ Nginx에 λͺ¨λ“ˆμ˜ 일뢀도 역할을 ν•  수 μžˆλ‹€λ©΄ κΆκΈˆν•˜λ„€μš” κ·Έλž˜μ„œ, 우리 루아 - resty - μžλ™ SSL μ„€μΉ˜μ˜ μ–΄λ–€ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό λ³Έ 적이 μƒκ°ν•˜μ§€ μ•ŠλŠ”λ‹€ (이이 μ–ΈκΈ‰ 의 lua-upstream-cache-nginx-module의 λ©”λͺ¨λ¦¬ λˆ„μˆ˜).

μ£„μ†‘ν•©λ‹ˆλ‹€. @GUI μ—μ„œ μ‹ ν˜Έ 9μ—μ„œ μ‚¬λ§ν•œ 것이 버그와 μ—°κ²°λ˜μ–΄ μžˆμ§€ μ‹Άμ—ˆμ§€λ§Œ λ¬Έμ œμ— λŒ€μ‘ν•˜κΈ° μœ„ν•΄ μ˜λ„μ μœΌλ‘œ nginx ν”„λ‘œμ„ΈμŠ€λ₯Ό μ’…λ£Œν–ˆμŠ΅λ‹ˆλ‹€. 이 μ„œλ²„μ˜ λ©”λͺ¨λ¦¬μ—λŠ” λ¬Έμ œκ°€ μ—†μœΌλ©° μ•½ 2GB의 λ©”λͺ¨λ¦¬κ°€ 있으며 μ‹€μ œλ‘œλŠ” μ†ŒλŸ‰μ΄ μ‚¬μš©λ˜κ³  λ‚˜λ¨Έμ§€λŠ” λŒ€λΆ€λΆ„ μΊμ‹œλ©λ‹ˆλ‹€. dmesgμ—μ„œ OOM 킬이 μ—†μŠ΅λ‹ˆλ‹€.

더 이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” lua-upstream-cache-nginx-module 및 제거된 pagespeed 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 일뢀 λͺ¨λ“ˆμ„ μ œκ±°ν–ˆμ§€λ§Œ 도움이 λ˜μ§€ μ•ŠλŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€.

도움이 될 수 μžˆλŠ” 였λ₯˜ 행이 λͺ‡ 개 더 μžˆμŠ΅λ‹ˆλ‹€. 곧 μ„œλ²„μ—μ„œ κ°€μ Έμ˜€λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

@ajmgh : 관련이 μžˆλŠ”μ§€ μ™„μ „νžˆ ν™•μ‹ ν•  μˆ˜λŠ” μ—†μ§€λ§Œ κ΅¬μ„±λœ lua_shared_dict λ©”λͺ¨λ¦¬ 크기가 λ„ˆλ¬΄ μž‘μ€ 경우 μ΄μƒν•œ 였λ₯˜λ‘œ μ΄μ–΄μ§ˆ 수 μžˆλŠ” λͺ‡ 가지 잠재적인 문제λ₯Ό μΆ”μ ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€. https://github.com /GUI/lua-resty-auto-ssl/issues/48#issuecomment -294397379

λ”°λΌμ„œ μ‹œμŠ€ν…œμ— μ–Όλ§ˆλ‚˜ λ§Žμ€ μΈμ¦μ„œκ°€ 있고 nginx ꡬ성에 μ–Όλ§ˆλ‚˜ 큰 lua_shared_dict auto_ssl κ°€ κ΅¬μ„±λ˜μ–΄ μžˆλŠ”μ§€ μ•Œκ³  μžˆμŠ΅λ‹ˆκΉŒ? 0.10.3 μ΄ν›„λ‘œ 이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλŠ” λͺ‡ 가지 μ—…λ°μ΄νŠΈκ°€ μžˆμœΌλ―€λ‘œ(운이 μ’‹λ‹€λ©΄) μ΅œμ†Œν•œ 더 λ‚˜μ€ 였λ₯˜ 처리 및 λ©”μ‹œμ§€λ₯Ό μ œκ³΅ν•˜λ―€λ‘œ κ°€λŠ₯ν•˜λ©΄ v0.10.6으둜 μ—…κ·Έλ ˆμ΄λ“œλ₯Ό μ‹œλ„ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” λ˜‘κ°™μ€ 였λ₯˜μ— μ§λ©΄ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
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 ν˜„μž¬ 짧은 λ¬Έμžμ—΄κ³Ό ν•˜λ‚˜μ˜ λΆ€μšΈλ§Œ μ €μž₯ν•˜λ―€λ‘œ 변경해도 μ•„λ¬΄λŸ° 차이가 μ—†μŠ΅λ‹ˆλ‹€. μΈμ¦μ„œλŠ” 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의 OpenResty 1.11.2.3/4 및 lua-resty-auto-ssl 0.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 연결을 μ’…λ£Œν•˜κ±°λ‚˜ 도컀λ₯Ό λ‹€μ‹œ μ‹œμž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€.

@ajmgh 문제λ₯Ό ν•΄κ²°ν•˜μ…¨λ‚˜μš”? μš°λ¦¬λŠ” openresty μ»¨ν…Œμ΄λ„ˆμ—μ„œ λ™μΌν•œ 문제λ₯Ό κ²ͺκ³  μžˆμŠ΅λ‹ˆλ‹€. CLOSE_WAIT μƒνƒœμ—μ„œ ~1200개의 연결이 있고 lua-resty-auto-ssl둜 openresty만 μ‹€ν–‰ν•˜λŠ” μ„œλ²„μ˜ /tmp에 λ§Žμ€ νƒˆμˆ˜λœ 파일이 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ μ‹œμŠ€ν…œ κ΅¬μ„±μž…λ‹ˆλ‹€.

  • μ‹€ν–‰ 쀑인 lua-resty-auto-ssl 버전은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?
    0.11.0-1
  • lua λͺ¨λ“ˆμ„ μˆ˜λ™μœΌλ‘œ μ„€μΉ˜ν•˜μ—¬ OpenResty λ˜λŠ” nginxλ₯Ό μ‹€ν–‰ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ?
    κ°œλ°©μ„±
  • μ–΄λ–€ λ²„μ „μ˜ OpenResty λ˜λŠ” nginx+luaλ₯Ό μ‹€ν–‰ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ?
    κ°œλ°©μ„± 1.11.2.4
  • lua-resty-auto-ssl(Redis, 파일 μ‹œμŠ€ν…œ λ“±)κ³Ό ν•¨κ»˜ μ–΄λ–€ μ €μž₯ λ©”μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ?
    λ ˆλ””μŠ€
  • μ–Όλ§ˆλ‚˜ 자주 물건이 κ±Έλ € μžˆμŠ΅λ‹ˆκΉŒ? μƒˆ μΈμ¦μ„œκ°€ λ“±λ‘λ˜κ±°λ‚˜ 갱신이 진행 쀑일 λ•Œλ§Œ λ°œμƒν•˜λŠ” 것 κ°™μŠ΅λ‹ˆκΉŒ? μ•„λ‹ˆλ©΄ λ¬΄μž‘μœ„λ‘œ λ³΄μ΄λŠ” κ²ƒμž…λ‹ˆκΉŒ?
    그것은 맀우 λ¬΄μž‘μœ„λ‘œ λ³΄μž…λ‹ˆλ‹€. μ–΄μ œ λ°œμƒν•œ 일이며 μ‹œμŠ€ν…œμ—μ„œ 30λΆ„μ˜ λ‹€μš΄νƒ€μž„μ΄ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 이전에 μΌμ–΄λ‚œ 일은 2κ°œμ›” μ „μ΄μ—ˆμŠ΅λ‹ˆλ‹€.
  • nginxλ₯Ό μ „ν˜€ λ‹€μ‹œ λ‘œλ“œν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ(λ§ˆμŠ€ν„° ν”„λ‘œμ„ΈμŠ€λ₯Ό μ™„μ „νžˆ λ‹€μ‹œ μ‹œμž‘ν•˜λŠ” λŒ€μ‹  λ§ˆμŠ€ν„° ν”„λ‘œμ„ΈμŠ€μ— SIGHUP을 보내고 μƒˆ μž‘μ—…μžλ₯Ό 생성)?
    μš°λ¦¬λŠ” 방금 λͺ¨λ“  도컀 μ»¨ν…Œμ΄λ„ˆλ₯Ό κ΅μ²΄ν–ˆμŠ΅λ‹ˆλ‹€.
  • μ–Όλ§ˆλ‚˜ λ§Žμ€ nginx μž‘μ—…μžλ₯Ό μ‹€ν–‰ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ(nginx κ΅¬μ„±μ˜ worker_processes μ„€μ •)?
    2
  • λ‹€λ₯Έ nginx ν”ŒλŸ¬κ·ΈμΈμ΄ μ„€μΉ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆκΉŒ(OpenRestyλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 기본적으둜 OpenResty와 ν•¨κ»˜ μ œκ³΅λ˜λŠ” ν”ŒλŸ¬κ·ΈμΈ 외에)?
    μ•„λ‹ˆμš” lua-resty-auto-ssl은 μš°λ¦¬κ°€ μ„€μΉ˜ν•œ μœ μΌν•œ ν”ŒλŸ¬κ·ΈμΈμž…λ‹ˆλ‹€.

@ronail μ•„λ‹ˆμš”. ν•˜μ§€λ§Œ

이 버그가 λ°œμƒν•œ λ‹€λ₯Έ λͺ¨λ“  μ‚¬λžŒλ“€μ΄ Dockerλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ? Lua/OpenResty와 Dockerλ₯Ό ν•¨κ»˜ μ‚¬μš©ν•˜λ©΄ 정말 μ΄μƒν•œ 일이 λ²Œμ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 도컀λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  있으며 같은 λ¬Έμ œμ— μ§λ©΄ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

νƒˆμˆ˜λœ μƒνƒœμ—μ„œ μΈμ¦μ„œ λ°œκΈ‰μ„ μ‹œλ„ν•  λ•Œ λ°œμƒν•˜λŠ” 문제인 것 κ°™μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” λ˜ν•œ μ  ν‚¨μŠ€κ°€ 30λΆ„λ§ˆλ‹€ OpenRestyλ₯Ό λ‹€μ‹œ μ‹œμž‘ν•˜λ„λ‘ κ°•μ œν•΄μ•Ό ν•˜λŠ” λΉ„μŠ·ν•œ λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€(λ§€μ‹œκ°„ λ˜λŠ” μ§€μ†μ μœΌλ‘œ 좩돌이 λ°œμƒν•©λ‹ˆλ‹€...)

높은 λ©”λͺ¨λ¦¬ μ œν•œμ΄ μ„€μ •λ˜μ–΄ μžˆμ§€λ§Œ λ„μ›€μ΄λœλ‹€λ©΄ LetsEncryptμ—μ„œ μ‹€νŒ¨ν•œ 인증에 λŒ€ν•΄ μƒλ‹Ήν•œ λΉ„μœ¨ μ œν•œμ„ λ°›κ³  μžˆλ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€.

μ–΄μ œ 같은 λ¬Έμ œκ°€ λ°œμƒν•˜μ—¬ κ·Όλ³Έ 원인이 무엇인지에 λŒ€ν•œ 포인터가 μ—†λŠ” λ³΄κ³ μ„œ(#43, #136)λ₯Ό μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. ν…ŒμŠ€νŠΈ μ‹œμŠ€ν…œμ—μ„œ 문제λ₯Ό μž¬ν˜„ν•  수 μ—†μ—ˆμœΌλ―€λ‘œ ν”„λ‘œλ•μ…˜ μ‹œμŠ€ν…œμ—μ„œ κ°•μ œλ‘œ 디버그해야 ν–ˆμŠ΅λ‹ˆλ‹€. 'λ‹€ν–‰νžˆ' 쀑단이 자주 λ°œμƒν•˜μ—¬ 디버깅 방법을 λΉ λ₯΄κ²Œ λ°˜λ³΅ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 첫째, 그것은 λͺ¨λ“  nginx ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•œ strace -fp $pid에 λΆˆκ³Όν–ˆμœΌλ©°, μ΄λŠ” λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€κ°€ futex()λ₯Ό 기닀리고 μžˆμŒμ„ λ³΄μ—¬μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” pid 쀑 ν•˜λ‚˜κ°€ 항상 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λ…„ 이상 순쑰둭게 μ‹€ν–‰ν•œ 후에 방금 이 λ¬Έμ œμ— λΆ€λ”ͺμ³€μŠ΅λ‹ˆλ‹€.

λ˜ν•œ ν”„λ‘œλ•μ…˜μ—μ„œ 이 λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. @koszik 및 alμ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. 확인을 μœ„ν•΄ 이 문제λ₯Ό ν•΄κ²°ν•˜λ €λ©΄ λ‹€μŒ 단계λ₯Ό λ”°λ₯΄μ„Έμš”.

OpenRestyλ₯Ό >1.15.8.1

이것은 맀우 μœ„ν—˜ν•œ κ²ƒμœΌλ‘œ 보이며 f66bb61f11a654f66d35dd793ceaf0293d9c0f46을 곧 μΆœμ‹œν•˜κ±°λ‚˜ μ΅œμ†Œν•œ ꢌμž₯ 사항이 μ•„λ‹Œ μš”κ΅¬ 사항에 맞게 λ¬Έμ„œλ₯Ό μ—…λ°μ΄νŠΈν•  κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰