[Infra] Nginx 설정
Nginx 란?
💡 오픈 소스 웹 서버 소프트웨어로, Apache와 같이 웹서버로 클라이언트 요청에 맞는 정적 파일을 응답해주는 Web Server 또는 요청을 다른 서버로 전달하는 리버스 프록시 역할을 수행
특징
- 높은 성능: 비동기 처리 및 이벤트 기반 아키텍처로 인해 높은 동시 연결 처리 가능
- 가벼움 및 저용량 리소스 사용: 메모리 사용이 적음
- 리버스 프록시 지원: 클라이언트 요청을 여러 서버로 분산
- 정적 파일 및 동적 콘텐츠 서빙: 정적 파일을 빠르게 서빙하며, 필요시 백엔드 서버로 부터 동적 콘텐츠를 가져옴
- SSL/TLS 지원: 안전한 통신을 위해 SSL/TLS 프로토콜 지원(HTTP -> HTTPS)
Nginx 설치
- nginx-proxy: Docker를 사용하여 nginx 리버스 프록시를 실행하는데 사용
- letsencrypt: SSL 인증서 발급
- 두 이미지를 받을 nginx frontend 서버가 필요
- 단, 모두 같은 네트워크로 묶여야함
version: '3'
services:
nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- ./docker_volumes/nginx/certs:/etc/nginx/certs:rw
- ./docker_volumes/nginx/html:/usr/share/nginx/html:rw
- ./docker_volumes/nginx/vhost.d:/etc/nginx/vhost.d:rw
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
- infra
environment:
- TZ=Asia/Seoul
letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
container_name: letsencrypt
environment:
- TZ=Asia/Seoul
- NGINX_PROXY_CONTAINER=nginx-proxy
depends_on:
- nginx-proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./docker_volumes/nginx/certs:/etc/nginx/certs:rw
- ./docker_volumes/nginx/vhost.d:/etc/nginx/vhost.d:rw
- ./docker_volumes/nginx/html:/usr/share/nginx/html:rw
- ./docker_volumes/acme.sh:/etc/acme.sh
networks:
- infra
volumes:
certs:
driver: local
driver_opts:
type: none
device: $PWD/docker_volumes/nginx/certs
o: bind
vhostd:
driver: local
driver_opts:
type: none
device: $PWD/docker_volumes/nginx/vhost.d
o: bind
html:
driver: local
driver_opts:
type: none
device: $PWD/docker_volumes/nginx/html
o: bind
FrontEnd
- LETSENCRYPT_HOST에 URL을 넣으면 위의 letsecrypt 컨테이너가 SSL 인증서를 발급함
version: '3'
services:
frontend:
image: ss0510s/a303-frontend
container_name: a303-frontend-dev
networks:
- infra
ports:
- "3000:80"
environment:
- VIRTUAL_HOST=${HOST}
- LETSENCRYPT_HOST=${HOST}
- LETSENCRYPT_EMAIL=${EMAIL}
networks:
infra:
external: true
- 잘 발급받았는지 확인하려면 아래 명령어로 로그 확인
docker-container logs letsencrypt
Nginx 설정
- 경로 ./docker_volumes/nginx/vhost.d/[인증서 받을 사이트]
location ^~ /.well-known/acme-challenge/ {
auth_basic off;
auth_request off;
allow all;
root /usr/share/nginx/html;
try_files $uri =404;
break;
}
## End of configuration add by letsencrypt container
location /api/ {
proxy_pass http://{container이름}:{port번호};
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
- 아래와 같은 명령어로 relaod 하면 설정이 반영됨
$ docker exec -it nginx-proxy nginx -s reload