Когда ‘a’ Π½Π΅ Ρ€Π°Π²Π½ΠΎ ‘Π°’. По слСдам ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Π·Π»ΠΎΠΌΠ°

ΠŸΡ€Π΅Π½Π΅ΠΏΡ€ΠΈΡΡ‚Π½Π΅ΠΉΡˆΠ°Ρ история ΡΠ»ΡƒΡ‡ΠΈΠ»Π°ΡΡŒ с ΠΎΠ΄Π½ΠΈΠΌ ΠΌΠΎΠΈΠΌ Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΌ. Но насколько ΠΎΠ½Π° оказалась нСприятной для ΠœΠΈΡ…Π°ΠΈΠ»Π° Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΆΠ΅ Π·Π°Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ для мСня.

Надо ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΡΡ‚Π΅Π»ΡŒ ΠΌΠΎΠΉ Π²ΠΏΠΎΠ»Π½Π΅ сСбС UNIX-ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ: ΠΌΠΎΠΆΠ΅Ρ‚ сам ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ систСму, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ mysql, php ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠ΅ настройки nginx.
И Π΅ΡΡ‚ΡŒ Ρƒ Π½Π΅Π³ΠΎ дСсяток-ΠΏΠΎΠ»Ρ‚ΠΎΡ€Π° сайтов посвящСнных ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ инструмСнтам.

Один ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… сайтов посвящСнный Π±Π΅Π½Π·ΠΎΠΏΠΈΠ»Π°ΠΌ ΠΏΠ»ΠΎΡ‚Π½Π΅Π½ΡŒΠΊΠΎ сидит Π² ВОПe поисковиков. Π‘Π°ΠΉΡ‚ этот β€” нСкоммСрчСский ΠΎΠ±Π·ΠΎΡ€Π½ΠΈΠΊ, Π½ΠΎ ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ ΠΏΠΎΠΏΠ΅Ρ€Π΅ΠΊ Π³ΠΎΡ€Π»Π° ΠΈ повадились Π΅Π³ΠΎ Π°Ρ‚Π°ΠΊΠΎΠ²Π°Ρ‚ΡŒ. Π’ΠΎ DDoS, Ρ‚ΠΎ брутфорс, Ρ‚ΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Ρ‹ Π½Π°ΠΏΠΈΡˆΡƒΡ‚ Π½Π΅ΠΏΠΎΡ‚Ρ€Π΅Π±Π½Ρ‹Π΅ ΠΈ ΡˆΠ»ΡŽΡ‚ Π°Π±ΡƒΠ·Ρ‹ Π½Π° хостинг ΠΈ Π² РКН.
НСоТиданно всё стихло ΠΈ это Π·Π°Ρ‚ΠΈΡˆΡŒΠ΅ оказалось Π½Π΅ ΠΊ Π΄ΠΎΠ±Ρ€Ρƒ, Π° сайт Π½Π°Ρ‡Π°Π» постСпСнно ΠΏΠΎΠΊΠΈΠ΄Π°Ρ‚ΡŒ Π²Π΅Ρ€Ρ…Π½ΠΈΠ΅ строчки Π²Ρ‹Π΄Π°Ρ‡ΠΈ.

Когда 'a' Π½Π΅ Ρ€Π°Π²Π½ΠΎ 'Π°'. По слСдам ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Π·Π»ΠΎΠΌΠ°

Π’ΠΎ Π±Ρ‹Π»Π° присказка, дальшС сама админская Π±Π°ΠΉΠΊΠ°.

