'a'๊ฐ€ 'a'์™€ ๊ฐ™์ง€ ์•Š์€ ๊ฒฝ์šฐ. ํ•ดํ‚น์œผ๋กœ ์ธํ•ด

๋‚ด ์นœ๊ตฌ ์ค‘ ํ•œ ๋ช…์—๊ฒŒ ๊ฐ€์žฅ ๋ถˆ์พŒํ•œ ์ด์•ผ๊ธฐ๊ฐ€ ์ผ์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋ฏธํ•˜์ผ์—๊ฒŒ๋Š” ๋ถˆ์พŒํ•œ ์ผ์ด์—ˆ์ง€๋งŒ ๋‚˜์—๊ฒŒ๋Š” ์ฆ๊ฑฐ์šด ์ผ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์นœ๊ตฌ๊ฐ€ ๊ฝค ์žˆ๋‹ค๊ณ  ๋งํ•ด์•ผ ๊ฒ ์–ด UNIX-user: ์‹œ์Šคํ…œ์„ ์ง์ ‘ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MySQL์€, PHP๋Š” ๊ทธ๋ฆฌ๊ณ  ๊ฐ„๋‹จํ•œ ์„ค์ •์„ ํ•ด๋ณด์„ธ์š” Nginx์—.
๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Š” ๊ฑด์ถ• ๋„๊ตฌ ์ „์šฉ ์›น์‚ฌ์ดํŠธ๋ฅผ XNUMX~XNUMX๊ฐœ ์ •๋„ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ „๊ธฐํ†ฑ ์ „์šฉ ์‚ฌ์ดํŠธ ์ค‘ ํ•˜๋‚˜๋Š” ๊ฒ€์ƒ‰ ์—”์ง„์˜ ์ƒ์œ„์— ํ™•๊ณ ํžˆ ์ž๋ฆฌ์žก๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‚ฌ์ดํŠธ๋Š” ๋น„์ƒ์—…์ ์ธ ๋ฆฌ๋ทฐ์–ด์ธ๋ฐ, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์Šต๊ด€์ ์œผ๋กœ ๊ณต๊ฒฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ €๊ฒƒ DDoS ๊ณต๊ฒฉ, ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…์„ ํ•œ ๋‹ค์Œ ์™ธ์„ค์ ์ธ ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•˜๊ณ  ํ˜ธ์ŠคํŒ… ๋ฐ RKN์— ์š•์„ค์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
๊ฐ‘์ž๊ธฐ ๋ชจ๋“  ๊ฒƒ์ด ์ง„์ •๋˜์—ˆ๊ณ  ์ด๋Ÿฌํ•œ ํ‰์˜จํ•จ์€ ์ข‹์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋˜์—ˆ์œผ๋ฉฐ ์‚ฌ์ดํŠธ๋Š” ์ ์ฐจ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ์ƒ์œ„ ์ค„์„ ๋– ๋‚˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

'a'๊ฐ€ 'a'์™€ ๊ฐ™์ง€ ์•Š์€ ๊ฒฝ์šฐ. ํ•ดํ‚น์œผ๋กœ ์ธํ•ด

๊ทธ๊ฒƒ์€ ๋ง์ด์—ˆ๊ณ  ๊ด€๋ฆฌ์ž์˜ ์ด์•ผ๊ธฐ ๊ทธ ์ž์ฒด์˜€์Šต๋‹ˆ๋‹ค.

