ื›ืืฉืจ 'a' ืื™ื ื• ืฉื•ื•ื” ืœ-'a'. ื‘ืขืงื‘ื•ืช ืคืจื™ืฆื”

ืกื™ืคื•ืจ ืœื ื ืขื™ื ื‘ื™ื•ืชืจ ืงืจื” ืœืื—ื“ ื”ื—ื‘ืจื™ื ืฉืœื™. ืื‘ืœ ืขื“ ื›ืžื” ืฉื–ื” ืœื ื ืขื™ื ืขื‘ื•ืจ ืžื™ื›ืื™ืœ, ื–ื” ื”ื™ื” ืžืฉืขืฉืข ืขื‘ื•ืจื™ ื‘ืื•ืชื” ืžื™ื“ื”.

ืื ื™ ื—ื™ื™ื‘ ืœื•ืžืจ ืฉื”ื—ื‘ืจ ืฉืœื™ ื“ื™ UNIX-ืžืฉืชืžืฉ: ื™ื›ื•ืœ ืœื”ืชืงื™ืŸ ืืช ื”ืžืขืจื›ืช ื‘ืขืฆืžื• MySQL, php ื•ืœื‘ืฆืข ื”ื’ื“ืจื•ืช ืคืฉื•ื˜ื•ืช nginx.
ื•ื™ืฉ ืœื• ืชืจื™ืกืจ ืื• ืื—ื“ ื•ื—ืฆื™ ืืชืจื™ื ื”ืžื•ืงื“ืฉื™ื ืœื›ืœื™ ื‘ื ื™ื™ื”.

ืื—ื“ ืžื”ืืชืจื™ื ื”ืืœื• ื”ืžื•ืงื“ืฉื™ื ืœืžืกื•ืจื™ื ืฉืจืฉืจืช ื™ื•ืฉื‘ ืื™ืชืŸ ื‘ื˜ื•ืค ืฉืœ ืžื ื•ืขื™ ื”ื—ื™ืคื•ืฉ. ื”ืืชืจ ื”ื–ื” ื”ื•ื ืžื‘ืงืจ ืœื ืžืกื—ืจื™, ืื‘ืœ ืžื™ืฉื”ื• ื”ืชืจื’ืœ ืœืชืงื•ืฃ ืื•ืชื•. ื–ึถื” DDoSื•ืื– ื”ื ื›ื•ืชื‘ื™ื ื”ืขืจื•ืช ืžื’ื•ื ื•ืช ื•ืฉื•ืœื—ื™ื ื”ืชืขืœืœื•ื™ื•ืช ืœืื™ืจื•ื— ื•ืœ-RKN.
ืคืชืื•ื ื”ื›ืœ ื ืจื’ืข ื•ื”ืจื•ื’ืข ื”ื–ื” ื”ืชื‘ืจืจ ื›ืœื ื˜ื•ื‘, ื•ื”ืืชืจ ื”ืชื—ื™ืœ ืœืขื–ื•ื‘ ื‘ื”ื“ืจื’ื” ืืช ื”ืฉื•ืจื•ืช ื”ืขืœื™ื•ื ื•ืช ืฉืœ ืชื•ืฆืื•ืช ื”ื—ื™ืคื•ืฉ.

ื›ืืฉืจ 'a' ืื™ื ื• ืฉื•ื•ื” ืœ-'a'. ื‘ืขืงื‘ื•ืช ืคืจื™ืฆื”

ื–ื• ื”ื™ื™ืชื” ืืžื™ืจื”, ื•ืื– ื”ืกื™ืคื•ืจ ืฉืœ ื”ืžื ื”ืœ ืขืฆืžื•.

ื–ื” ื”ื™ื” ืœืงืจืืช ื”ืฉื™ื ื” ื›ืฉื”ื˜ืœืคื•ืŸ ืฆืœืฆืœ: "ืกืŸ, ืืชื” ืœื ืžื•ื›ืŸ ืœื”ืกืชื›ืœ ืขืœ ื”ืฉืจืช ืฉืœื™? ื ืจืื” ืœื™ ืฉืคืจืฆื• ืื•ืชื™, ืื ื™ ืœื ื™ื›ื•ืœ ืœื”ื•ื›ื™ื— ืืช ื–ื”, ืื‘ืœ ื”ืชื—ื•ืฉื” ืœื ืขื–ื‘ื” ืื•ืชื™ ื›ื‘ืจ ื”ืฉื‘ื•ืข ื”ืฉืœื™ืฉื™. ืื•ืœื™ ื–ื” ื‘ื“ื™ื•ืง ื”ื–ืžืŸ ืฉืืงื‘ืœ ื˜ื™ืคื•ืœ ื‘ืคืจื ื•ื™ื”?"

ืœืื—ืจ ืžื›ืŸ ื”ื™ื” ื“ื™ื•ืŸ ืฉืœ ื—ืฆื™ ืฉืขื” ืฉื ื™ืชืŸ ืœืกื›ื ื›ืš:

  • ื”ืื“ืžื” ืœืคืจื™ืฆื” ื”ื™ื™ืชื” ื“ื™ ืคื•ืจื™ื™ื”;
  • ืชื•ืงืฃ ื™ื›ื•ืœ ืœืงื‘ืœ ื–ื›ื•ื™ื•ืช ืžืฉืชืžืฉ-ืขืœ;
  • ื”ืชืงื™ืคื” (ืื ื”ืชืจื—ืฉื”) ื›ื•ื•ื ื” ื‘ืžื™ื•ื—ื“ ืœืืชืจ ื–ื”;
  • ืื–ื•ืจื™ื ื‘ืขื™ื™ืชื™ื™ื ืชื•ืงื ื• ื•ืืชื” ืจืง ืฆืจื™ืš ืœื”ื‘ื™ืŸ ืื ื”ื™ื™ืชื” ื—ื“ื™ืจื” ื›ืœืฉื”ื™;
  • ื”ืคืจื™ืฆื” ืœื ื™ื›ืœื” ืœื”ืฉืคื™ืข ืขืœ ืงื•ื“ ื”ืืชืจ ื•ืžืกื“ื™ ื”ื ืชื•ื ื™ื.