ВрСмя близилось ΠΊΠΎ сну ΠΊΠΎΠ³Π΄Π° раздался Π·Π²ΠΎΠ½ΠΎΠΊ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π°: «Бань, Ρ‚Ρ‹ Π½Π΅ глянСшь ΠΌΠΎΠΉ сСрвСр? МнС каТСтся мСня Ρ…Π°ΠΊΠ½ΡƒΠ»ΠΈ, Π΄ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π΅ ΠΌΠΎΠ³Ρƒ, Π½ΠΎ ΠΎΡ‰ΡƒΡ‰Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΏΠΎΠΊΠΈΠ΄Π°Π΅Ρ‚ ΡƒΠΆΠ΅ Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ нСдСлю. ΠœΠΎΠΆΠ΅Ρ‚ ΠΌΠ½Π΅ просто ΠΏΠΎΡ€Π° Π»Π΅Ρ‡ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ ΠΏΠ°Ρ€Π°Π½ΠΎΠΉΠΈ?Β»

Π”Π°Π»Π΅Π΅ пошло получасовоС обсуТдСниС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π»ΠΎΠΆΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ:

  • ΠΏΠΎΡ‡Π²Π° для Π²Π·Π»ΠΎΠΌΠ° Π±Ρ‹Π»Π° Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΠ»ΠΎΠ΄ΠΎΡ€ΠΎΠ΄Π½ΠΎΠΉ;
  • Π²Π·Π»ΠΎΠΌΡ‰ΠΈΠΊ ΠΌΠΎΠ³ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²Π° ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ;
  • Π°Ρ‚Π°ΠΊΠ° (Ссли ΠΎΠ½Π° ΠΈΠΌΠ΅Π»Π° мСсто) Π±Ρ‹Π»Π° Ρ†Π΅Π»Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠΉ ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° этот сайт;
  • ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹Π΅ мСста исправлСны ΠΈ Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π±Ρ‹Π» Π»ΠΈ Ρ„Π°ΠΊΡ‚ проникновСния;
  • Π²Π·Π»ΠΎΠΌ Π½Π΅ ΠΌΠΎΠ³ ΠΊΠΎΡΠ½ΡƒΡ‚ΡŒΡΡ ΠΊΠΎΠ΄Π° сайта ΠΈ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ….

ΠšΠ°ΡΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ послСднСго ΠΏΡƒΠ½ΠΊΡ‚Π°.

Когда 'a' Π½Π΅ Ρ€Π°Π²Π½ΠΎ 'Π°'. По слСдам ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Π·Π»ΠΎΠΌΠ°

Π’ ΠΌΠΈΡ€ смотрит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Π΅Π»Ρ‹ΠΉ IP Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π°. ΠœΠ΅ΠΆΠ΄Ρƒ Π±Π°ΠΊΠ΅Π½Π΄Π°ΠΌΠΈ ΠΈ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ΠΎΠΌ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΠ±ΠΌΠ΅Π½Π° ΠΊΡ€ΠΎΠΌΠ΅ http(s), ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ/ΠΏΠ°Ρ€ΠΎΠ»ΠΈ Ρ€Π°Π·Π½Ρ‹Π΅, ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ Π½Π΅ обмСнивались. На сСрых адрСсах всС ΠΏΠΎΡ€Ρ‚Ρ‹ ΠΊΡ€ΠΎΠΌΠ΅ 80/443 Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹. Π‘Π΅Π»Ρ‹Π΅ IP Π±Π°ΠΊΠ΅Π½Π΄ΠΎΠ² извСстны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²ΡƒΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠœΠΈΡ…Π°ΠΈΠ» всСцСло довСряСт.

На Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π΅ установлСна Debian 9 ΠΈ ΠΊ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ Π·Π²ΠΎΠ½ΠΊΠ° систСма ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΎΡ‚ ΠΌΠΈΡ€Π° внСшним firewall’ΠΎΠΌ ΠΈ остановлСна.

Β«Ok, Π΄Π°Π²Π°ΠΉ доступы, β€” Ρ€Π΅ΡˆΠ°ΡŽ ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚ΡŒ сон Π½Π° часок. β€” ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΡŽ своим Π³Π»Π°Π·ΠΎΠΌΒ».

Π—Π΄Π΅ΡΡŒ ΠΈ Π΄Π°Π»Π΅Π΅:

