เชœเซเชฏเชพเชฐเซ‡ 'a' เชฌเชฐเชพเชฌเชฐ 'a' เชจเชฅเซ€. เชนเซ‡เช•เชจเชพ เชชเช—เชฒเซ‡

เชฎเชพเชฐเชพ เชเช• เชฎเชฟเชคเซเชฐ เชธเชพเชฅเซ‡ เชธเซŒเชฅเซ€ เช…เชชเซเชฐเชฟเชฏ เชตเชพเชฐเซเชคเชพ เชฌเชจเซ€. เชชเชฐเช‚เชคเซ เชคเซ‡ เชฎเชฟเช–เชพเช‡เชฒ เชฎเชพเชŸเซ‡ เชœเซ‡เชŸเชฒเซเช‚ เช…เชชเซเชฐเชฟเชฏ เชนเชคเซเช‚, เชคเซ‡ เชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชเชŸเชฒเซเช‚ เชœ เชฎเชจเซ‹เชฐเช‚เชœเช• เชนเชคเซเช‚.

เชฎเชพเชฐเซ‡ เช•เชนเซ‡เชตเซเช‚ เชœ เชœเซ‹เช‡เช เช•เซ‡ เชฎเชพเชฐเซ‹ เชฎเชฟเชคเซเชฐ เชคเชฆเซเชฆเชจ เช›เซ‡ เชฏเซเชจเชฟเช•เซเชธ-เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ: เชธเชฟเชธเซเชŸเชฎ เชœเชพเชคเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ MySQL, PHP, เช…เชจเซ‡ เชธเชฐเชณ เชธเซ‡เชŸเชฟเช‚เช—เซเชธ เช•เชฐเซ‹ nginx.
เช…เชจเซ‡ เชคเซ‡เชจเซ€ เชชเชพเชธเซ‡ เชฌเชพเช‚เชงเช•เชพเชฎ เชธเชพเชงเชจเซ‹เชจเซ‡ เชธเชฎเชฐเซเชชเชฟเชค เชเช• เชกเชเชจ เช•เซ‡ เชฆเซ‹เชข เชตเซ‡เชฌเชธเชพเช‡เชŸเซเชธ เช›เซ‡.

เชšเซ‡เช‡เชจเชธเซ‹เชจเซ‡ เชธเชฎเชฐเซเชชเชฟเชค เช† เชธเชพเช‡เชŸเซเชธเชฎเชพเช‚เชฅเซ€ เชเช• เชธเชฐเซเชš เชเชจเซเชœเชฟเชจเชจเชพ เชŸเซ‹เชชเชฎเชพเช‚ เชจเชฟเชถเซเชšเชฟเชคเชชเชฃเซ‡ เชฌเซ‡เชธเซ‡ เช›เซ‡. เช† เชธเชพเช‡เชŸ เชฌเชฟเชจ-เชตเซเชฏเชพเชตเชธเชพเชฏเชฟเช• เชธเชฎเซ€เช•เซเชทเช• เช›เซ‡, เชชเชฐเช‚เชคเซ เช•เซ‹เชˆเชจเซ‡ เชคเซ‡เชจเชพ เชชเชฐ เชนเซเชฎเชฒเซ‹ เช•เชฐเชตเชพเชจเซ€ เช†เชฆเชค เชชเชกเซ€ เช—เชˆ เช›เซ‡. เชคเซ‡ DDoS, เชชเช›เซ€ เชฌเซเชฐเซเชŸ เชซเซ‹เชฐเซเชธ, เชชเช›เซ€ เชคเซ‡เช“ เช…เชถเซเชฒเซ€เชฒ เชŸเชฟเชชเซเชชเชฃเซ€เช“ เชฒเช–เซ‡ เช›เซ‡ เช…เชจเซ‡ เชนเซ‹เชธเซเชŸเชฟเช‚เช— เช…เชจเซ‡ RKN เชจเซ‡ เช…เชชเชถเชฌเซเชฆเซ‹ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡.
เช…เชšเชพเชจเช•, เชฌเชงเซเช‚ เชถเชพเช‚เชค เชฅเชˆ เช—เชฏเซเช‚ เช…เชจเซ‡ เช† เชถเชพเช‚เชคเชฟ เชธเชพเชฐเซ€ เชจ เชนเซ‹เชตเชพเชจเซเช‚ เชฌเชนเชพเชฐ เช†เชตเซเชฏเซเช‚, เช…เชจเซ‡ เชธเชพเช‡เชŸ เชงเซ€เชฎเซ‡ เชงเซ€เชฎเซ‡ เชถเซ‹เชง เชชเชฐเชฟเชฃเชพเชฎเซ‹เชจเซ€ เชŸเซ‹เชšเชจเซ€ เชฐเซ‡เช–เชพเช“ เช›เซ‹เชกเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚.