์ž ์ž๋ฆฌ์— ๋“ค ์‹œ๊ฐ„์ด ๊ฐ€๊นŒ์›Œ์กŒ์„ ๋•Œ ์ „ํ™”๋ฒจ์ด ์šธ๋ ธ๋‹ค. โ€œ์‚ฐ์•„, ๋‚ด ์„œ๋ฒ„ ์ข€ ๋ด์ฃผ์ง€ ์•Š์„๋ž˜? ํ•ดํ‚น๋‹นํ•œ ๊ฒƒ ๊ฐ™๊ณ  ์ฆ๋ช…ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ XNUMX ์ฃผ ๋™์•ˆ ๊ทธ ๋Š๋‚Œ์ด ๋– ๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด์ œ ํŽธ์ง‘์ฆ ์น˜๋ฃŒ๋ฅผ ๋ฐ›์•„์•ผ ํ•  ๋•Œ๊ฐ€ ๋œ ๊ฒƒ ์•„๋‹๊นŒ์š”?โ€

์ด์–ด์ง„ XNUMX๋ถ„ ๊ฐ„์˜ ํ† ๋ก ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์•ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ•ดํ‚น์„ ์œ„ํ•œ ํ† ์–‘์€ ๋งค์šฐ ๋น„์˜ฅํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณต๊ฒฉ์ž๋Š” ์Šˆํผ์œ ์ € ๊ถŒํ•œ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณต๊ฒฉ(๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ)์€ ํŠน๋ณ„ํžˆ ์ด ์‚ฌ์ดํŠธ๋ฅผ ํ‘œ์ ์œผ๋กœ ์‚ผ์•˜์Šต๋‹ˆ๋‹ค.
  • ๋ฌธ์ œ ์˜์—ญ์ด ์ˆ˜์ •๋˜์—ˆ์œผ๋ฏ€๋กœ ์นจํˆฌ๊ฐ€ ์žˆ์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋งŒ ์ดํ•ดํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ํ•ดํ‚น์€ ์‚ฌ์ดํŠธ ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ์š”์ ์— ๊ด€ํ•ด์„œ.

'a'๊ฐ€ 'a'์™€ ๊ฐ™์ง€ ์•Š์€ ๊ฒฝ์šฐ. ํ•ดํ‚น์œผ๋กœ ์ธํ•ด

ํฐ์ƒ‰ ํ”„๋ŸฐํŠธ์—”๋“œ IP๋งŒ์ด ์„ธ์ƒ์„ ๋‚ด๋‹ค๋ด…๋‹ˆ๋‹ค. http(s)๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ฐฑ์—”๋“œ์™€ ํ”„๋ŸฐํŠธ์—”๋“œ ๊ฐ„์—๋Š” ๊ตํ™˜์ด ์—†์œผ๋ฉฐ ์‚ฌ์šฉ์ž/๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฅด๋ฉฐ ํ‚ค๊ฐ€ ๊ตํ™˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํšŒ์ƒ‰ ์ฃผ์†Œ์—์„œ๋Š” 80/443์„ ์ œ์™ธํ•œ ๋ชจ๋“  ํฌํŠธ๊ฐ€ ๋‹ซํž™๋‹ˆ๋‹ค. ํ™”์ดํŠธ ๋ฐฑ์—”๋“œ IP๋Š” Mikhail์ด ์™„์ „ํžˆ ์‹ ๋ขฐํ•˜๋Š” ๋‘ ๋ช…์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ์— ์„ค์น˜๋จ ๋ฐ๋น„์•ˆ 9 ํ˜ธ์ถœ์ด ์ด๋ฃจ์–ด์งˆ ๋•Œ์ฏค์—๋Š” ์™ธ๋ถ€ ๋ฐฉํ™”๋ฒฝ์— ์˜ํ•ด ์‹œ์Šคํ…œ์ด ์™ธ๋ถ€์™€ ๊ฒฉ๋ฆฌ๋˜์–ด ์ •์ง€๋ฉ๋‹ˆ๋‹ค.

โ€œ์ข‹์•„, ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด ์ฃผ์„ธ์š”.โ€ ๋‚˜๋Š” ํ•œ ์‹œ๊ฐ„ ๋™์•ˆ ์ž ์„ ๋ฏธ๋ฃจ๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. โ€œ์ง์ ‘ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.โ€

