1. 시작하기 전에
보통 웹 서비스나 웹 개발을 하게되면, 해당 서비스로 접근하기 위한 페이지가 필요하다. 그렇게되면 Nginx라는 웹 서버를 사용하게 된다.
하지만 이 Nginx라는 웹 서버를 사용하는 것은 여간 귀찮은 일이 아니다. 이것 저것 config 파일도 필요하고, 어떤 서버에 요청을 보낼 지, 하나하나 다 지정해줘야한다. 이러다보면 가끔 실수로 인한 에러가 굉장히 많이 발생하게 된다. 물론, 이전 프로젝트에서 사용했던 nginx.conf를 통해서 진행해도 되지만, 까먹을 때도 있으니 새로운 방법을 알아두는 것도 좋을 것이다.
2. Nginx Proxy Manager(NPM)이란?
Nginx Proxy Manager란 말 그대로 Nginx의 Proxy를 관리해주는 도구이다.
이렇게만 보면 어떤 말인지 와닿지 않을 수도 있으니 기존의 Nginx부터 알아보자.
Nginx란 기본적으로는 정적인 파일을 호스팅하는 웹 서버이다. 또한, 사용자의 요청을 앞단부터 받아들여 해당 요청이 어떤 port로 향해야 할 지 정할 수 있다. 이를 Reverse Proxy라고 한다.
예를 들면, 80번 포트로 접근 시 3000번 포트를 사용하고 있는 Frontend의 페이지를 보여줄거라면, set $port 3000;
이런 식으로 매핑을 해줘야한다. 만약 여러개의 서비스를 관리해야 한다면, 여러 개의 nginx.conf를 사용해야 한다.
하지만, Nginx Proxy Manager를 사용한다면 GUI를 통해서 아주 간단하게 설정할 수 있다는 장점이 존재한다.
뿐만 아니라 다양한 기능들을 제공한다.
1. Let's Encryt를 통해 SSL/TLS로 HTTPS를 아주 간단하게 설정할 수 있다. 물론, 도메인이 존재해야한다.
2. Load Balancing을 설정할 수 있다.
3. Caching, Authentication을 설정할 수 있다.
2번의 Load Balancing은 아직 개발 중인 것같지만, 추후 릴리즈되는 버전에서는 아마 곧 지원할 예정이다.
3. 설치 및 실행
Nginx Proxy Manager(NPM)은 Docker를 통해서 설치하고 실행 할 수 있다.
우선 Docker를 설치해야하는데, 포스팅 목적에서 벗어나게 되므로 각자의 운영체제에 맞게 구글에 검색해서 설치하도록 하자.
## docker-compose.yml
version: "3.8"
volumes:
portainer:
driver: local
services:
portainer:
image: portainer/portainer:latest
container_name: portainer
ports:
- "9000:9000"
restart: always
volumes:
- portainer:/data
- /var/run/docker.sock:/var/run/docker.sock
networks:
- home_network
.......
networks:
home_network:
external: true
위의 docker-compose.yml을 통해서 설치함과 동시에 실행하면 된다.
docker compose up -d --build
만약, 존재하지 않는 network에 연결하려고 한다는 에러가 발생한다면
docker network create --driver bridge home_network
위의 명령어를 통해 network를 bridge모드로 설정하고 생성하자. external의 의미는 해당 네트워크가 외부의 네트워크라는 뜻이다.
정상적으로 실행이 돼었다면,
다음과 같이 정상적으로 생성되어 실행중 이라는 명령어가 있을 것이다.
4. 접속
이제 81번 port로 접근해보자.
현재 PC에 docker를 실행중이라면 localhost:81, 따로 AWS나 GCP를 사용 중이라면 해당 서버의 퍼블릭 IP의 81번 포트로 접근한다.
그러면 다음과 같은 화면이 반겨줄 것이다.
초기 이메일은 admin@example.com, 비밀번호는 changeme이다.
Sign In 이후, 이메일과 비밀번호를 변경하고나면 다음과 같은 화면을 볼 수 있다.
여기서 NPM이 생각보다 많은 기능들을 제공하고 있다는 것을 알 수 있다.
SSL Certificates에서는 Let's Encrypts를 통해서 HTTPS를 활성화 할 수 있다.
Add SSL Certificates 버튼을 클릭하게 되면,
이러한 방식으로 인증서를 관리할 수 있다. Let's Encrypt 뿐만 아니라, 다른 인증기관에서도 인증서를 발급받고 관리할 수 있다.
여기에서는 이전에 말했던 도메인이 필요하다. Test Server Reachability를 통해서 도메인이 살아있는 것을 확인한다.
여기에서 Domain 이름으로 와일드카드(*)를 사용한다면 DNS Challenge를 사용해야한다. 현재 Cloudflare를 통해서 사용중에 있다.
다시 돌아가서, Proxy Hosts로 넘어간다.
초기에 해당 화면에 진입하게 되면, 아무런 Proxy Hosts가 존재하지 않을 것이다.
Add Proxy Hosts 버튼을 통해 등록하고자 하는 Proxy를 등록하면 된다.
여기에서 Domain Names는 도메인의 서브 도메인으로 지정해야한다.
나는 *.heesang.pro로 SSL/TLS 인증서를 발급받았기 때문에, test.heesang.pro와 같은 식으로 등록을 진행했다.
Forward에는 어떤 서비스로 연결할 것인지 정한다. 주의해야할 점은 NPM은 같은 Docker Network를 사용하고 있는 서비스 이름을 DNS를 통해서 IP 주소 변환하고 연결하기 떄문에, 반드시 Proxy하려는 서비스는 NPM과 동일한 Network에 존재해야한다.
Port는 해당 서비스의 Port를 의미한다.
만약 HTTPS를 적용하고싶다면, SSL에서 인증서 기반으로 HTTPS를 활성화시켜주면 된다.
이렇게 하고 접속을 시도하면
이런식으로 웹 페이지가 호스팅되는 것을 확인할 수 있다.
정리
Nginx와 Let's Certbot을 이용해서 SSL/TLS 인증서를 받고 HTTPS를 적용하기 위해서 굉장히 많은 삽질을 했었는데, 이렇게 쉽게 적용할 수 있다는 것에 굉장히 충격을 받았었다.
이 포스팅을 보는 사람들은 이런 정보들을 통해서 더욱 쉽고 편하게 적용해서, 개발에만 집중하면 좋을 것 같다.
'Backend > Deployment' 카테고리의 다른 글
돈 안내고 서버 쓰기 (1) | 2024.02.13 |
---|---|
[Deployment] 집에서 배포해보기 (2)- 인바운드 규칙과 방화벽 설정 (0) | 2023.09.21 |
[Deployment] 집에서 배포해 보기 (1) - Network Port Forwarding (0) | 2023.09.17 |
[Deployment] Docker 내부구조 (0) | 2023.09.07 |
[Deployment] Docker 개념 (0) | 2023.09.03 |