เชœเซเชฏเชพเชฐเซ‡ 'a' เชฌเชฐเชพเชฌเชฐ 'a' เชจเชฅเซ€. เชนเซ‡เช•เชจเชพ เชชเช—เชฒเซ‡

เชคเซ‡ เชเช• เช•เชนเซ‡เชตเชค เชนเชคเซ€, เชชเช›เซ€ เชธเช‚เชšเชพเชฒเช•เชจเซ€ เชตเชพเชฐเซเชคเชพ.

เชธเซ‚เชตเชพเชจเซ‹ เชธเชฎเชฏ เชจเชœเซ€เช• เชนเชคเซ‹ เชคเซเชฏเชพเชฐเซ‡ เชซเซ‹เชจ เชตเชพเช—เซเชฏเซ‹: โ€œเชธเชพเชจ, เชคเชฎเซ‡ เชฎเชพเชฐเชพ เชธเชฐเซเชตเชฐเชจเซ‡ เชœเซ‹เชถเซ‹ เชจเชนเซ€เช‚? เชฎเชจเซ‡ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡ เชฎเชจเซ‡ เชนเซ‡เช• เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹, เชนเซเช‚ เชคเซ‡ เชธเชพเชฌเชฟเชค เช•เชฐเซ€ เชถเช•เชคเซ‹ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชฒเชพเช—เชฃเซ€เช เชฎเชจเซ‡ เชคเซเชฐเซ€เชœเชพ เช…เช เชตเชพเชกเชฟเชฏเชพ เชธเซเชงเซ€ เช›เซ‹เชกเซเชฏเซ‹ เชจเชฅเซ€. เช•เชฆเชพเชš เชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชชเซ‡เชฐเชพเชจเซ‹เช‡เชฏเชพเชจเซ€ เชธเชพเชฐเชตเชพเชฐ เชฒเซ‡เชตเชพเชจเซ‹ เชธเชฎเชฏ เช†เชตเซ€ เช—เชฏเซ‹ เช›เซ‡?"

เชคเซเชฏเชพเชฐเชชเช›เซ€ เช…เชกเชงเชพ เช•เชฒเชพเช•เชจเซ€ เชšเชฐเซเชšเชพ เชนเชคเซ€ เชœเซ‡เชจเซ‹ เชธเชพเชฐเชพเช‚เชถ เชจเซ€เชšเซ‡ เชฎเซเชœเชฌ เช›เซ‡:

  • เชนเซ‡เช•เชฟเช‚เช— เชฎเชพเชŸเซ‡เชจเซ€ เชœเชฎเซ€เชจ เชคเชฆเซเชฆเชจ เชซเชณเชฆเซเชฐเซเชช เชนเชคเซ€;
  • เชนเซเชฎเชฒเชพเช–เซ‹เชฐ เชธเซเชชเชฐเชฏเซเชเชฐ เช…เชงเชฟเช•เชพเชฐเซ‹ เชฎเซ‡เชณเชตเซ€ เชถเช•เซ‡ เช›เซ‡;
  • เชนเซเชฎเชฒเซ‹ (เชœเซ‹ เชคเซ‡ เชฅเชฏเซ‹ เชนเซ‹เชฏ เชคเซ‹) เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เช† เชธเชพเช‡เชŸ เชชเชฐ เชจเชฟเชถเชพเชจ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹;
  • เชธเชฎเชธเซเชฏเชพเชตเชพเชณเชพ เชตเชฟเชธเซเชคเชพเชฐเซ‹เชจเซ‡ เช เซ€เช• เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เช›เซ‡ เช…เชจเซ‡ เชคเชฎเชพเชฐเซ‡ เชซเช•เซเชค เชคเซ‡ เชธเชฎเชœเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช•เซ‡ เชถเซเช‚ เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เช˜เซ‚เช‚เชธเชชเซ‡เช‚เช  เชนเชคเซเช‚;
  • เชนเซ‡เช• เชธเชพเช‡เชŸ เช•เซ‹เชก เช…เชจเซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เชธเซ‡เชธเชจเซ‡ เช…เชธเชฐ เช•เชฐเซ€ เชถเช•เซเชฏเซเช‚ เชจเชฅเซ€.