ืœื’ื‘ื™ ื”ื ืงื•ื“ื” ื”ืื—ืจื•ื ื”.

ื›ืืฉืจ 'a' ืื™ื ื• ืฉื•ื•ื” ืœ-'a'. ื‘ืขืงื‘ื•ืช ืคืจื™ืฆื”

ืจืง ื”-IP ื”ืงื“ืžื™ ื”ืœื‘ืŸ ืžืฉืงื™ืฃ ืืœ ื”ืขื•ืœื. ืื™ืŸ ื”ื—ืœืคื” ื‘ื™ืŸ ื”-backends ืœ-frontend ืœืžืขื˜ http(s), ื”ืžืฉืชืžืฉื™ื/ืกื™ืกืžืื•ืช ืฉื•ื ื™ื, ืœื ื”ื•ื—ืœืคื• ืžืคืชื—ื•ืช. ื‘ื›ืชื•ื‘ื•ืช ืืคื•ืจื•ืช, ื›ืœ ื”ื™ืฆื™ืื•ืช ืœืžืขื˜ 80/443 ืกื’ื•ืจื•ืช. ื›ืชื•ื‘ื•ืช IP backend ืœื‘ื ื™ื ื™ื“ื•ืขื•ืช ืจืง ืœืฉื ื™ ืžืฉืชืžืฉื™ื, ืืฉืจ ืžื™ื›ืื™ืœ ืกื•ืžืš ืขืœื™ื”ื ืœื—ืœื•ื˜ื™ืŸ.

ืžื•ืชืงืŸ ื‘ื—ื–ื™ืช ื“ื‘ื™ืืŸ 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

ืื ื—ื ื• ืžืกืชื›ืœื™ื ืขืœ ื–ื”, ื‘ืจื•ืจ ืฉืื™ืŸ ืžืกืคื™ืง ืงื•ื•ื™ื ื‘ืขืงื™ื‘ื” ื-ืœื”

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, ืœืžืจื‘ื” ื”ืžื–ืœ ื™ืฉ ืžืคืชื— --with-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;

ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ืžื” ืฉืงื•ืจื” ื›ืืŸ ืœืคื™ ื”ืกื“ืจ.

ื ื—ื•ืฉื™ื 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-ื“ืคื™ื ืžืฉืชื ื™ื 'ืื•' ืขืœ 'ืื•' ะธ 'ื' ืขืœ 'ื':

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

ื ื›ื•ืŸ, ื”ืขื“ื™ื ื•ืช ื”ื™ื—ื™ื“ื” ื”ื™ื ื–ื• 'ื' != 'ื' ื›ืžื• ื’ื 'o' != 'o':

ื›ืืฉืจ 'a' ืื™ื ื• ืฉื•ื•ื” ืœ-'a'. ื‘ืขืงื‘ื•ืช ืคืจื™ืฆื”

ืœืคื™ื›ืš, ื‘ื•ื˜ื™ื ืฉืœ ืžื ื•ืขื™ ื—ื™ืคื•ืฉ ืžืงื‘ืœื™ื, ื‘ืžืงื•ื 100% ื˜ืงืกื˜ ืงื™ืจื™ืœื™ ืจื’ื™ืœ, ื–ื‘ืœ ืฉื•ื ื” ืžื“ื•ืœืœ ื‘ืœื˜ื™ื ื™ืช 'ื' ะธ 'ืื•'. ืื ื™ ืœื ืžืขื– ืœื“ื•ืŸ ื›ื™ืฆื“ ื–ื” ืžืฉืคื™ืข ืขืœ ืงื™ื“ื•ื ืืชืจื™ื, ืื‘ืœ ืœื ืกื‘ื™ืจ ืฉืœื‘ืœื‘ื•ืœ ื›ื–ื” ืฉืœ ืื•ืชื™ื•ืช ืชื”ื™ื” ื”ืฉืคืขื” ื—ื™ื•ื‘ื™ืช ืขืœ ื”ืžื™ืงื•ืžื™ื ื‘ืชื•ืฆืื•ืช ื”ื—ื™ืคื•ืฉ.

ืžื” ืื ื™ ื™ื›ื•ืœ ืœื”ื’ื™ื“, ื—ื‘ืจ'ื” ืขื ื“ืžื™ื•ืŸ.

ืชื–ื›ื•ืจ

ืื™ืชื•ืจ ื‘ืื’ื™ื ืขื GDB
gdb(1) - ื“ืฃ ืื“ื ืฉืœ ืœื™ื ื•ืงืก
strace(1) - ื“ืฃ ืื“ื ืฉืœ ืœื™ื ื•ืงืก
Nginx - ืžื•ื“ื•ืœ ngx_http_sub_module
ืขืœ ืžืกื•ืจื™ื, ืžืกื•ืจื™ ืฉืจืฉืจืช ื•ืžืกื•ืจื™ื ื—ืฉืžืœื™ื™ื

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”