ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • NGINX module 개발 μ‹œ μ°Έκ³  ν•˜κΈ° 쒋은 κΈ€
    TIPS 2024. 10. 13. 14:52

    πŸ™‹ NGINX λͺ¨λ“ˆμ€ μ–Έμ œ λ§Œλ“œλ‚˜μš”?

    Nginx λŠ” λ§Žμ€ μ›Ή μ„œλΉ„μŠ€λ“€μ—μ„œ μ‚¬μš©ν•˜λŠ” μ›Ή μ„œλ²„ ν”„λ‘œκ·Έλž¨ μž…λ‹ˆλ‹€. Nginx λŠ” κ·Έ 자체둜 κ°•λ ₯ν•˜κ³ , λ‹€μ–‘ν•œ λͺ¨λ“ˆμ„ 가지고 있기 λ•Œλ¬Έμ— λ§Žμ€ μ„œλΉ„μŠ€λ“€μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.

     

    ν•˜μ§€λ§Œ μ„œλΉ„μŠ€μ˜ μš”κ΅¬μ‚¬ν•­μ— λ”°λΌμ„œ, Nginx κ·Έ μžμ²΄λ§ŒμœΌλ‘œλŠ” λΆ€μ‘±ν•œ 상황이 λ°œμƒν•©λ‹ˆλ‹€. μ•± μ„œλ²„μ—μ„œ μ²˜λ¦¬ν•˜κΈ°μ—λŠ” μ•±μ˜ λ‘œμ§κ³ΌλŠ” λ™λ–¨μ–΄μ Έμžˆμ–΄ μ±…μž„μ›μΉ™μ— μœ„λ°˜ν•˜κ³ , nginx 의 μ„€μ • λ‘œμ§μ—μ„œ 처리되면 쒋을 것 같은 μš”κ΅¬μ‚¬ν•­λ“€μ΄ μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€λ©΄, ν”„λ‘μ‹œλ₯Ό ν•  λ•Œ νŠΉμ • 값을 κ°€κ³΅ν•˜μ—¬ λ„˜κ²¨μ£Όκ³  싢을 수 μžˆμŠ΅λ‹ˆλ‹€. 또, header 에 μžˆλŠ” 값을 가지고 $remote_addr λ₯Ό λ³€μ‘°ν•˜μ—¬ μ‚¬μš©ν•˜κ³  μ‹Άλ‹€κ±°λ‚˜ ν•˜λŠ” 상황이 μžˆμŠ΅λ‹ˆλ‹€.

     

    그런 μƒν™©μ—μ„œ μ μ ˆν•œ 처리λ₯Ό ν•  수 μžˆλŠ” nginx λͺ¨λ“ˆμ„ 직접 λ§Œλ“€μ–΄ nginx 에 μ μš©ν•΄μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€. Nginx λŠ” C μ–Έμ–΄λ‘œ λ§Œλ“€μ–΄μ Έ μžˆμ–΄ λͺ¨λ“ˆλ„ 보톡 C 둜 μž‘μ„±λ©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ΅œκ·Όμ—λŠ” Lua 둜 μž‘μ„±ν•˜κ±°λ‚˜ njs (nginx μ—μ„œ μ‚¬μš©ν•˜κΈ° μœ„ν•œ μΌμ’…μ˜ custom js) λ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λ“ˆμ΄ μž‘μ„±λ˜κΈ°λ„ ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 이 κΈ€μ—μ„œλŠ” C μ–Έμ–΄λ‘œ Nginx λͺ¨λ“ˆμ„ μž‘μ„±ν•  λ•Œ μ°Έκ³ ν•˜κΈ° 쒋은 글듀을 μ†Œκ°œν•©λ‹ˆλ‹€.

    Nginx 곡식 λ¬Έμ„œ

    > https://nginx.org/en/docs/dev/development_guide.html

    곡식 λ¬Έμ„œλŠ” μ–΄λ–€ μƒν™©μ—μ„œλ“ μ§€ μ€‘μš”ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€. 이미 λ§Œλ“€μ–΄μ§„ ν”„λ‘œκ·Έλž¨μ— λŒ€ν•΄μ„œ μΆ”κ°€λ‘œ κ°œλ°œν•  λ•ŒλŠ” μ„€λͺ…μ„œλ₯Ό μžμ„Έν•˜κ²Œ μ‚΄νŽ΄λ΄μ•Ό ν•©λ‹ˆλ‹€.

    곡식 λ¬Έμ„œμ—μ„œλŠ” Nginx μ—μ„œ μ‚¬μš©λ˜λŠ” μžλ£Œν˜•κ³Ό ꡬ쑰체, λ³€μˆ˜, 둜그 방식뢀터 Nginx κ°€ HTTP κ΄€λ ¨ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” 방식 λ“± λ‹€μ–‘ν•œ λ‚΄μš©λ“€μ΄ κΈ°λ‘λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λͺ¨λ“ˆμ„ κ°œλ°œν•˜λŠ” κ²½μš°κ°€ μ•„λ‹ˆλ”λΌλ„, Nginx λ₯Ό 깊게 μ΄ν•΄ν•˜κ³  μ‹Άλ‹€λ©΄ ν•œλ²ˆ μ―€ 읽고 곡뢀해보기 쒋은 λ¬Έμ„œμž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ 이 글을 μ½μ—ˆλ‹€κ³  ν•΄μ„œ λͺ¨λ“ˆ κ°œλ°œμ„ μ°©μˆ˜ν•˜κΈ°λŠ” μ–΄λ ΅μŠ΅λ‹ˆλ‹€. 개발 μ‹œμ— μ°Έκ³ ν•˜κΈ° 쒋은 νŠœν† λ¦¬μ–Όμ΄ λ”°λ‘œ μ€€λΉ„λ˜μ–΄ μžˆμ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. 처음 μ ‘ν•˜λŠ” μ‚¬λžŒμ΄ 읽기에 λ‹€μ†Œ μ΄ν•΄ν•˜κΈ° μ–΄λ €μš΄ μš©μ–΄λ“€λ„ λ§ŽμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ κ°œλ°œν•˜λŠ” λ„μ€‘μ—λŠ” 이 λ¬Έμ„œλ₯Ό 계속 μ°Έκ³ ν•˜λ©΄μ„œ μ½”λ“œλ₯Ό μ΄ν•΄ν•˜κ³  μˆ˜μ •ν•΄λ‚˜κ°€μ•Όν•©λ‹ˆλ‹€.

    NAVER D2 - NGINX λͺ¨λ“ˆ μ œμž‘ν•˜κΈ°

    > https://d2.naver.com/helloworld/192785

    넀이버 κΈ°μˆ λΈ”λ‘œκ·Έμ— μž‘μ„±λœ Nginx λͺ¨λ“ˆ μ œμž‘ νŠœν† λ¦¬μ–Ό κΈ€μž…λ‹ˆλ‹€. μ œκ°€ 처음 λͺ¨λ“ˆμ„ μ œμž‘ν•΄μ•Όλœλ‹€κ³  ν–ˆμ„ λ•Œ μ°Έκ³ ν–ˆλ˜ 쒋은 κΈ€μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

    2012년에 μž‘μ„±λ˜μ–΄ μ‘°κΈˆμ€ 달라진 뢀뢄도 μžˆκ² μ§€λ§Œ, 크게 λ³€κ²½λœ 점이 μ—†κ³  μΆ©λΆ„νžˆ μ»΄νŒŒμΌν•˜λŠ”λ° μ΄μŠˆκ°€ μ—†μ—ˆμŠ΅λ‹ˆλ‹€. 그리고 Nginx μ—μ„œ λͺ¨λ“ˆμ΄ κ΅¬λ™λ˜λŠ” κ°œλ…μ„ 잘 μ„€λͺ…ν•˜κ³  있고, μž‘λ”λΌλ„ ꡬ동할 수 μžˆλŠ” μ»€μŠ€ν…€ λͺ¨λ“ˆμ„ λ§Œλ“€ 수 μžˆλ„λ‘ 잘 μ„€λͺ…ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“ˆμ„ μž‘μ„±ν•  λ•Œ ν•„μš”ν•œ μΈν„°νŽ˜μ΄μŠ€, λ³€μˆ˜μ™€ ν•Έλ“€λŸ¬, λͺ¨λ“ˆμ˜ μ»¨ν…μŠ€νŠΈ λ“± ν•„μš”ν•œ κ°œλ…μ— λŒ€ν•΄μ„œ μžμ„Έν•œ μ„€λͺ…κ³Ό ν•¨κ»˜ μž‘μ„±ν•΄λ³Ό 수 μžˆλŠ” μ½”λ“œλ₯Ό μ œκ³΅ν•˜μ—¬ 큰 도움이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

    Evan Miller 의 Nginx Modules Guide

    > https://www.evanmiller.org/nginx-modules-guide.html

    A/B ν…ŒμŠ€νŠΈ μƒ˜ν”Œ 데이터 κ³„μ‚°κΈ°λ‘œ 유λͺ…ν•œ Evan Miller κ°€ μž‘μ„±ν•œ nginx module κ°€μ΄λ“œμž…λ‹ˆλ‹€. Nginx λͺ¨λ“ˆμ˜ ꡬ성을 μ’€ 더 μžμ„Έν•˜κ²Œ μ„€λͺ…ν•©λ‹ˆλ‹€. 각 ν•­λͺ©μ— λŒ€ν•œ κ°œλ…κ³Ό ν˜•νƒœλ₯Ό 잘 μ„€λͺ…ν•˜κ³  μžˆμ–΄, 자주 μ°Έκ³ ν•˜κ³  μ—¬λŸ¬λ²ˆ μ½μœΌλ©΄μ„œ κ°œλ°œν•΄λ‚˜κ°”μŠ΅λ‹ˆλ‹€. 특히 개발 λ¬Έμ„œμ—μ„œ λ””ν…ŒμΌν•˜κ²Œ μ„€λͺ…λ˜μ§€ μ•ŠλŠ” μ½”λ“œ λ™μž‘ 흐름을 잘 μ„€λͺ…ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. Nginx λͺ¨λ“ˆμ˜ μ „μ²΄μ—μ„œ λΆ€λΆ„μœΌλ‘œ μ„€λͺ…ν•΄ λ‚˜κ°€λŠ” 방식은 λͺ¨λ“ˆμ„ μ’€ 더 μ‰½κ²Œ 이해할 수 μžˆλ„λ‘ λ„μ™€μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.

    Nginx 의 λ‚΄λΆ€ λͺ¨λ“ˆ μ½”λ“œ

    > https://github.com/nginx/nginx/tree/master/src/http/modules

    μ‹€μ œ λͺ¨λ“ˆμ˜ 사둀λ₯Ό μ°Έκ³ ν•˜λŠ” 것은 λΉ λ₯΄κ²Œ κ°œλ°œν•˜λŠ” 데 μ€‘μš”ν•©λ‹ˆλ‹€. Nginx μ½”λ“œμ—λŠ” 이미 λ§Žμ€ λͺ¨λ“ˆμ΄ κ°œλ°œλ˜μ–΄ ν•¨κ»˜ μ»΄νŒŒμΌλ©λ‹ˆλ‹€. μž‘μ„±λœ λͺ¨λ“ˆλ“€μ„ μ°Έκ³ ν•˜λ©΄ request 에 μ €μž₯λ˜μ–΄ 있던 데이터λ₯Ό μ’€ 더 이해 ν•  수 μžˆμ—ˆκ³ , μ΄ν•΄ν•˜κΈ° μ–΄λ €μ› λ˜ ngx ꡬ쑰체듀을 μ‚¬μš©ν•˜λŠ” 방식을 μ°Έκ³ ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

    기타 λ‹€λ₯Έ Nginx λͺ¨λ“ˆ λ ˆν¬μ§€ν„°λ¦¬

    Nginx λͺ¨λ“ˆ μ½”λ“œ 뿐만 μ•„λ‹ˆλΌ, Nginx μ¨λ“œνŒŒν‹° λͺ¨λ“ˆλ“€λ„ μžˆμ–΄ 개발 μ‹œμ— μ°Έκ³ ν•΄λ³Ό 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

    headersmore (openresty)

    user-agent (alibaba)

    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.