เช›เซ‡เชฒเซเชฒเชพ เชฎเซเชฆเซเชฆเชพ เชตเชฟเชถเซ‡.

เชœเซเชฏเชพเชฐเซ‡ 'a' เชฌเชฐเชพเชฌเชฐ 'a' เชจเชฅเซ€. เชนเซ‡เช•เชจเชพ เชชเช—เชฒเซ‡

เชฎเชพเชคเซเชฐ เชธเชซเซ‡เชฆ เชซเซเชฐเชจเซเชŸเชเชจเซเชก IP เชตเชฟเชถเซเชตเชฎเชพเช‚ เชฌเชนเชพเชฐ เชœเซเช เช›เซ‡. http(s) เชธเชฟเชตเชพเชฏ เชฌเซ‡เช•เชเชจเซเชก เช…เชจเซ‡ เชซเซเชฐเชจเซเชŸเชเชจเซเชก เชตเชšเซเชšเซ‡ เช•เซ‹เชˆ เชตเชฟเชจเชฟเชฎเชฏ เชจเชฅเซ€, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“/เชชเชพเชธเชตเชฐเซเชก เช…เชฒเช— เช›เซ‡, เช•เซ‹เชˆ เช•เซ€เชจเซ€ เช†เชชเชฒเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชจเชฅเซ€. เช—เซเชฐเซ‡ เชเชกเซเชฐเซ‡เชธ เชชเชฐ, 80/443 เชธเชฟเชตเชพเชฏเชจเชพ เชคเชฎเชพเชฎ เชชเซ‹เชฐเซเชŸ เชฌเช‚เชง เช›เซ‡. เชตเซเชนเชพเช‡เชŸ เชฌเซ‡เช•เชเชจเซเชก เช†เช‡เชชเซ€ เชซเช•เซเชค เชฌเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชฎเชพเชŸเซ‡ เชœ เชœเชพเชฃเซ€เชคเชพ เช›เซ‡, เชœเซ‡เชฎเชจเชพ เชชเชฐ เชฎเชฟเช–เชพเช‡เชฒ เชธเช‚เชชเซ‚เชฐเซเชฃ เชตเชฟเชถเซเชตเชพเชธ เช•เชฐเซ‡ เช›เซ‡.

เชซเซเชฐเชจเซเชŸเชเชจเซเชก เชชเชฐ เชธเซเชฅเชพเชชเชฟเชค เชกเซ‡เชฌเชฟเชฏเชจ 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

เชธเช‚เชญเชตเชฟเชค เชนเซ‡เช• เชถเซ‹เชงเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ€เช

เชนเซเช‚ เชธเชฐเซเชตเชฐ เชถเชฐเซ‚ เช•เชฐเซเช‚ เช›เซเช‚, เชชเซเชฐเชฅเชฎ เชฎเชพเช‚ เชฌเชšเชพเชต-เชฎเซ‹เชก. เชนเซเช‚ เชกเชฟเชธเซเช•เชจเซ‡ เชฎเชพเช‰เชจเซเชŸ เช•เชฐเซเช‚ เช›เซเช‚ เช…เชจเซ‡ เชคเซ‡เชฎเชจเชพ เชฆเซเชตเชพเชฐเชพ เชซเซเชฒเชฟเชช เช•เชฐเซเช‚ เช›เซเช‚ เชชเซเชฐเชฎเชพเชฃเซ€เช•เชฐเชฃ-เชฒเซ‹เช— เช‡เชคเชฟเชนเชพเชธ, เชธเชฟเชธเซเชŸเชฎ เชฒเซ‰เช—เซเชธ, เชตเช—เซ‡เชฐเซ‡, เชœเซ‹ เชถเช•เซเชฏ เชนเซ‹เชฏ เชคเซ‹, เชนเซเช‚ เชซเชพเช‡เชฒ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชคเชพเชฐเซ€เช–เซ‹ เชคเชชเชพเชธเซเช‚ เช›เซเช‚, เชœเซ‹ เช•เซ‡ เชนเซเช‚ เชธเชฎเชœเซเช‚ เช›เซเช‚ เช•เซ‡ เชธเชพเชฎเชพเชจเซเชฏ เช•เซเชฐเซ‡เช•เชฐ เชชเซ‹เชคเชพเชจเซ€ เชœเชพเชคเชจเซ‡ "เชธเชซเชณเชพเชˆ เช—เชฏเซ‹" เชนเชถเซ‡, เช…เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชคเซ‡ เชชเซ‹เชคเชพเชจเซ‡ เชถเซ‹เชงเซ€ เชฐเชนเซเชฏเซ‹ เชนเชคเซ‹ เชคเซเชฏเชพเชฐเซ‡ เชฎเซ€เชถเชพ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ "เช•เชšเชกเชพเชˆ เช—เชˆ เชนเชคเซ€". .

