ืกืืคืืจ ืื ื ืขืื ืืืืชืจ ืงืจื ืืืื ืืืืจืื ืฉืื. ืืื ืขื ืืื ืฉืื ืื ื ืขืื ืขืืืจ ืืืืืื, ืื ืืื ืืฉืขืฉืข ืขืืืจื ืืืืชื ืืืื.
ืื ื ืืืื ืืืืจ ืฉืืืืจ ืฉืื ืื UNIX-ืืฉืชืืฉ: ืืืื ืืืชืงืื ืืช ืืืขืจืืช ืืขืฆืื MySQL, php ืืืืฆืข ืืืืจืืช ืคืฉืืืืช nginx.
ืืืฉ ืื ืชืจืืกืจ ืื ืืื ืืืฆื ืืชืจืื ืืืืงืืฉืื ืืืื ืื ืืื.
ืืื ืืืืชืจืื ืืืื ืืืืงืืฉืื ืืืกืืจืื ืฉืจืฉืจืช ืืืฉื ืืืชื ืืืืค ืฉื ืื ืืขื ืืืืคืืฉ. ืืืชืจ ืืื ืืื ืืืงืจ ืื ืืกืืจื, ืืื ืืืฉืื ืืชืจืื ืืชืงืืฃ ืืืชื. ืึถื DDoSืืื ืื ืืืชืืื ืืขืจืืช ืืืื ืืช ืืฉืืืืื ืืชืขืืืืืืช ืืืืจืื ืื-RKN.
ืคืชืืื ืืื ื ืจืืข ืืืจืืืข ืืื ืืชืืจืจ ืืื ืืื, ืืืืชืจ ืืชืืื ืืขืืื ืืืืจืื ืืช ืืฉืืจืืช ืืขืืืื ืืช ืฉื ืชืืฆืืืช ืืืืคืืฉ.
ืื ืืืืชื ืืืืจื, ืืื ืืกืืคืืจ ืฉื ืืื ืื ืขืฆืื.
ืื ืืื ืืงืจืืช ืืฉืื ื ืืฉืืืืคืื ืฆืืฆื: "ืกื, ืืชื ืื ืืืื ืืืกืชืื ืขื ืืฉืจืช ืฉืื? ื ืจืื ืื ืฉืคืจืฆื ืืืชื, ืื ื ืื ืืืื ืืืืืื ืืช ืื, ืืื ืืชืืืฉื ืื ืขืืื ืืืชื ืืืจ ืืฉืืืข ืืฉืืืฉื. ืืืื ืื ืืืืืง ืืืื ืฉืืงืื ืืืคืื ืืคืจื ืืื?"
ืืืืจ ืืื ืืื ืืืื ืฉื ืืฆื ืฉืขื ืฉื ืืชื ืืกืื ืื:
- ืืืืื ืืคืจืืฆื ืืืืชื ืื ืคืืจืืื;
- ืชืืงืฃ ืืืื ืืงืื ืืืืืืช ืืฉืชืืฉ-ืขื;
- ืืชืงืืคื (ืื ืืชืจืืฉื) ืืืื ื ืืืืืื ืืืชืจ ืื;
- ืืืืจืื ืืขืืืชืืื ืชืืงื ื ืืืชื ืจืง ืฆืจืื ืืืืื ืื ืืืืชื ืืืืจื ืืืฉืื;
- ืืคืจืืฆื ืื ืืืื ืืืฉืคืืข ืขื ืงืื ืืืชืจ ืืืกืื ืื ืชืื ืื.
ืืืื ืื ืงืืื ืืืืจืื ื.
ืจืง ื-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':
ืืคืืื, ืืืืื ืฉื ืื ืืขื ืืืคืืฉ ืืงืืืื, ืืืงืื 100% ืืงืกื ืงืืจืืื ืจืืื, ืืื ืฉืื ื ืืืืื ืืืืื ืืช 'ื' ะธ 'ืื'. ืื ื ืื ืืขื ืืืื ืืืฆื ืื ืืฉืคืืข ืขื ืงืืืื ืืชืจืื, ืืื ืื ืกืืืจ ืฉืืืืืื ืืื ืฉื ืืืชืืืช ืชืืื ืืฉืคืขื ืืืืืืช ืขื ืืืืงืืืื ืืชืืฆืืืช ืืืืคืืฉ.
ืื ืื ื ืืืื ืืืืื, ืืืจ'ื ืขื ืืืืื.
ืชืืืืจ
ืืงืืจ: www.habr.com