๋ด ์น๊ตฌ ์ค ํ ๋ช ์๊ฒ ๊ฐ์ฅ ๋ถ์พํ ์ด์ผ๊ธฐ๊ฐ ์ผ์ด๋ฌ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋ฏธํ์ผ์๊ฒ๋ ๋ถ์พํ ์ผ์ด์์ง๋ง ๋์๊ฒ๋ ์ฆ๊ฑฐ์ด ์ผ์ด์์ต๋๋ค.
๋ด ์น๊ตฌ๊ฐ ๊ฝค ์๋ค๊ณ ๋งํด์ผ ๊ฒ ์ด UNIX-user: ์์คํ
์ ์ง์ ์ค์นํ ์ ์์ต๋๋ค. MySQL์, PHP๋ ๊ทธ๋ฆฌ๊ณ ๊ฐ๋จํ ์ค์ ์ ํด๋ณด์ธ์ Nginx์.
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๊ฑด์ถ ๋๊ตฌ ์ ์ฉ ์น์ฌ์ดํธ๋ฅผ XNUMX~XNUMX๊ฐ ์ ๋ ๊ฐ๊ณ ์์ต๋๋ค.
์ ๊ธฐํฑ ์ ์ฉ ์ฌ์ดํธ ์ค ํ๋๋ ๊ฒ์ ์์ง์ ์์์ ํ๊ณ ํ ์๋ฆฌ์ก๊ณ ์์ต๋๋ค. ์ด ์ฌ์ดํธ๋ ๋น์์
์ ์ธ ๋ฆฌ๋ทฐ์ด์ธ๋ฐ, ๋๊ตฐ๊ฐ๊ฐ ์ต๊ด์ ์ผ๋ก ๊ณต๊ฒฉํด์์ต๋๋ค. ์ ๊ฒ DDoS ๊ณต๊ฒฉ, ๊ทธ๋ฐ ๋ค์ ๋ฌด์ฐจ๋ณ ๋์
์ ํ ๋ค์ ์ธ์ค์ ์ธ ๋๊ธ์ ์์ฑํ๊ณ ํธ์คํ
๋ฐ RKN์ ์์ค์ ๋ณด๋
๋๋ค.
๊ฐ์๊ธฐ ๋ชจ๋ ๊ฒ์ด ์ง์ ๋์๊ณ ์ด๋ฌํ ํ์จํจ์ ์ข์ง ์์ ๊ฒ์ผ๋ก ํ๋ช
๋์์ผ๋ฉฐ ์ฌ์ดํธ๋ ์ ์ฐจ ๊ฒ์ ๊ฒฐ๊ณผ์ ์์ ์ค์ ๋ ๋๊ธฐ ์์ํ์ต๋๋ค.
๊ทธ๊ฒ์ ๋ง์ด์๊ณ ๊ด๋ฆฌ์์ ์ด์ผ๊ธฐ ๊ทธ ์์ฒด์์ต๋๋ค.
์ ์๋ฆฌ์ ๋ค ์๊ฐ์ด ๊ฐ๊น์์ก์ ๋ ์ ํ๋ฒจ์ด ์ธ๋ ธ๋ค. โ์ฐ์, ๋ด ์๋ฒ ์ข ๋ด์ฃผ์ง ์์๋? ํดํน๋นํ ๊ฒ ๊ฐ๊ณ ์ฆ๋ช
ํ ์๋ ์์ง๋ง XNUMX ์ฃผ ๋์ ๊ทธ ๋๋์ด ๋ ๋์ง ์์์ต๋๋ค. ์ด์ ํธ์ง์ฆ ์น๋ฃ๋ฅผ ๋ฐ์์ผ ํ ๋๊ฐ ๋ ๊ฒ ์๋๊น์?โ
์ด์ด์ง XNUMX๋ถ ๊ฐ์ ํ ๋ก ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฝ๋ ์ ์์ต๋๋ค.
- ํดํน์ ์ํ ํ ์์ ๋งค์ฐ ๋น์ฅํ์ต๋๋ค.
- ๊ณต๊ฒฉ์๋ ์ํผ์ ์ ๊ถํ์ ์ป์ ์ ์์ต๋๋ค.
- ๊ณต๊ฒฉ(๋ฐ์ํ ๊ฒฝ์ฐ)์ ํน๋ณํ ์ด ์ฌ์ดํธ๋ฅผ ํ์ ์ผ๋ก ์ผ์์ต๋๋ค.
- ๋ฌธ์ ์์ญ์ด ์์ ๋์์ผ๋ฏ๋ก ์นจํฌ๊ฐ ์์๋์ง ์ฌ๋ถ๋ง ์ดํดํ๋ฉด ๋ฉ๋๋ค.
- ํดํน์ ์ฌ์ดํธ ์ฝ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
๋ง์ง๋ง ์์ ์ ๊ดํด์.
ํฐ์ ํ๋ฐํธ์๋ 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' ๊ฒ๋ค๊ฐ '์ค' != '์ค':
๋ฐ๋ผ์ ๊ฒ์ ์์ง ๋ด์ ์ผ๋ฐ์ ์ธ 100% ํค๋ฆด์ด ํ
์คํธ ๋์ ๋ผํด์ด๋ก ํฌ์๋ ์์ ๋ ๊ฐ๋น์ง ํ
์คํธ๋ฅผ ์์ ํฉ๋๋ค. 'ใ
' ะธ '์ํ'. ์ด๊ฒ์ด SEO์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง ๊ฐํ ๋
ผ์ํ ์๋ ์์ง๋ง, ์ด๋ ๊ฒ ๋ค์ฃฝ๋ฐ์ฃฝ๋ ๊ธ์๊ฐ ๊ฒ์ ๊ฒฐ๊ณผ์ ์์น์ ๊ธ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ๊ฐ๋ฅ์ฑ์ ๊ฑฐ์ ์์ต๋๋ค.
๋ด๊ฐ ๋ญ๋ผ๊ณ ๋งํ ์ ์๋, ์์๋ ฅ์ด ํ๋ถํ ์ฌ๋๋ค.
์ฐธ์กฐ
์ถ์ฒ : habr.com