เชนเซเช‚ เชธเชพเชฎเชพเชจเซเชฏ เชฎเซ‹เชกเชฎเชพเช‚ เชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเซเช‚ เช›เซเช‚, เชนเชœเซ เชธเซเชงเซ€ เช–เชฐเซ‡เช–เชฐ เชถเซเช‚ เชœเซ‹เชตเซเช‚ เชคเซ‡ เชธเชฎเชœเชพเชคเซเช‚ เชจเชฅเซ€, เชนเซเช‚ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช“เชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเซเช‚ เช›เซเช‚. เชธเซŒ เชชเซเชฐเชฅเชฎ, เชฎเชจเซ‡ เชฐเชธ เช›เซ‡ nginx เช•เชพเชฐเชฃ เช•เซ‡, เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เชคเซ‡เชจเชพ เชธเชฟเชตเชพเชฏ เช…เช—เซเชฐเชญเชพเช— เชชเชฐ เชฌเซ€เชœเซเช‚ เช•เช‚เชˆ เชจเชฅเซ€.
เชฐเซ‚เชชเชฐเซ‡เช–เชพเช“ เชจเชพเชจเซ€ เช›เซ‡, เชเช• เชกเชเชจ เชซเชพเช‡เชฒเซ‹เชฎเชพเช‚ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เชธเช‚เชฐเชšเชฟเชค เช›เซ‡, เชนเซเช‚ เชซเช•เซเชค เชคเซ‡เชฎเชจเชพ เชฆเซเชตเชพเชฐเชพ เชœเซ‹เช‰เช‚ เช›เซเช‚ เชฌเชฟเชฒเชพเชกเซ€'เช“เชน เชเช• เชชเช›เซ€ เชเช•. เชฌเชงเซเช‚ เชธเซเชตเชšเซเช› เชฒเชพเช—เซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเชฎเซ‡ เช•เซเชฏเชพเชฐเซ‡เชฏ เชœเชพเชฃเชคเชพ เชจเชฅเซ€ เช•เซ‡ เชนเซเช‚ เช•เช‚เชˆเช• เชšเซ‚เช•เซ€ เช—เชฏเซ‹ เชนเชคเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡, เชฎเชจเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃ เชธเซ‚เชšเชฟ เชฌเชจเชพเชตเชตเชพ เชฆเซ‹:

$ 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" เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเซ‚เชšเชฟเชจเซเช‚ เช†เช‰เชŸเชชเซเชŸ เชเช• เช•เชพเชฐเชฃเชธเชฐ เช›เซเชชเชพเชฏเซ‡เชฒ เช›เซ‡. เชนเซ‡เช•เชฟเช‚เช— เชตเชฟเชถเซ‡ เชนเชตเซ‡ เช•เซ‹เชˆ เชถเช‚เช•เชพ เชจเชฅเซ€ เช…เชจเซ‡ เชคเชฎเซ‡ เชคเซ‡เชจเซ‡ เชธเชนเชœเชคเชพเชฅเซ€ เชธเซเชตเซ€เช•เชพเชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชจเซ‡ (เช•เซ‡เชฎ เช•เซ‡ เชฎเซ€เชถเชพเช เชธเชฐเซเชตเชฐเชจเซ‡ เช•เซ‹เชˆเชชเชฃ เชฐเซ€เชคเซ‡ เชจเชตเชพ เชธเชพเชฅเซ‡ เชฌเชฆเชฒเซเชฏเซเช‚ เช›เซ‡) เชธเชฎเชธเซเชฏเชพ เชนเชฒ เชฅเชˆ เชนเซ‹เชตเชพเชจเซเช‚ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‹.