$ 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

Π’ поисках Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ Π²Π·Π»ΠΎΠΌΠ°

Π—Π°ΠΏΡƒΡΠΊΠ°ΡŽ сСрвСр, сначала Π² rescue-mode. ΠœΠΎΠ½Ρ‚ΠΈΡ€ΡƒΡŽ диски, ΠΏΡ€ΠΎΠ»ΠΈΡΡ‚Ρ‹Π²Π°ΡŽ auth-Π»ΠΎΠ³ΠΈ, history, систСмныС Π»ΠΎΠ³ΠΈ ΠΈ Ρ‚.ΠΏ., ΠΏΠΎ возмоТности ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽ Π΄Π°Ρ‚Ρ‹ создания Ρ„Π°ΠΉΠ»ΠΎΠ², хотя понимаю, Ρ‡Ρ‚ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²Π·Π»ΠΎΠΌΡ‰ΠΈΠΊ Β«ΠΏΠΎΠ΄ΠΌΠ΅Π»Β» Π±Ρ‹ Π·Π° собой, Π΄Π° ΠΈ Миша ΡƒΠΆΠ΅ Π·Π½Π°Ρ‚Π½ΠΎ Β«Π½Π°Ρ‚ΠΎΠΏΡ‚Π°Π»Β» ΠΏΠΎΠΊΠ° искал сам.

Π‘Ρ‚Π°Ρ€Ρ‚ΡƒΡŽ Π² Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, особо ΠΏΠΎΠΊΠ° Π½Π΅ понимая Ρ‡Ρ‚ΠΎ ΠΈΡΠΊΠ°Ρ‚ΡŒ, ΠΈΠ·ΡƒΡ‡Π°ΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΈ. Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ интСрСсуСт nginx Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ, Π² ΠΎΠ±Ρ‰Π΅ΠΌ-Ρ‚ΠΎ, Π½Π° Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π΅ ΠΊΡ€ΠΎΠΌΠ΅ Π½Π΅Π³ΠΎ ΠΈ Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ.
ΠšΠΎΠ½Ρ„ΠΈΠ³ΠΈ нСбольшиС, Ρ…ΠΎΡ€ΠΎΡˆΠΎ структурированыС Π² дСсяток Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽ ΠΈΡ… просто cat’ΠΎΠΌ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Π’Ρ€ΠΎΠ΄Π΅ всё чисто, Π½ΠΎ ΠΌΠ°Π»ΠΎ-Π»ΠΈ упустил ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ include, сдСлаю-ΠΊΠ° я ΠΏΠΎΠ»Π½Ρ‹ΠΉ листинг:

$ 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?
β€” ΠžΠΊΡΡ‚ΠΈΡΡŒ, я Π΄Π°ΠΆΠ΅ Π½Π΅ знаю ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ!
β€” Ok, Π½Ρƒ, спи…

Nginx ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ пСрСсобран ΠΈ Π²Ρ‹Π²ΠΎΠ΄ листинга ΠΏΠΎ «-T» скрыт нСспроста. Π‘ΠΎΠΌΠ½Π΅Π½ΠΈΠΉ Π²ΠΎ Π²Π·Π»ΠΎΠΌΠ΅ ΡƒΠΆΠ΅ Π½Π΅Ρ‚ ΠΈ ΠΌΠΎΠΆΠ½ΠΎ это просто ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ ΠΈ (Ρ€Π°Π· ΡƒΠΆ Миша всё-Ρ€Π°Π²Π½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΠ» сСрвСр Π½ΠΎΠ²Ρ‹ΠΌ) ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Ρ€Π΅ΡˆΠ΅Π½Π½ΠΎΠΉ.

И Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ€Π°Π· ΡƒΠΆ Π½Π΅ΠΊΡ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΠΏΡ€Π°Π²Π° root‘Π°, Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ смысл Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ system reinstall, Π° ΠΈΡΠΊΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ Π±Ρ‹Π»ΠΎ Π½Π°Π±Π΅Π΄ΠΎΠΊΡƒΡ€Π΅Π½ΠΎ бСсполСзно, Π½ΠΎ Π² этот Ρ€Π°Π· Π»ΡŽΠ±ΠΎΠΏΡ‹Ρ‚ΡΡ‚Π²ΠΎ ΠΏΠΎΠ±Π΅Π΄ΠΈΠ»ΠΎ сон. Как ΠΆΠ΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ ΠΎΡ‚ нас Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ?

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΎΡ‚Ρ‚Ρ€Π°ΡΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ:

$ 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 ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Ρ‘ c ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ gdb, Π±Π»Π°Π³ΠΎ ΠΊΠ»ΡŽΡ‡ΠΈΠΊ —with-cc-opt -g присутствуСт ΠΈ надССмся, Ρ‡Ρ‚ΠΎ оптимизация -O2 Π½Π°ΠΌ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡˆΠ°Π΅Ρ‚. ΠŸΡ€ΠΈ этом, Ρ€Π°Π· я Π½Π΅ знаю ΠΊΠ°ΠΊ ngx_dump_config ΠΌΠΎΠ³Π»Π° Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° Π² case ‘T’:, Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ этот Π±Π»ΠΎΠΊ, Π° установим Π΅Ρ‘ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ case ‘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;
    }

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ссли ΠΊΠΎΠ΄ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Π² этой части, Π° Π½Π΅ Π² case ‘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

По шагам:

  • устанавливаСм Ρ‚ΠΎΡ‡ΠΊΡƒ останова Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main()
  • запускаСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ
  • измСняСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅ΠΉ Π²Ρ‹Π²ΠΎΠ΄ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° 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;

Рассмотрим ΠΏΠΎ порядку Ρ‡Ρ‚ΠΎ ΠΆΠ΅ здСсь происходит.

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ User-Agent‘Ρ‹ yandex/google:

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

Π˜ΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ слуТСбныС страницы wordpress:

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-страницы измСняСтся ‘ΠΎ’ Π½Π° ‘o’ ΠΈ ‘Π°’ Π½Π° ‘a’:

sub_filter_once off;
sub_filter 'ΠΎ' $sign_o;
sub_filter 'Π°' $sign_a;

ИмСнно Ρ‚Π°ΠΊ, Ρ‚ΠΎΠ½ΠΊΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ Ρ‡Ρ‚ΠΎ ‘Π°’ != ‘a’ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ ‘ΠΎ’ != ‘o’:

Когда 'a' Π½Π΅ Ρ€Π°Π²Π½ΠΎ 'Π°'. По слСдам ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Π·Π»ΠΎΠΌΠ°

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π±ΠΎΡ‚Ρ‹ поисковых систСм ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ вмСсто Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ 100%-кирилличСского тСкста ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ мусор Ρ€Π°Π·Π±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ латинскими ‘a’ ΠΈ ‘o’. НС Π±Π΅Ρ€ΡƒΡΡŒ Ρ€Π°ΡΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ это влияСт Π½Π° SEO, Π½ΠΎ вряд Π»ΠΈ такая буквСнная мСшанина ΠΏΠΎΠ·ΠΈΡ‚ΠΈΠ²Π½ΠΎ скаТСтся Π½Π° позициях Π² Π²Ρ‹Π΄Π°Ρ‡Π΅.

Π§Ρ‚ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, рСбята с Ρ„Π°Π½Ρ‚Π°Π·ΠΈΠ΅ΠΉ.

Бсылки

ΠžΡ‚Π»Π°Π΄ΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GDB
gdb(1) β€” Linux man page
strace(1) β€” Linux man page
Nginx β€” Module ngx_http_sub_module
О ΠΏΠΈΠ»Π°Ρ…, Π±Π΅Π½Π·ΠΎΠΏΠΈΠ»Π°Ρ… ΠΈ элСктропилах

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com