์—ฌ๊ธฐ ๊ทธ๋ฆฌ๊ณ  ๋” ๋‚˜์•„๊ฐ€:

$ grep -F PRETTY_NAME /etc/*releas*
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
$ `echo $SHELL` --version
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
$ nginx -v
nginx version: nginx/1.10.3
$ gdb --version
GNU gdb (Debian 8.2.1-2) 8.2.1

๊ฐ€๋Šฅํ•œ ํ•ดํ‚น์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

๋จผ์ € ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ ๋ชจ๋“œ. ๋””์Šคํฌ๋ฅผ ๋งˆ์šดํŠธํ•˜๊ณ  ๋’ค์ง‘์Šต๋‹ˆ๋‹ค. ์ธ์ฆ๋กœ๊ทธ, history, ์‹œ์Šคํ…œ ๋กœ๊ทธ ๋“ฑ ๊ฐ€๋Šฅํ•˜๋ฉด ํŒŒ์ผ ์ƒ์„ฑ ๋‚ ์งœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ํฌ๋ž˜์ปค๊ฐ€ ์ž์‹ ์„ "ํœฉ์“ธ๊ณ "๊ฐ”์„ ๊ฒƒ์ด๊ณ  Misha๋Š” ์ž์‹ ์„ ์ฐพ๋Š” ๋™์•ˆ ์ด๋ฏธ ๋งŽ์ด "๋ฐŸ์•„"์กŒ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. .

๋‚˜๋Š” ์ผ๋ฐ˜ ๋ชจ๋“œ์—์„œ ์‹œ์ž‘ํ•˜์ง€๋งŒ ์•„์ง ๋ฌด์—‡์„ ์ฐพ์•„์•ผ ํ• ์ง€ ์ž˜ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ณ  ๊ตฌ์„ฑ์„ ์—ฐ๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„  ์ œ๊ฐ€ ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฒƒ์€ Nginx์— ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ์—๋Š” ๊ทธ๊ฒƒ ์™ธ์— ๋‹ค๋ฅธ ๊ฒƒ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๊ตฌ์„ฑ์€ ์ž‘๊ณ  XNUMX๊ฐœ์˜ ํŒŒ์ผ๋กœ ์ž˜ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๊ทธ๋ƒฅ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค. ๊ณ ์–‘์ด'์•„ ํ•˜๋‚˜์”ฉ. ๋ชจ๋“  ๊ฒƒ์ด ๊นจ๋—ํ•ด ๋ณด์ด์ง€๋งŒ ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์ณค๋Š”์ง€๋Š” ์ ˆ๋Œ€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค ํฌํ•จ, ์ „์ฒด ๋ชฉ๋ก์„ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

$ nginx -T
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful

์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. "๋ชฉ๋ก์ด ์–ด๋””์— ์žˆ๋‚˜์š”?"

$ nginx -V
nginx version: nginx/1.10.3
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_sub_module --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module

๋‘ ๋ฒˆ์งธ ์งˆ๋ฌธ์ด ๋ชฉ๋ก ์งˆ๋ฌธ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. "์™œ ๊ทธ๋ ‡๊ฒŒ ๊ณ ๋Œ€ ๋ฒ„์ „์˜ nginx๊ฐ€ ํ•„์š”ํ•œ๊ฐ€์š”?"

๋˜ํ•œ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ตœ์‹  ๋ฒ„์ „์ด ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

$ dpkg -l nginx | grep "[n]ginx"
ii  nginx          1.14.2-2+deb10u1 all          small, powerful, scalable web/proxy server

์ „ํ™”ํ•ด์š”:
- ๋ฏธ์ƒค์•ผ, ์™œ ์žฌ์กฐ๋ฆฝํ–ˆ์–ด? Nginx์—?
- ์ผ์–ด๋‚˜์„ธ์š”, ๋‚œ ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์š”!
- ์•Œ์•˜์–ด, ์ž๊ณ  ๊ฐ€...

Nginx์— ๋ช…ํ™•ํ•˜๊ฒŒ ์žฌ๊ตฌ์ถ•๋˜์—ˆ์œผ๋ฉฐ "-T"๋ฅผ ์‚ฌ์šฉํ•œ ๋ชฉ๋ก ์ถœ๋ ฅ์€ ์–ด๋–ค ์ด์œ ๋กœ ์ˆจ๊ฒจ์กŒ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ํ•ดํ‚น์— ๋Œ€ํ•œ ์˜์‹ฌ์ด ์—†์œผ๋ฉฐ ๊ฐ„๋‹จํžˆ ์ˆ˜๋ฝํ•˜๊ณ  (Misha๊ฐ€ ์„œ๋ฒ„๋ฅผ ์ƒˆ ์„œ๋ฒ„๋กœ ๊ต์ฒดํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—) ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ถŒ๋ฆฌ๋ฅผ ์–ป์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฟŒ๋ฆฌ'์•„, ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๊ตฐ์š” ์‹œ์Šคํ…œ ์žฌ์„ค์น˜, ๊ทธ๋ฆฌ๊ณ  ๊ฑฐ๊ธฐ์—์„œ ๋ฌด์—‡์ด ๋ฌธ์ œ์ธ์ง€ ์ฐพ๋Š” ๊ฒƒ์€ ์“ธ๋ชจ๊ฐ€ ์—†์—ˆ์ง€๋งŒ ์ด๋ฒˆ์—๋Š” ํ˜ธ๊ธฐ์‹ฌ์ด ์ž ์„ ์ด๊ฒผ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ์šฐ๋ฆฌ์—๊ฒŒ ๋ฌด์—‡์„ ์ˆจ๊ธฐ๊ณ  ์‹ถ์–ดํ–ˆ๋Š”์ง€ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‚˜์š”?

์ถ”์ ํ•ด ๋ด…์‹œ๋‹ค:

$ strace nginx -T

์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋ด…๋‹ˆ๋‹ค. ์ถ”์ ์— ๋ถ„๋ช…ํžˆ ์„ ์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

write(1, "/etc/nginx/nginx.conf", 21/etc/nginx/nginx.conf)   = 21
write(1, "...
write(1, "n", 1

์žฌ๋ฏธ์‚ผ์•„ ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

$ strace nginx -T 2>&1 | wc -l
264
$ strace nginx -t 2>&1 | wc -l
264

๋‚ด ์ƒ๊ฐ์—” ์ฝ”๋“œ์˜ ์ผ๋ถ€์ธ ๊ฒƒ ๊ฐ™์•„ /src/core/nginx.c

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                ngx_dump_config = 1;
                break;

๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                //ngx_dump_config = 1;
                break;

๋˜๋Š”

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                ngx_dump_config = 0;
                break;

๋”ฐ๋ผ์„œ "-T"์— ์˜ํ•œ ๋ชฉ๋ก์€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ตฌ์„ฑ์„ ์–ด๋–ป๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๋‚˜์š”?

๋‚ด ์ƒ๊ฐ์ด ๋งž๊ณ  ๋ณ€์ˆ˜์—๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ngx_dump_config ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์น˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. gdb, ๋‹คํ–‰ํžˆ ์—ด์‡ ๊ฐ€ ์žˆ์–ด์š” --cc-opt ํฌํ•จ -g ์ œ์‹œํ•˜๊ณ  ์ตœ์ ํ™”๋ฅผ ํฌ๋งํ•ฉ๋‹ˆ๋‹ค. -O2 ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ํ•ด๋ฅผ ๋ผ์น˜ ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋™์‹œ์—, ๋‚˜๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ngx_dump_config ์—์„œ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์Œ ์‚ฌ๋ก€ 'T':, ์ด ๋ธ”๋ก์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. 't' ๊ฒฝ์šฐ:

'-T'๋ฟ๋งŒ ์•„๋‹ˆ๋ผ '-t'๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋ธ”๋ก ์ฒ˜๋ฆฌ if(ngx_dump_config) ๋‚ด๋ถ€์—์„œ ๋ฐœ์ƒ if(ngx_test_config):

    if (ngx_test_config) {
        if (!ngx_quiet_mode) {
            ngx_log_stderr(0, "configuration file %s test is successful",
                           cycle->conf_file.data);
        }

        if (ngx_dump_config) {
            cd = cycle->config_dump.elts;

            for (i = 0; i < cycle->config_dump.nelts; i++) {

                ngx_write_stdout("# configuration file ");
                (void) ngx_write_fd(ngx_stdout, cd[i].name.data,
                                    cd[i].name.len);
                ngx_write_stdout(":" NGX_LINEFEED);

                b = cd[i].buffer;

                (void) ngx_write_fd(ngx_stdout, b->pos, b->last - b->pos);
                ngx_write_stdout(NGX_LINEFEED);
            }
        }

        return 0;
    }

๋ฌผ๋ก  ์ด ๋ถ€๋ถ„์—์„œ ์ฝ”๋“œ๊ฐ€ ๋ฐ”๋€Œ๊ณ  ์—์„œ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค๋ฉด ์‚ฌ๋ก€ 'T':, ๊ทธ๋Ÿฌ๋ฉด ๋‚ด ๋ฐฉ๋ฒ•์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

nginx.conf ํ…Œ์ŠคํŠธ์ด๋ฏธ ๋ฌธ์ œ๋ฅผ ์‹คํ—˜์ ์œผ๋กœ ํ•ด๊ฒฐํ•œ ๊ฒฐ๊ณผ, ์•…์„ฑ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด ์ตœ์†Œํ•œ์˜ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์ด ํ™•๋ฆฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Nginx์— ์œ ํ˜•:

events {
}

http {
	include /etc/nginx/sites-enabled/*;
}

๊ธฐ์‚ฌ์—์„œ๋Š” ๊ฐ„๊ฒฐํ•จ์„ ์œ„ํ•ด ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋””๋ฒ„๊ฑฐ ์‹คํ–‰

$ gdb --silent --args nginx -t
Reading symbols from nginx...done.
(gdb) break main
Breakpoint 1 at 0x1f390: file src/core/nginx.c, line 188.
(gdb) run
Starting program: nginx -t
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, main (argc=2, argv=0x7fffffffebc8) at src/core/nginx.c:188
188     src/core/nginx.c: No such file or directory.
(gdb) print ngx_dump_config=1
$1 = 1
(gdb) continue
Continuing.
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# configuration file /etc/nginx/nginx.conf:
events {
}

http {
map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}

map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}

map ะพ:$sign_user_agent:$sign_uri $sign_o
{
ะพ:1:0 o;
default ะพ;
}

map ะฐ:$sign_user_agent:$sign_uri $sign_a
{
ะฐ:1:0 a;
default ะฐ;
}

sub_filter_once off;
sub_filter 'ะพ' $sign_o;
sub_filter 'ะฐ' $sign_a;

        include /etc/nginx/sites-enabled/*;
}
# configuration file /etc/nginx/sites-enabled/default:

[Inferior 1 (process 32581) exited normally]
(gdb) quit

๋‹จ๊ณ„๋ณ„:

  • ํ•จ์ˆ˜์— ์ค‘๋‹จ์ ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ๊ด€()
  • ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ•˜๋‹ค
  • ๊ตฌ์„ฑ์˜ ์ถœ๋ ฅ์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ngx_dump_config=1
  • ํ”„๋กœ๊ทธ๋žจ ๊ณ„์†/์ข…๋ฃŒ

๋ณด์‹œ๋‹ค์‹œํ”ผ ์‹ค์ œ ๊ตฌ์„ฑ์€ ์šฐ๋ฆฌ ๊ตฌ์„ฑ๊ณผ ๋‹ค๋ฅด๋ฏ€๋กœ ์—ฌ๊ธฐ์—์„œ ๊ธฐ์ƒ ๋ถ€๋ถ„์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}

map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}

map ะพ:$sign_user_agent:$sign_uri $sign_o
{
ะพ:1:0 o;
default ะพ;
}

map ะฐ:$sign_user_agent:$sign_uri $sign_a
{
ะฐ:1:0 a;
default ะฐ;
}

sub_filter_once off;
sub_filter 'ะพ' $sign_o;
sub_filter 'ะฐ' $sign_a;

์—ฌ๊ธฐ์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ˆœ์„œ๋Œ€๋กœ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฒฐ์ • ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋‹˜์˜ yandex/google:

map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}

์„œ๋น„์Šค ํŽ˜์ด์ง€๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค ์›Œ๋“œ ํ”„๋ ˆ์Šค:

map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}

๊ทธ๋ฆฌ๊ณ  ์œ„์˜ ๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด์— ๋ชจ๋‘ ํ•ด๋‹น๋˜๋Š” ๋ถ„๋“ค์€

map ะพ:$sign_user_agent:$sign_uri $sign_o
{
ะพ:1:0 o;
default ะพ;
}

map ะฐ:$sign_user_agent:$sign_uri $sign_a
{
ะฐ:1:0 a;
default ะฐ;
}

ํ…์ŠคํŠธ์—์„œ HTML-ํŽ˜์ด์ง€ ๋ณ€๊ฒฝ '์˜ํ˜•' ์— '์˜ํ˜•' ะธ 'ใ…' ์— 'ใ…':

sub_filter_once off;
sub_filter 'ะพ' $sign_o;
sub_filter 'ะฐ' $sign_a;

๊ทธ๋ ‡์ฃ , ์œ ์ผํ•œ ๋ฏธ๋ฌ˜ํ•จ์€ 'a' != 'a' ๊ฒŒ๋‹ค๊ฐ€ '์˜ค' != '์˜ค':

'a'๊ฐ€ 'a'์™€ ๊ฐ™์ง€ ์•Š์€ ๊ฒฝ์šฐ. ํ•ดํ‚น์œผ๋กœ ์ธํ•ด

๋”ฐ๋ผ์„œ ๊ฒ€์ƒ‰ ์—”์ง„ ๋ด‡์€ ์ผ๋ฐ˜์ ์ธ 100% ํ‚ค๋ฆด์–ด ํ…์ŠคํŠธ ๋Œ€์‹  ๋ผํ‹ด์–ด๋กœ ํฌ์„๋œ ์ˆ˜์ •๋œ ๊ฐ€๋น„์ง€ ํ…์ŠคํŠธ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. 'ใ…' ะธ '์˜ํ˜•'. ์ด๊ฒƒ์ด SEO์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ๊ฐํžˆ ๋…ผ์˜ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ๋’ค์ฃฝ๋ฐ•์ฃฝ๋œ ๊ธ€์ž๊ฐ€ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ์œ„์น˜์— ๊ธ์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฐ€๋Šฅ์„ฑ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ญ๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ˆ, ์ƒ์ƒ๋ ฅ์ด ํ’๋ถ€ํ•œ ์‚ฌ๋žŒ๋“ค.

์ฐธ์กฐ

GDB๋กœ ๋””๋ฒ„๊น…
gdb(1) โ€” Linux ๋งค๋‰ด์–ผ ํŽ˜์ด์ง€
strace(1) โ€” Linux ๋งค๋‰ด์–ผ ํŽ˜์ด์ง€
Nginx - ๋ชจ๋“ˆ ngx_http_sub_module
ํ†ฑ, ์ „๊ธฐํ†ฑ, ์ „๊ธฐํ†ฑ ์ •๋ณด

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€