เช…เชจเซ‡ เช–เชฐเซ‡เช–เชฐ, เช•เชพเชฐเชฃ เช•เซ‡ เช•เซ‹เชˆเชจเซ‡ เช…เชงเชฟเช•เชพเชฐเซ‹ เชฎเชณเซเชฏเชพ เช›เซ‡ เชฐเซเชŸ'เช†เชน, เชชเช›เซ€ เชคเซ‡ เชฎเชพเชคเซเชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช…เชฐเซเชฅเชชเซ‚เชฐเซเชฃ เช›เซ‡ เชธเชฟเชธเซเชŸเชฎ เชชเซเชจเชƒเชธเซเชฅเชพเชชเชฟเชค เช•เชฐเซ‹, เช…เชจเซ‡ เชคเซเชฏเชพเช‚ เชถเซเช‚ เช–เซ‹เชŸเซเช‚ เชนเชคเซเช‚ เชคเซ‡ เชถเซ‹เชงเชตเชพเชจเซเช‚ เชจเช•เชพเชฎเซเช‚ เชนเชคเซเช‚, เชชเชฐเช‚เชคเซ เช† เชตเช–เชคเซ‡ เชœเชฟเชœเซเชžเชพเชธเชพเช เชŠเช‚เช˜เชจเซ‡ โ€‹โ€‹เชนเชฐเชพเชตเซเชฏเซเช‚. เชคเซ‡เช“ เช†เชชเชฃเชพเชฅเซ€ เชถเซเช‚ เช›เซเชชเชพเชตเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชนเชคเชพ เชคเซ‡ เช†เชชเชฃเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชถเซ‹เชงเซ€ เชถเช•เซ€เช?

เชšเชพเชฒเซ‹ เชŸเซเชฐเซ‡เชธ เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เช:

$ strace nginx -T

เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ เชœเซ‹เชˆเช เช›เซ€เช, เชŸเซเชฐเซ‡เชธ a la เชฎเชพเช‚ เชธเซเชชเชทเซเชŸเชชเชฃเซ‡ เชชเซ‚เชฐเชคเซ€ เชฐเซ‡เช–เชพเช“ เชจเชฅเซ€

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 เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เช เชœเซ€เชกเซ€เชฌเซ€, เชธเชฆเชญเชพเช—เซเชฏเซ‡ เชคเซเชฏเชพเช‚ เชเช• เชšเชพเชตเซ€ เช›เซ‡ --with-cc-opt -g เชชเซเชฐเชธเซเชคเซเชค เช•เชฐเซ‹ เช…เชจเซ‡ เช†เชถเชพ เชฐเชพเช–เซ‹ เช•เซ‡ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจ -O2 เชคเซ‡ เช…เชฎเชจเซ‡ เชจเซเช•เชธเชพเชจ เชจเชนเซ€เช‚ เช•เชฐเซ‡. เชคเซ‡ เชœ เชธเชฎเชฏเซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เชฎเชจเซ‡ เช–เชฌเชฐ เชจเชฅเซ€ เช•เซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ ngx_dump_config เชฎเชพเช‚ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡ เช•เซ‡เชธ 'T':, เช…เชฎเซ‡ เช† เชฌเซเชฒเซ‹เช•เชจเซ‡ เช•เซ‰เชฒ เช•เชฐเซ€เชถเซเช‚ เชจเชนเซ€เช‚, เชชเชฐเช‚เชคเซ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€เชถเซเช‚ เช•เซ‡เชธ 'เชŸเซ€':

