MSA ํธ๋ ์ด๋ ์ผํฐ
NGINX Unit Hello World!
์ด ํธ๋ ์ด๋ ์์์์๋ย NGINX Unit ๊ตฌ์ฑ API๋ฅผ ์ฌ์ฉํ์ฌ ์ฒซ ๋ฒ์งธ “Hello World” ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
NGINX Unit์ ๋ฒ์ฉ ์น ์ฑ ์๋ฒ๋ก ์ํฐํ๋ผ์ด์ฆ๊ธ ๋ฐฐํฌ์์ ์ ์ ๋๋ฌผ์ ํํ์ด์ง์ ์ด๋ฅด๊ธฐ๊น์ง ๋ณต์ก์ฑ์ ๊ด๊ณ์์ด ๋ชจ๋ ์น ์ํคํ ์ฒ์ ๋น๋ฉ ๋ธ๋ก์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ๋ ๊ฑฐ์ ๋ฐ ๋ชจ๋๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋ํํ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ต์ ๋ง์ดํฌ๋ก์๋น์ค ํ๊ฒฝ์ ๋จ์ํํ๋ ๋ฐ์๋ ์ ํฉํฉ๋๋ค.
NGINX Unit์ ๋ชจ๋ ๊ธฐ๋ฅ, ์ค์น ๋ฐฉ๋ฒ, ๊ตฌ์ฑ API ํ์, ์ฒซ ๋ฒ์งธ “Hello World” ์์ฑ, ์น ์๋ฒ ๊ตฌ์ฑ, Unit ์ธ์ด ๋ชจ๋ ์๊ฐ ๋ฑ์ ๋ค๋ฃจ๋ ์ ์ฒด ๊ณผ์ ์ ๊ฐ๋ฐํ์ต๋๋ค.
NGINX Unit ๊ตฌ์ฑ API๋ฅผ ์ฌ์ฉํ์ฌ ์ฒซ ๋ฒ์งธ "Hello World" ํ๋ก๊ทธ๋จ ์์ฑ
NGINX Unit์ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ก, ๋ค์ค ์ธ์ด ์ง์, RESTful ๊ตฌ์ฑ API, ๊ทธ๋ฆฌ๊ณ ๊ณ ์ฑ๋ฅ์ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ํจ์จ์ ์ผ๋ก ๋ฐฐํฌํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์ด ๊ฐ์ด๋์์๋ NGINX Unit์ ๊ตฌ์ฑ API๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ “Hello World” ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ๊ณ ์คํํ๋ ๋ฐฉ๋ฒ์ ๋จ๊ณ๋ณ๋ก ์์ธํ ์ค๋ช ํ๊ฒ ์ต๋๋ค. Python์ ํ์ฉํ ์์ ๋ฅผ ์ค์ฌ์ผ๋ก ์งํํ๋ฉฐ, NGINX Unit ์ค์ ๊ณผ ํ ์คํธ ๊ณผ์ ๊น์ง ํฌํจ๋์ด ์์ต๋๋ค.
ํ๊ฒฝ ์ค๋น
ํ์ ๊ตฌ์ฑ ์์
์ฒซ ๋ฒ์งธ๋ก, NGINX Unit ํ๊ฒฝ์ ๊ตฌ์ถํ๊ธฐ ์ํด ํ์ํ ํ์ ๊ตฌ์ฑ ์์๋ค์ ํ์ธํด์ผ ํฉ๋๋ค. ์ด ๊ฐ์ด๋์์๋ Python์ผ๋ก ์์ฑ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ธฐ ๋๋ฌธ์, Python ๋ฐํ์๊ณผ NGINX Unit์ Python ์ง์ ๋ชจ๋์ด ํ์ํฉ๋๋ค.
- NGINX Unit ์ค์น: ์ต์ ๋ฒ์ ์ NGINX Unit์ด ์์คํ ์ ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค. NGINX Unit ๊ณต์ ์ค์น ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์ฌ ์ค์น๋ฅผ ์๋ฃํ์ธ์.
- Python 3 ๋ฐํ์: Python 3.7 ์ด์์ด ์ค์น๋์ด ์์ด์ผ ํ๋ฉฐ, ์ด ๊ฐ์ด๋์์๋ Flask ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ํ์ํ ํจํค์ง๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค.
- HTTP ํด๋ผ์ด์ธํธ ๋๊ตฌ: ํ
์คํธ๋ฅผ ์ํด
curl์ด๋ Postman๊ณผ ๊ฐ์ HTTP ํด๋ผ์ด์ธํธ ๋๊ตฌ๋ฅผ ์ค๋นํ์ธ์.
Python ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ
๋จผ์ , ๊ฐ๋จํ Python ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ์ฌ “Hello World” ๋ฉ์์ง๋ฅผ ๋ฐํํ๋ ๊ธฐ๋ณธ์ ์ธ ๋์์ ๊ตฌํํฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ํ์ผ ์์ฑ
์ํ๋ ๋๋ ํ ๋ฆฌ์์ hello.py๋ผ๋ ํ์ผ์ ์์ฑํ ๋ค, ๋ค์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ์ด ์ฝ๋๋ Flask ํ๋ ์์ํฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋์์ผ๋ฉฐ, HTTP GET ์์ฒญ์ ์๋ตํ์ฌ “Hello, World!” ๋ฉ์์ง๋ฅผ ๋ฐํํฉ๋๋ค.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, World!", 200
Flask ์ค์น
Flask๋ Python์์ ๊ฐ๋จํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐํ ์ ์๋๋ก ์ง์ํ๋ ํ๋ ์์ํฌ์ ๋๋ค. ์ด๋ฅผ ์ค์นํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ ์คํํ์ธ์
pip install flask
์ด ๋ช ๋ น์ Flask ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๋ฉฐ, ์ดํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ์ ์๋๋ก ํ๊ฒฝ์ ์ค์ ํฉ๋๋ค.
NGINX Unit ๊ตฌ์ฑ
NGINX Unit์ RESTful API๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์ ์ผ๋ก ๊ตฌ์ฑํ ์ ์๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. Python ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ค๋ฉด NGINX Unit์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ผ์ฐํธ ์ค์ ์ JSON ํ์์ผ๋ก ์ ๋ฌํด์ผ ํฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ฑ
์ ํ๋ฆฌ์ผ์ด์
์ NGINX Unit์ ๋ฑ๋กํ๋ ค๋ฉด, curl ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ Unit์ ๊ตฌ์ฑ API๋ฅผ ํธ์ถํฉ๋๋ค. ์๋ ๋ช
๋ น์ Python ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
curl -X PUT --unix-socket /var/run/control.unit.sock \
-d '{
"type": "python",
"path": "'$(pwd)'",
"module": "hello"
}' http://localhost/config/applications/hello
- type: ์คํํ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ํ์ ์ ์ํฉ๋๋ค. ์ด ์์ ์์๋ Python์ ์ฌ์ฉํ๋ฏ๋ก
python์ผ๋ก ์ง์ ํฉ๋๋ค. - path: ์ ํ๋ฆฌ์ผ์ด์
ํ์ผ(
hello.py)์ด ์ ์ฅ๋ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ์ง์ ํฉ๋๋ค. ํ์ฌ ๋๋ ํ ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก$(pwd)๋ฅผ ์ฌ์ฉํ์ต๋๋ค. - module: Python ๋ชจ๋ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ํ์ผ ์ด๋ฆ์์
.py๋ฅผ ์ ์ธํhello๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ผ์ฐํธ ์ค์
NGINX Unit์ด ํน์ ํฌํธ์์ ๋ค์ด์ค๋ ์์ฒญ์ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ ๋ฌํ ์ ์๋๋ก ๋ผ์ฐํธ๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด ์๋ ๋ช ๋ น์ ์คํํฉ๋๋ค
curl -X PUT --unix-socket /var/run/control.unit.sock \
-d '{
"listeners": {
"*:8080": {
"pass": "applications/hello"
}
}
}' http://localhost/config
- listeners: NGINX Unit์ด ์์ฒญ์ ์์ ํ ํฌํธ๋ฅผ ์ง์ ํฉ๋๋ค. ์ ์์ ์์๋
8080ํฌํธ๋ฅผ ์ฌ์ฉํ์ต๋๋ค. - pass: ์์ฒญ์ ์ ๋ฌํ ์ ํ๋ฆฌ์ผ์ด์
์ ์ง์ ํฉ๋๋ค. ์ฌ๊ธฐ์๋
applications/hello๋ก ์ค์ ๋์์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ํ ์คํธ
NGINX Unit์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ผ์ฐํธ ๊ตฌ์ฑ์ด ์๋ฃ๋์์ผ๋ฏ๋ก, ์ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ๋๋ก ๋์ํ๋์ง ํ ์คํธํ ์ฐจ๋ก์ ๋๋ค. ์ด๋ฅผ ์ํด HTTP ํด๋ผ์ด์ธํธ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ํ ํฌํธ๋ก ์์ฒญ์ ์ ์กํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์์ ํ ์คํธ
๋ธ๋ผ์ฐ์ ์์ http://localhost:8080 URL์ ์ ์ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ์๋ต์ ํ์ธํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ํ๋ฉด์ Hello, World! ๋ฉ์์ง๊ฐ ํ์๋๋ฉด ์ฑ๊ณต์ ์ผ๋ก ๋์ํ๋ ๊ฒ์
๋๋ค.
curl ๋ก ํ ์คํธ
๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด ์๋ต์ ํ์ธํ๋ ค๋ฉด ์๋ ๋ช ๋ น ์คํํฉ๋๋ค.
curl http://localhost:8080
์ฑ๊ณต์ ์ธ ์๋ต์ด ๋ฐํ๋๋ฉด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
Hello, World!
๊ตฌ์ฑ ํ์ธ ๋ฐ ๊ด๋ฆฌ
์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ๋ผ์ฐํธ ๊ตฌ์ฑ์ ํฌํจํ NGINX Unit์ ์ ์ฒด ์ค์ ์ํ๋ฅผ ํ์ธํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ ์คํํฉ๋๋ค.
curl --unix-socket /var/run/control.unit.sock http://localhost/config/
์ด ๋ช ๋ น์ ํ์ฌ NGINX Unit์ ์ค์ ๋ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ , ๋ผ์ฐํธ, ๋ฆฌ์ค๋ ์ ๋ณด๋ฅผ JSON ํ์์ผ๋ก ์ถ๋ ฅํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ค์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉ๋์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
๋ฌธ์ ํด๊ฒฐ
Unit ์๋น์ค ์ํ ํ์ธ
NGINX Unit ์๋น์ค๊ฐ ์ ๋๋ก ์คํ๋๊ณ ์๋์ง ํ์ธํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํฉ๋๋ค.
systemctl status unit
์๋น์ค๊ฐ ํ์ฑ ์ํ๊ฐ ์๋ ๊ฒฝ์ฐ, ์ฌ์์์ ์๋ํ์ธ์.
systemctl restart unit
๋ก๊ทธ ๋ถ์
NGINX Unit ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ด๋ จ ์ค๋ฅ๋ฅผ ๋๋ฒ๊น ํ๋ ค๋ฉด ๋ก๊ทธ๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์ ์ฉํฉ๋๋ค. ์์คํ ๋ก๊ทธ๋ฅผ ํ์ธํ๋ ค๋ฉด ์๋ ๋ช ๋ น์ ์คํํ์ธ์.
journalctl -u unit
ํ์ฅ ๋ฐ ๋ค์ ๋จ๊ณ
๋ค๋ฅธ ์ธ์ด๋ก ํ์ฅ
NGINX Unit์ Python๋ฟ๋ง ์๋๋ผ Node.js, PHP, Go, Java ๋ฑ ๋ค์ํ ์ธ์ด๋ฅผ ์ง์ํฉ๋๋ค. ์ํ๋ ์ธ์ด๋ก “Hello World” ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ์ฌ ์คํํด ๋ณด์ธ์.
HTTPS ์ค์
์ ํ๋ฆฌ์ผ์ด์ ๋ณด์์ ๊ฐํํ๊ธฐ ์ํด SSL ์ธ์ฆ์๋ฅผ ์ถ๊ฐํ์ฌ HTTPS ํธ๋ํฝ์ ์ฒ๋ฆฌํ๋๋ก ์ค์ ํ ์ ์์ต๋๋ค.
๋ก๋ ๋ฐธ๋ฐ์ฑ ๋ฐ ์ค์ผ์ผ๋ง
NGINX Unit์ ์ ์ฐํ ์ค์ ์ ํ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ธ์คํด์ค๋ฅผ ํ์ฅํ๊ณ , ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ํตํด ๋์ ํธ๋ํฝ๋ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
NGINX Unit ๊ตฌ์ฑ API ๊ฒฐ๋ก
์ด ๊ฐ์ด๋๋ฅผ ํตํด NGINX Unit์ ๊ตฌ์ฑ API๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ “Hello World” ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ๊ณ ์คํํ๋ ๊ณผ์ ์ ํ์ตํ์ต๋๋ค. Unit์ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ํ์ฅํ๊ณ , ์์ ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ด์ ํ๊ฒฝ์ ๊ตฌ์ถํด ๋ณด์ธ์!
NGINX Unit ์ ์์ํ๋ ค๋ฉด NGINX Unit ์ ๊ณต์ Docs ๋ฅผ ํ์ธํ๊ฑฐ๋ NGINX STORE์ ๋ฌธ์ํ์ฌ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ์๋ด ๋ฐ์๋ณด์ธ์.