๋ชฉ์ฐจ
WS ์คํฌ๋ฆฝํธ ์ค์
์ ํฌ ํ๋ก์ ํธ์ CI/CD ๋ jenkins ๋ฅผ ์ด์ฉํ์ฌ ๊ตฌ์ถํ์์ต๋๋ค. ์ด ๊ณผ์ ์์ jenkins ๋ WAS ์๋ฒ์ ๋ฐฐํฌ ๋ฟ๋ง ์๋๋ผ, WS ์ ๋ฐฐํฌ๋ ํจ๊ป ์งํํฉ๋๋ค. WS ์๋ ํ๋ก ํธ ํ์์ด ๊ฐ๋ฐํ ์ ์ ํ์ด์ง๊ฐ ์๊ณ , ๋ฆฌ๋ฒ์ค ํ๋ก์๋ฅผ ์ํ NginX ์๋ฒ๋ ์์ต๋๋ค. ๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ์ธ NginX๋ ์ฑ ์๋ฒ๋ฅผ ์จ๊ฒจ์ค ๋ฟ๋ง ์๋๋ผ ์์ฒญ์ ๋ํ ๋ก๋ ๋ฐธ๋ฐ์ฑ ๊ธฐ๋ฅ๋ ์์ด, ์ ํฌ๋ ์ด NginX ์ ๋ก๋ ๋ฐธ๋ฐ์ฑ ๊ธฐ๋ฅ์ ์ด์ฉํ๊ธฐ๋ก ํ์์ต๋๋ค.
NGNIX ์ด๊ธฐ ์ค์
events {
worker_connections 768;
}
http {
upstream morak {
server {WAS1 IP}:8080 max_fails=1 fail_timeout=100s;
server {WAS1 IP}:8081 max_fails=1 fail_timeout=100s;
server {WAS2 IP}:8080 max_fails=1 fail_timeout=100s;
server {WAS2 IP}:8081 max_fails=1 fail_timeout=100s;
}
server {
server_name mo-rak.com www.mo-rak.com;
location /api {
proxy_pass http://morak;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
}
}
Shell
๋ณต์ฌ
์ ์ฒด ์คํฌ๋ฆฝํธ๋ https ๊ด๋ จ ๋ด์ฉ์ด ๋๋ฌด ๊ธธ๊ธฐ๋ ํ๊ณ ๋ก๋ ๋ฐธ๋ฐ์ฑ ๊ธฐ๋ฅ์ ์ค๋ช
ํ๊ธฐ์๋ ๋ถํ์ํ๋ค๊ณ ์๊ฐํ์ฌ ๋ก๋ ๋ฐธ๋ฐ์ฑ๊ณผ ๊ด๋ จ๋ ์ค์ ๋ง ๊ฐ์ ธ์์ต๋๋ค.
๊ฐ์ฅ ์ค์ํ ์ ์ default.conf ๋ฅผ ๋ ์ด์ ์ฌ์ฉํ๋ฉด ์๋๋ค๋ ๊ฒ์
๋๋ค. ๊ธฐ์กด์๋ sites-available ๋๋ ํ ๋ฆฌ์ ์๋ default.conf ํ์ผ์ ์ปค์คํ
ํ์ฌ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค. ํด๋น ํ์ผ์๋ nginx ๊ตฌ๋์ ์ํ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ์ด ๋ด๊ฒจ ์๊ณ , https๋ฅผ ์ ์ฉํ ๋๊น์ง๋ ์ฌ์ฉํ ์ ์์์ต๋๋ค. ์ ํฌ๋ ์ฒ์์๋ ์ด๊ฑธ ๋ชจ๋ฅด๊ณ default.conf ์์ http ์ต์
์ ์ฌ์ฉํ๊ณ ์คํํ์๋๋ฐ ์๋ฒ๊ฐ ๋จ์ง ์์ ๋ก๊ทธ๋ฅผ ์ดํด๋ณด๋ ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค.
nginx: [emerg] "http" directive is not allowed here in /etc/nginx/sites-available/default.conf
Bash
๋ณต์ฌ
๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ํด ์ฌ์ฉํ http, upstream ๊ณผ ๊ฐ์ ๋ถ๊ฐ์ ์ธ ์ต์
์ default.conf ์์ ์ง์ํ์ง ์๋๋ค๊ณ ํฉ๋๋ค. ์ด์ ๋ฐ๋ผ /etc/nginx ์ nginx.conf ํ์ผ์ ์ฌ์ฉํ์์ต๋๋ค.
http ์ upstream ์์๋ ์์ฒญ์ ๋ฐ์ ์๋ฒ์ ๋ชฉ๋ก์ ์ง์ ํ ์ ์์ต๋๋ค. nginx ์์๋ upstream ์๋ฒ์ ๋ชฉ๋ก์ ์ง์ ํ ์๊ณ ๋ฆฌ์ฆ์ ๋ง๊ฒ ์์ฒญ์ ๋ถ์ฐ์ํต๋๋ค. ์ฌ์ฉํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก๋ weighted-Round-Robin, hash, IP-hash, ์ต์ ์ฐ๊ฒฐ(least-connection), ์ต์ ์๋ต ์๊ฐ(least-time) ๋ฑ์ ์ฌ์ฉํ ์ ์๊ณ , ๊ธฐ๋ณธ๊ฐ์ weighted-Round-Robin ๋ฐฉ์์
๋๋ค. ์ ํฌ ํ๋ก์ ํธ์์๋ ๊ฐ์ค์น๊ฐ ๋ชจ๋ ๊ฐ์ Round-Robin ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ๋ก ํ์๊ณ , ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
โข
๋ฌด์ค๋จ ๋ฐฐํฌ์ ์นด๋๋ฆฌ์ ๋ฐฉ์์ ์ฌ์ฉํ์ง ์์ ๊ตณ์ด ์ฌ์ฉ์๊ฐ ๋์ผํ WAS ๋ฅผ ์ด์ฉํ ํ์๋ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
โข
WAS ์๋ฒ์ ์์ ์ํ๋ ๋์ผํ๊ณ API ๋ง๋ค์ ์๋ต ์๋์ ์ฐจ์ด๊ฐ ๊ทน๋ช
ํ์ง ์๊ธฐ์ ์๋ฒ๋ง๋ค ๊ท ๋ฑํ๊ฒ ์์ฒญ๋ฐ๋ ๋ฐฉ์์ด ์ ์ ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
์ค์ ํ ์ ์๋ ์ต์
์ ๋ค์ํ๋ฐ, max_fails ์ fail_timeout ์ ์ค์ ํด ์ฃผ์์ต๋๋ค. ๋ชฉ๋ก์ ๋ฃ์ 4๊ฐ์ ์๋ฒ ์ค ๋ธ๋ฃจ/๊ทธ๋ฆฐ ๋ฐฐํฌ ๋ฐฉ์์ผ๋ก ์ธํด 2๊ฐ๋ ํญ์ ์๋ฒ๊ฐ ์ข
๋ฃ๋์ด์๋ ์ํ์
๋๋ค. ์ด ๋ nginx ์์ ์ข
๋ฃ๋์ด์๋ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ธ ๋ค ์๋ต์ด ์์ผ๋ฉด ๋ค์ ์๋ฒ๋ก ํด๋น ์์ฒญ์ ๋ฐ๋ก ๋ณด๋
๋๋ค. ์ด๋ฌํ ๋ฐฉ์์ด ๊ณ์๋๋ฉด 100๊ฐ์ ์์ฒญ ์ค 50๊ฐ๋ ํญ์ ์ข
๋ฃ๋์ด์๋ ์๋ฒ๋ก ์์ฒญ์ด ํ ๋ฒ์ฉ์ ์ ๋ฌ๋๊ธฐ๋๋ฌธ์ ๋นํจ์จ์ ์ด๋ผ๊ณ ํ๋จํ๊ณ , ์ค์ ํ max_fails ํ์๋ฅผ ๋์ ์ fail_timeout ๋งํผ ํด๋น ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ด์ง ์๋๋ค๋ ์ค์ ์ ํด์ฃผ์์ต๋๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ฐฐํฌ๊ฐ ์งํ๋์ด ์ด์์ค์ธ ํฌํธ๊ฐ ๋ฐ๋์์ ๋, 100์ด์ ์๊ฐ์ ํ์ด ๊ฑธ๋ ค์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์ด๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
C ์์ ์ดํ 97์ด ๋์์ 4๊ฐ์ ์๋ฒ ๋ชจ๋ ์ ๋ฐฐ ์ค์ธ ์ํฉ์
๋๋ค. ์ด์ ๋ฐ๋ผ WAS ๋ 8080 ํฌํธ์์ ์คํ๋๊ณ ์๋๋ฐ, 100 ์ด๋์ ์๋ฌด ์๋ต๋ ํ ์ ์๋ ์ํ์ ๋น ์ง๋๋ค. ๊ทธ๋ ๋ค๊ณ fail_timeout ์๊ฐ์ ์ค์ด๋ฉด, ์์ ์ธ๊ธํ๋๋ก ๋ธ๋ฃจ ์๋ฒ๋ก ์์ฒญํ๋ ๋น๋๊ฐ ๋์ด๋๊ฒ ๋ฉ๋๋ค.
์ด์ ๋ฐ๋ผ ๋ฐฐํฌํ ๋๋ง๋ค ์๋ฒ ๋ชฉ๋ก์ ์๋ก์ด ๋ฒ์ ์ด ์คํ๋ ์๋ฒ๋ค์ ๋์ ์ผ๋ก ํ ๋นํ๊ธฐ๋ก ํ์์ต๋๋ค.
http {
upstream morak {
server ${service_url_1};
server ${service_url_2};
}
}
Bash
๋ณต์ฌ
ํ์ง๋ง ์ฌ๊ธฐ์ ๋ ์์์น ๋ชปํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์์ต๋๋ค. nginx ๋ฅผ reload ํ ๋ ${service_url_1} ๊ณผ ๊ฐ์ด ์ธ์คํด์ค์ ์ ์ญ ๋ณ์๋ฅผ ์ด์ฉํ์ฌ ํ ๋นํ๊ณ ์ ํ๋๋ฐ, ํด๋น ๋ณ์๋ฅผ ์ฝ์ง ๋ชปํ๋ ๊ฒ์ด์์ต๋๋ค.
nginx: [emerg] unknown directive "service_url_1" in /etc/nginx/nginx.conf
Bash
๋ณต์ฌ
์ฐพ์๋ณด๋ nginx ์์๋ ๋๋ถ๋ถ์ ๋ธ๋ก ๋ด์์ ํ๊ฒฝ ๋ณ์ ์ฌ์ฉ์ ์ง์ํ์ง ์๋๋ค๊ณ ํฉ๋๋ค. ์ด์ ๋ฐ๋ผ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ์๊ฐํด ๋ณด์์ต๋๋ค.
โข
์๋ฒ ๋ชฉ๋ก์ผ๋ก ๊ฐ๊ฐ 8080, 8081 ์ด ์๋ ํ์ผ ๋ ๊ฐ๋ฅผ ๋ง๋ค์ด jenkins ์์ ๋ณด๋ด์ค๊น?
โฆ
๋ง์ฝ ํฌํธ์ ์์๊ฐ ๋ง์ง ์๊ฑฐ๋, ์๋ฒ ์๋ฌ๋ก ์์๊ฐ ์ํค๋ฉด ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค. ํ๋์ฝ๋ฉ์ ๋ฌธ์ ์ ์ด ๊ทธ๋๋ก ๋๋ฌ๋๊ฒ ๋ฉ๋๋ค.
โข
๊ทธ๋ฆฐ ์๋ฒ์ ๋ชฉ๋ก์ jenkins ์์ ์๊ณ ์์ผ๋๊น ํด๋น ๋ถ๋ถ๋ง ๋์ ์ผ๋ก ๋ฐ๊พธ๊ณ , ๊ธฐ์กด์ nginx.conf ํ์ผ์ ์ถ๋ ฅํ๊ณ ์
๋ ฅํ์ฌ ๋ถ์ฌ๋ณผ๊น?
โฆ
๋์ ์ผ๋ก ํ ๋น์ด ๊ฐ๋ฅํ๊ธด ํ์ง๋ง, ํด๋น ๋ถ๋ถ๋ง ๋ฐ๊พธ์ด ์ฃผ๋ฉด ๋๋๋ฐ ๋ค๋ฅธ ๋ชจ๋ ๋ถ๋ถ๊น์ง ์ง์ ์ถ๋ ฅํ๋ ๋ก์ง์ ์ง์ผ ๋๊ธฐ๋๋ฌธ์ ๋ณด๋ฅํ์์ต๋๋ค.
์ด๋ฐ ์๊ฐ๋ค์ ํ๋ค๊ฐ envsubst ๋ผ๋ ๋ฆฌ๋
์ค ๋ช
๋ น์ด๋ฅผ ์๊ฒ ๋์์ต๋๋ค. envsubst ๋ ์ง์ ํ ํ์ผ์ ํ๊ฒฝ๋ณ์๋ฅผ ๋์
ํ์ฌ ์ถ๋ ฅํ๋ ๋ช
๋ น์ด์
๋๋ค. upstream ์ ์๋ฒ ๋ชฉ๋ก๋ง ํ๊ฒฝ ๋ณ์ ํฌ๋งท์ผ๋ก ํํ๋ ํ
ํ๋ฆฟ ํ์ผ์ ๋ง๋ค๊ณ , ๊ทธ๋ฆฐ ์๋ฒ ๋ชฉ๋ก์ ํ๊ฒฝ ๋ณ์๋ก ๋ฑ๋กํ ๋ค envsubst ๋ช
๋ น์ด๋ฅผ ์คํ์์ผ ํ๊ฒฝ ๋ณ์๋ฅผ ๋ฑ๋กํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ๋ก ํ์์ต๋๋ค.
๋ฌธ์ ๋ฐ์์ ๋์ด ์์ต๋๋ค.. ๊ฑฐ์ ๋ค ์จ๊ฑฐ๊ฐ์๋ฐ ๋ง์ง๋ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ์์ต๋๋ค. nginx ์ ์ค์ ํ์ผ์๋ nginx ์์ ์ฌ์ฉํ๋ ํ๊ฒฝ ๋ณ์๊ฐ ์์ต๋๋ค. ๋ํ์ ์ผ๋ก location ๋ธ๋ก ๋ด๋ถ์ proxy_set_header X-Real-IP $remote_addr;๊ฐ ์์ต๋๋ค. envsubst ์์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฐพ์ ๋ $ ๋ฅผ ๋ณด๊ณ ์ฐพ๋๋ฐ, ํด๋น nginx ๊ฐ ์ด์ฉํ๋ ํ๊ฒฝ ๋ณ์๊น์ง ๋ชจ๋ ์นํํด๋ฒ๋ฆฌ๊ธฐ๋๋ฌธ์ ๊ฒฐ๊ณผ๋ก ๋์จ ํ์ผ์ ํด๋น ๋ถ๋ถ์ด ๋ชจ๋ ๊ณต๋ฐฑ์ผ๋ก ์นํ๋์ด ์์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด $ ๋ฅผ $๋ก ์นํํ ์ ์๋๋ก ๋ฐฉ๋ฒ์ ์๊ฐํ๊ณ ๊ธฐ์กด์ nginx ๊ฐ ์ฌ์ฉํ๋ ํ๊ฒฝ ๋ณ์๋ proxy_set_header X-Real-IP ${dollar}remote_addr; ๋ก ๋ฐ๊ฟ์ฃผ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ${dollar} ๋ ํ๊ฒฝ ๋ณ์๋ก ๋ฑ๋กํ์ฌ dollar ๋ $๋ก ๋ฐ๋๋๋ก ์ค์ ํ์์ต๋๋ค.
โข
์ต์ข
nginx ์ค์ ํ์ผ
http {
upstream morak {
server ${service_url_1};
server ${service_url_2};
}
server {
server_name mo-rak.com www.mo-rak.com;
location /api {
proxy_pass http://morak;
proxy_set_header X-Real-IP ${dollar}remote_addr;
proxy_set_header X-Forwarded-For ${dollar}proxy_add_x_forwarded_for;
proxy_set_header Host ${dollar}http_host;
}
}
}
Bash
๋ณต์ฌ
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฆฐ ์๋ฒ์ dollar ๋ฅผ ํ๊ฒฝ ๋ณ์๋ก ๋ฑ๋กํ๊ณ envsubst ๋ช
๋ น์ด๋ฅผ ์ํํ ์คํฌ๋ฆฝํธ๋ฅผ jenkins ์์ ์คํ์์ผ ์ฃผ๋๋ก ํ์์ต๋๋ค.
โข
route ์คํฌ๋ฆฝํธ
rm nginx.env
echo "export service_url_1=\"$1\"" >> nginx.env
echo "export service_url_2=\"$2\"" >> nginx.env
echo "export dollar=\"\$\"" >> nginx.env
source nginx.env
envsubst < /etc/nginx/nginx-template.conf | sudo tee /etc/nginx/nginx.conf
sudo service nginx reload
Bash
๋ณต์ฌ
envsubst ๋ช
๋ น์ด๋ก ์์ ๋ฑ๋กํ ๊ทธ๋ฆฐ ์๋ฒ์ ๋ชฉ๋ก์ ์นํํ์ฌ ์ถ๋ ฅํ๊ณ ์ด๋ฅผ tee ๋ช
๋ น์ด๋ก ๊ธฐ์กด์ nginx.conf ํ์ผ์ ๋ฎ์ด์ฐ๋๋ก ๊ตฌ์ฑํ์์ต๋๋ค.