เชถเชพ เชฎเชพเชŸเซ‡ เชคเชฎเซ‡ '-t' เชคเซ‡เชฎเชœ '-T' เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹เชฌเซเชฒเซ‹เช• เชชเซเชฐเซ‹เชธเซ‡เชธเชฟเช‚เช— เชœเซ‹(ngx_dump_config) เช…เช‚เชฆเชฐ เชฅเชพเชฏ เช›เซ‡ เชœเซ‹(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;

เชšเชพเชฒเซ‹ เช•เซเชฐเชฎเชฎเชพเช‚ เช…เชนเซ€เช‚ เชถเซเช‚ เชฅเชˆ เชฐเชนเซเชฏเซเช‚ เช›เซ‡ เชคเซ‡เชจเชพ เชชเชฐ เชเช• เชจเชœเชฐ เช•เชฐเซ€เช.

เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชเชœเชจเซเชŸเชจเซเช‚ เชฏเชพเชจเซเชกเซ‡เช•เซเชธ/เช—เซเช—เชฒ:

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- เชชเซƒเชทเซเช เซ‹ เชฌเชฆเชฒเชพเชฏ เช›เซ‡ 'เช“' เชชเชฐ 'เช“' ะธ 'เช' เชชเชฐ 'เช':

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

เชคเซ‡ เชธเชพเชšเซเช‚ เช›เซ‡, เชเช•เชฎเชพเชคเซเชฐ เชธเซ‚เช•เซเชทเซเชฎเชคเชพ เชคเซ‡ เช›เซ‡ 'a' != 'a' เชœเซ‡เชฎ 'เช“' != 'เช“':

เชœเซเชฏเชพเชฐเซ‡ 'a' เชฌเชฐเชพเชฌเชฐ 'a' เชจเชฅเซ€. เชนเซ‡เช•เชจเชพ เชชเช—เชฒเซ‡

เช†เชฎ, เชธเชฐเซเชš เชเชจเซเชœเชฟเชจ เชฌเซ‰เชŸเซ‹ เชธเชพเชฎเชพเชจเซเชฏ 100% เชธเชฟเชฐเชฟเชฒเชฟเช• เชŸเซ‡เช•เซเชธเซเชŸเชจเซ‡ เชฌเชฆเชฒเซ‡, เชฒเซ‡เชŸเชฟเชจ เชธเชพเชฅเซ‡ เชชเชพเชคเชณเซ‹ เช•เชšเชฐเซ‹ เชฎเซ‡เชณเชตเซ‡ เช›เซ‡. 'เช' ะธ 'เช“'. เช† เชเชธเช‡เช“ เชชเชฐ เช•เซ‡เชตเซ€ เช…เชธเชฐ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡เชจเซ€ เชšเชฐเซเชšเชพ เช•เชฐเชตเชพเชจเซ€ เชนเซเช‚ เชนเชฟเช‚เชฎเชค เช•เชฐเชคเซ‹ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชคเซ‡ เช…เชธเช‚เชญเชตเชฟเชค เช›เซ‡ เช•เซ‡ เช…เช•เซเชทเชฐเซ‹เชจเชพ เช†เชตเชพ เช—เชกเชฌเชกเชฅเซ€ เชถเซ‹เชง เชชเชฐเชฟเชฃเชพเชฎเซ‹เชฎเชพเช‚ เชธเซเชฅเชพเชจเซ‹ เชชเชฐ เชนเช•เชพเชฐเชพเชคเซเชฎเช• เช…เชธเชฐ เชชเชกเชถเซ‡.

เชนเซเช‚ เชถเซเช‚ เช•เชนเซ€ เชถเช•เซเช‚, เช•เชฒเซเชชเชจเชพ เชธเชพเชฅเซ‡ เช—เชพเชฏเซเช.

เชธเช‚เชฆเชฐเซเชญเซ‹

GDB เชธเชพเชฅเซ‡ เชกเซ€เชฌเช—เซ€เช‚เช—
gdb(1) โ€” Linux เชฎเซ‡เชจ เชชเซ‡เชœ
strace(1) โ€” Linux เชฎเซ‡เชจ เชชเซ‡เชœ
Nginx - เชฎเซ‹เชกเซเชฏเซเชฒ ngx_http_sub_module
เช†เชฐเซ€, เชšเซ‡เช‡เชจเชธเซ‹ เช…เชจเซ‡ เช‡เชฒเซ‡เช•เซเชŸเซเชฐเชฟเช• เช†เชฐเซ€ เชตเชฟเชถเซ‡

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