728x90
λ°μν
20μ₯ 리λ²μ€ νλ‘μλ₯Ό μ΄μ©ν΄ 컨ν μ΄λ HTTP νΈλν½ μ μ΄νκΈ°
20.1 리λ²μ€ νλ‘μλ?
- μ¬λ¬ μΉ μ ν리μΌμ΄μ μΌλ‘ ν΅νλ κ΄λ¬Έ μν μ μν.
- 리λ²μ€ νλ‘μλ ν¬νΈλ₯Ό μΈλΆλ‘ 곡κ°ν μ μΌν 컨ν μ΄λ μ΄λ€.
- μΈλΆμμ λ€μ΄μ€λ λͺ¨λ νΈλν½μ λ¨Όμ 리λ²μ€ νλ‘μλ₯Ό κ±°μΉλ―λ‘ μ ν리μΌμ΄μ ν¬νΈλ₯Ό μΈλΆλ‘ 곡κ°νμ§ μμλ λλ€.
- μ ν리μΌμ΄μ μ΄ μλ΅ λ΄μ©μ μΊμν΄ λμλ€κ° μ μ νκ² κ°κ³΅ν΄μ ν΄λΌμ΄μΈνΈμκ² μ λ¬.
- μ€μΌμΌλ§, μ λ°μ΄νΈ 보μ λ©΄μμ μ 리.
- 리λ²μ€ νλ‘μλ₯Ό κ²½λ 컨ν μ΄λλ‘ μ€ννκ² λλ©΄μ λͺ¨λ νκ²½μμ λμΌν νλ‘μ μ€μ μ μ¬μ©ν μ μλ€.
Nginx νλ‘μ μ€μ νκΈ°
- Nginx κ° λ¨μν μμ²μ μ λ¬νλ 맀κ°μ μν μ νλ€.
- μμ²μ λ°μ λλ§λ€ μ΄λ₯Ό μ²λ¦¬νλ 컨ν μ΄λ(upstream) μ νΈμΆνλ€.
- μλ΅μ λ€μ ν΄λΌμΈμ΄νΈ (downstream) λ‘ μ λ¬νλ€.
server {
server_name whoami.local; # λλ©μΈ
location / {
proxy_pass <http://whoami>; # μ½ν
μΈ μ£Όμ
proxy_set_header Host $host; # νΈμ€νΈ μ 보λ₯Ό μ½ν
μΈ μμΉλ‘ μ€μ
add_header X-Host $hostname; # μλ΅μ νΈμ€νΈ μ 보λ₯Ό νλ‘μ μ΄λ¦μΌλ‘ λ³κ²½
}
}
- 리λ²μ€ νλ‘μλ HTTP λ‘ μ 곡λλ μ½ν μΈ λΌλ©΄ 무μμ΄λ μ¬μ© κ°λ₯νλ€.
- Nginx λ λ¨μν μμ²μ μ λ¬νλ 맀κ°μ μν μ΄λ€.
- λͺ¨λ μ ν리μΌμ΄μ νΈλν½μ΄ νλ‘μλ₯Ό κ²½μ νλ―λ‘ μ€μ μ μ€μ¬ μν μ ν μ μλ€.
- λν, μΈνλΌ μ€νΈλμ³ μμ€μ μ¬νμ μ ν리μΌμ΄μ 컨ν μ΄λμ λΆλ¦¬ν μ μλ€.
20.2 리λ²μ€ νλ‘μμ λΌμ°ν κ³Ό SSL μ μ©νκΈ°
Nginx λ₯Ό μ΄μ©νμ¬ λ¦¬λ²μ€ νλ‘μ μ μ©νκΈ°
- Nginx λ μ μ€νΈλ¦Ό 컨ν μ΄λκ° μ¬λ¬κ° μ‘΄μ¬νλ€λ©΄ μ΄λ€ κ°μ λ‘λλ°Έλ°μ± μ²λ¦¬κ° κ°λ₯νλ€.
$ echo $'\\n127.0.0.1 image-gallery.local' | sudo tee -a /etc/hosts
$ docker compose -f ./image-gallery/docker-compose.yml up -d --scale image-gallery=3
$ ./nginx/sites-available/image-gallery.local ./nginx/sites-enabled/
$ docker compose -f ./nginx/docker-compose.yml restart nginx
$ curl -i --head <http://image-gallery.local>
$ vi ./nginx/conf/conf.d/default.conf
server {
server_name image-gallery.local;
location / {
proxy_pass <http://image-gallery>;
proxy_set_header Host $host;
add_header X-Proxy $hostname;
add_header X-Upstream $upstream_addr;
}
}
- X-Upstream νλͺ©μ Nginx κ° μλ΅μ λ°μ μ¨ μ»¨ν μ΄λμ IP μ£Όμκ° λ΄κΈ΄ νλͺ©μ΄λ€.
- curl μ μ¬μ©ν΄ μ ν리μΌμ΄μ μ νΈμΆν κ²½μ° λ‘λλ°Έλ°μ±μ΄ μ μ©λμ΄ λ§€λ² νΈμΆλλ IP μ£Όμκ° λ³κ²½λλ κ²μ νμΈ κ°λ₯νλ€.
Nginx SSL μ μ©νκΈ°
- 리λ²μ€ νλ‘μλ₯Ό μ΄μ©νλ©΄ HTTPS λ₯Ό μ μ©ν μ μλ€.
- Nginx λ Let’s Encrypt μ κ°μ μ€μ λλ©μΈ μ κ³ μλ μλΉμ€μμ λ°κΈν μ€μ μΈμ¦μλ₯Ό μ€μ μ ν¬ν¨ν μ μλ€.
# μ체 μΈμ¦μ μμ±
$ docker container run -v "$(pwd)/nginx/certs:/certs" -e HOST_NAME=image-gallery.local diamol/cert-generator
# κΈ°μ‘΄ μ€μ νμΌ μμ¬
$ rm ./nginx/sites-enabled/image-gallery.local
# SSL μ΄ ν¬ν¨λ μ€μ νμΌ λ³΅μ¬
$ cp ./nginx/sites-available/image-gallery-3.local ./nginx/sites-enabled/image-gallery.local
# μ¬μμ
$ docker compose -f nginx/docker-compose.yml restart nginx
$ vi ./nginx/conf/conf.d/default.conf
server {
server_name image-gallery.local;
listen 80;
return 301 https://$server.name$request_uri;
}
server {
server_name image-gallery.local;
listen 443 ssl;
ssl_certificate /etc/nginx/certs/server-cert.pem;
ssl_certificate_key /etc/nginx/certs/server-key.pem;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 20m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
add_header Strict-Transport-Security "max-age=31536000" always;
location /api/image {
proxy_pass <http://iotd/image>;
proxy_set_header Host $host;
add_header X-Proxy $hostname;
add_header X-Upstream $upstream_addr;
}
location / {
proxy_pass <http://image-gallery>;
proxy_set_header Host $host;
add_header X-Proxdy $hostname;
add_header X-Upstream $upstream_addr;
}
}
- μΈμ¦μμ ν€ νμΌ μμ νλμ λλ©μΈμμλ§ μ ν¨νλ―λ‘, μ ν리μΌμ΄μ νλλ§λ€ μΈμ¦μμ ν€ νμΌ μΈνΈκ° νμνλ€.
- μΈμ¦μμ ν€ νμΌμ λ―Όκ° μ λ³΄λ‘ λΉλ°κ° ννλ‘ ν΄λ¬μ€ν°μ μ μ₯λλ€.
- HTTPS λ₯Ό μ μ©νμ§ μμΌλ©΄, μ ν리μΌμ΄μ 컨ν μ΄λ μ€μ κ³Ό μΈμ¦μ κ΄λ¦¬ λΆλ΄μ΄ μ€μ΄λ€λ©°, κ°λ°μλ λ¨μ HTTP λ²μ μΌλ‘ ν μ€νΈλ₯Ό μ§νν μ μλ€.
20.3 νλ‘μλ₯Ό μ΄μ©ν μ±λ₯ λ° μ λ’°μ± κ°μ
- Nginx λ κ³ μ±λ₯ HTTP μλ²λ‘ μ μ HTML μ½ν μΈ λ λ¨μΌ νμ΄μ§ μ ν리μΌμ΄μ μ μ 곡νλλ° νμ©ν μ μλ€.
- 컨ν μ΄λ νλλ§μΌλ‘λ μ΄λΉ μμ²κ±΄μ μμ²μ μ²λ¦¬ν μ μλ€.
- μ΄λ₯Ό νμ©νμ¬ Nginx λ₯Ό μΊμ± νλ‘μλ‘ μ¬μ©ν μ μλ€.
- μ ν리μΌμ΄μ μ μλ΅μ λ‘컬 λμ€ν¬λ λ©λͺ¨λ¦¬μ μ μ₯νκ³ , λμΌν μμ²μ λν΄ μ μ€νΈλ¦Ό μ½ν μΈ μ μμ²νμ§ μκ³ , μ μ₯λ κ²μ μ¬μ©νλ€.
- λ°λΌμ, μΊμ± νλ‘μλ₯Ό μ¬μ©νκ² λλ©΄ μμ² μκ°μ μ€μ΄κ³ , κ°μ μΈνλΌ μ€νΈλμ²λ‘ λ λ§μ μμ²μ μ²λ¦¬ν μ μλ€.
$ vi ./nginx/sites-available/image-gallery-4.local
server {
server_name image-gallery.local;
listen 80;
return 301 https://$server_name$request_uri;
}
server {
server_name image-gallery.local;
listen 443 ssl;
gzip on;
gzip_proxied any;
ssl_certificate /etc/nginx/certs/server-cert.pem;
ssl_certificate_key /etc/nginx/certs/server-key.pem;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 20m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
add_header Strict-Transport-Security "max-age=31536000" always;
location = /api/image {
proxy_pass <http://iotd/image>;
proxy_set_header Host $host;
proxy_cache SHORT;
proxy_cache_valid 200 1m;
add_header X-Cache $upstream_cache_status;
add_header X-Proxy $hostname;
add_header X-Upstream $upstream_addr;
}
location / {
proxy_pass <http://image-gallery>;
proxy_set_header Host $host;
proxy_cache LONG;
proxy_cache_valid 200 6h;
proxy_cache_use_stale error timeout invalid_header updating
http_500 http_502 http_503 http_504;
add_header X-Cache $upstream_cache_status;
add_header X-Proxy $hostname;
add_header X-Upstream $upstream_addr;
}
}
$ cp ./nginx/sites-available/image-gallery-4.local ./nginx/sites-enabled/image-gallery.local
$ docker compose -f ./nginx/docker-compose.yml restart nginx
- νλ‘μ μ€μ μ μ¬μ©μ μ μ μλ΅ ν€λμΈ X-Cache κ° ν¬ν¨λλ€.
- μμ²μ ν΄λΉνλ μΊμκ° μλμ§ λ¨Όμ νμΈν μ΄ν, μμ²μ μΌμΉνλ μΊμκ° μμ κ²½μ° X-Cache: MISS κ° λ°νλλ€.
- μΆκ°λ‘ X-Upstream ν€λμ μ½ν μΈ λ₯Ό μ 곡ν IP μ£Όμκ° μλ΅λλ€.
- κ°μ μμ²μ΄ μΆκ°λ‘ λ€μ΄μμ κ²½μ° X-Cache: HIT κ³Ό ν¨κ» μλ΅λλ©°, X-Upstream ν€λλ λ€μ΄μ€μ§ μλλ€.
- proxy_cache_use_stale λ Upstream μ μ¬μ©νμ§ λͺ»ν κ²½μ° λ§λ£λ μΊμλ₯Ό μ¬μ©νλΌλ μλ―Έμ΄λ€.
- λ§λ£λ μΊμλΌλ μ¬μ©ν¨μΌλ‘μ¨ μ»¨ν μ΄λκ° μ₯μ λ₯Ό μΌμΌμΌλ μ ν리μΌμ΄μ μ΄ μλΉμ€λ₯Ό μ 곡ν μ μλ€.
20.4 ν΄λΌμ°λ λ€μ΄ν°λΈ 리λ²μ€ νλ‘μ
- λ컀 μμ§κ³Ό μ°κ²°λ 컨ν μ΄λλ λ컀 APIλ₯Ό ν΅ν΄ λ€λ₯Έ 컨ν μ΄λμ λν μ 보λ₯Ό μ»μ μ μλ€.
- ν΄λΌμ°λ λ€μ΄ν°λΈ 리λ²μ€ νλ‘μ€ λκ΅¬μΈ νΈλν½ (Traefik) μ΄ μ΄λ° λ°©μμΌλ‘ λμνλ€.
- νΈλν½μ μ¬μ©ν κ²½μ° μ»¨ν μ΄λμ λ μ΄λΈλ§ μΆκ°νλ©΄ μ€μ€λ‘ μ€μ κ³Ό λΌμ°ν 맡μ ꡬμ±ν μ μλ€.
- νΈλν½μ μ¬μ©νλ©΄ μλμΌλ‘ 리λ²μ€ νλ‘μ κΈ°λ₯μ μ¬μ©ν μ μμ§λ§, Nginx μ λ€λ₯΄κ² μΊμ±μ ν μ μλ€.
νΈλν½ νΉμ§
- λμ μ€μ ꡬμ±
- νΈλν½μ μμν λ μ€μ νμΌμ μ½μ§ μκ³ , λ°νμ μ€μ ꡬμ±μ λ³κ²½ν μ μλ€.
- μλ Service Discovery
- μΈνλΌμ€νΈλμ²μ λν λ€ν°μ΄λΈ μ§μμ ν΅ν΄ μλ‘μ΄ μλΉμ€λ₯Ό μλμΌλ‘ κ°μ§νκ³ , νΈλν½μ ν΄λΉ μλΉμ€λ‘ λΌμ°ν νλ€.
- μ΅μ νλ‘ν μ½ μ§μ
- HTTP/2, WebSocket, GRPC λ±μ μ΅μ νλ‘ν μ½μ μ§μν¨μΌλ‘μ¨, μν ν ν΅μ μ΄ κ°λ₯νλ€.
- Let’s Encrypt λ₯Ό μ¬μ©ν HTTPS μ§μ
- Let’s Encrypt λ₯Ό μ¬μ©νμ¬ μλμΌλ‘ SSL/TLS μΈμ¦μλ₯Ό λ°κΈνκ³ κ΄λ¦¬ν μ μλ€.
νΈλν½ κ΅¬μ±
- μνΈλ¦¬ ν¬μΈνΈ
- μΈλΆμμ λ€μ΄μ€λ νΈλν½μ μ£Όμνλ ν¬νΈ.
- ν΄λΉ ν¬νΈμ 컨ν μ΄λμ κ³΅κ° ν¬νΈκ° 맀ν
- λΌμ°ν°
- μΈμ λ μμ²μ λ°°μ ν 컨ν μ΄λλ₯Ό κ²°μ νλ κ·μΉ.
- νΈμ€νΈ λͺ , κ²½λ‘ λ±μΌλ‘ ꡬμ±
- μλΉμ€
- μ€μ μ½ν μΈ λ₯Ό μ 곡νλ μ μ€νΈλ¦Ό μ»΄ν¬λνΈ
- λ―Έλ€μ¨μ΄
- λΌμ°ν° μλΉμ€ μ¬μ΄μμ μλΉμ€μ μ λ¬λλ μμ²μ λ³κ²½νλ μν
- μμ²μ ν¬ν¨λ κ²½λ‘ λλ ν€λλ₯Ό λ³κ²½νκ±°λ μΈμ¦μ κ°μ ν μ μλ€.
services:
whoami:
labels:
- "traefik.enable=true"
- "traefik.http.routers.whoami.rule=Host('whoami.local')"
μ€ν°ν€ μΈμ
- μ ν리μΌμ΄μ μ λ§λ€ λ μ΅λν λ§μ λΆλΆμ 무μνλ‘ λ§λλ κ²μ΄ μ’λ€.
- 무μνλ‘ λ§λ€λ©΄ μ무 컨ν μ΄λμμλ μμ²μ μ²λ¦¬ν μ μμΌλ―λ‘ μν ν μ₯ λ° λ‘λ λ°Έλ°μ± ν¨κ³Όλ₯Ό κ·Ήλν ν μ μλ€.
- κ·Έλ¬λ, κΈ°μ‘΄ μ ν리μΌμ΄μ μ κ²½μ° μνκ° μλ κ΅¬μ‘ μμλ₯Ό λ§μ΄ ν¬ν¨νκ³ μλ κ²½μ°κ° μλ€.
- μ΄ κ²½μ° μ€ν°ν€ μΈμ μ΄ νμνλ€.
- μ€νΈν€ μΈμ μ νμ±ννλ©΄ ν΄λΌμ΄μΈνΈμ 컨ν μ΄λλ₯Ό μλ³ν μ μλ μΏ κΈ°κ° λΆμ¬λλ―λ‘ ν΄λΉ μ¬μ©μμ μμ²μ κ³μ κ°μ 컨ν μ΄λλ‘ λΌμ°ν ν μ μλ€.
services:
whoami:
labels:
- "traefik.enable=true"
- "traefik.http.routers.whoami.rule=Host('whoami.local')"
- "traefik.http.services.whoami.loadBalancer.sticky=true"
- "traefik.http.services.whoami.loadBalancer.sticky.cookie.name=whoami_cookie"
- "traefik.http.services.whoami.loadBalancer.sticky.cookie.httpOnly=true"
20.5 리λ²μ€ νλ‘μλ₯Ό νμ©ν ν¨ν΄μ μ΄ν΄
ν ν΄λ¬μ€ν°μμ κ° λ€λ₯Έ λλ©μΈ μ΄λ¦μ κ°λ μ¬λ¬ κ°μ μ ν리μΌμ΄μ μ νΈμ€ν νλ ν¨ν΄
- 리λ²μ€ νλ‘μλ§ 80λ² ν¬νΈμ 443 ν¬νΈλ₯Ό ν΅ν΄ μΈλΆλ‘ λ ΈμΆνλ€.
- κ·Έ μΈμ 컨ν μ΄λλ λͺ¨λ μΈλΆλ‘ λ ΈμΆλμ§ μλλ€.
- λΌμ°ν κ·μΉμ ν΅ν΄ νμν 컨ν μ΄λμ λΌμ°ν νλ€.
λ§μ΄ν¬λ‘μλΉμ€ μν€νμ²μ μΌλΆ μμλ₯Ό μΈλΆλ‘ λ ΈμΆμν€λ ν¨ν΄
- 리λ²μ€ νλ‘μλ₯Ό ν΅ν΄ μΉ μ»¨ν μ΄λμ λ§μ΄ν¬λ‘μλΉμ€ μ€ μΌλΆκ° μΈλΆλ‘ λ ΈμΆλλ€.
- μνΈλ¦¬ν¬μΈνΈλ κ°μ λλ©μΈμ μ¬μ©νμ§λ§, HTTP μμ² κ²½λ‘μ λ°λΌ μμ²μ΄ λ€λ₯Έ 컨ν μ΄λλ‘ λΌμ°ν λλ€.
λͺ¨λ리μ μ€κ³λ₯Ό κ°μ§ μ ν리μΌμ΄μ μ μ μ§μ μΌλ‘ 컨ν μ΄λλ‘ μ΄μ£Όμν€κΈ°
- 리λ²μ€ νλ‘μλ₯Ό μ΄μ©ν΄ λͺ¨λ리μ μ€κ³λ₯Ό μ μ§μ μΌλ‘ λ§μ΄ν¬λ‘μλΉμ€λ‘ λΆν ν μ μλ€.
- μλ‘μ΄ κΈ°λ₯μ λ³λμ 컨ν μ΄λ ννλ‘ μΆκ°νλ©°, 리λ²μ€ νλ‘μλ₯Ό ν΅ν΄ μμ² κ²½λ‘μ λ°λΌ μ λ¬νλ€.
728x90
λ°μν