웹 - Nginx Proxy Manager

Nginx Proxy Manager

Nginx Proxy ManagerNginx를 기반으로 하는 리버스 프록시 관리 도구에요.

이를 사용하면 복잡한 Nginx 의 사용법을 모르더라도 웹 페이지에서 대부분의 설정을 관리할 수 있게 돼요. 또한 다음 가이드에서 다룰 SSL 설정도 쉽게 할 수 있다는 장점이 있어요.


도메인 설정하기

graph TB;

root-domain["루트 도메인<br>tinyrack.net"]
wildcard-domain["와일드카드 도메인<br>*.tinyrack.net"]

router["공유기<br>공인 IP"]
server["서버"]

root-domain --> router;
wildcard-domain --> router;
router --> server;

리버스 프록시를 사용하려면 먼저 루트 도메인과 와일드카드(*) 도메인에 대한 요청을 모두 동일한 내 공인 IP로 전달해야 해요. 그래야 모든 도메인 요청을 리버스 프록시 서버가 받을 수 있게 되고 정상적으로 동작할 수 있어요.

DuckDNS

DuckDNS를 사용하는 경우 별다른 설정이 필요하지 않아요. 만약 tinyrack.duckdns.org 와 같은 도메인을 사용하고 있다면 *.tinyrack.duckdns.org 형태의 도메인 요청도 자동으로 같은 IP 주소를 향하게 돼요.

Cloudflare

Cloudflare나 다른 유료 도메인 서비스를 사용하고 있는 경우, 루트 도메인과 와일드카드(*) 도메인에 대한 DNS 정보를 모두 생성해야 해요.

설정이 완료된 모습은 위와 같아요. 레코드가 두개 생성되어 있어야 한다는 점을 기억해 주세요.


공유기 설정하기

graph TB;

internet["인터넷"]

subgraph router["공유기"];
  router-80["80"];
  router-443["443"];
end;

subgraph server["서버"];
  server-80["80"];
  server-443["443"];
end;

internet --> router-80;
internet --> router-443;

router-80 --> server-80;
router-443 --> server-443;

다음은 공유기 설정에서 80번과 443번 포트를 서버로 포워딩 해주세요. 이 방법을 잘 모르겠다면 먼저 포트 포워딩 가이드를 참고해 주세요. 네트워크를 그림으로 그렸을 때 위와 같은 구조를 가져야 해요.

iptime 공유기를 사용하는 경우 설정이 완료된 모습은 위와 같아요.


설치하기

설치 이전에 aptnignx 를 설치하셨다면 다음의 명령어를 통해 반드시 제거해 주세요.

sudo apt remove nginx

만약 도커로 구동된 nginx 가 있다면 다음의 명령어를 참고해 컨테이너를 삭제해 주세요.

docker ps   # 컨테이너 이름 확인
docker stop NGINX_컨테이너_이름
docker rm NGINX_컨테이너_이름

그리고 ufw 방화벽을 사용중이라면 다음의 명령어를 통해 80, 81, 443 포트의 접속을 허용해 주세요.

sudo ufw allow 80/tcp
sudo ufw allow 81/tcp
sudo ufw allow 443/tcp

이제 Nginx Proxy Manager를 설치할 차례에요. 설치는 이전에 다뤘던 도커 컴포즈를 통해 쉽게 할 수 있어요. 원하는 곳에 docker-compose.yml 파일을 생성 후 다음을 입력해 주세요.

services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

여기서 network_mode: host 는 컨테이너가 격리된 네트워크 환경을 가지지 않고 호스트의 네트워크 환경을 그대로 사용한다는 것을 의미해요. 그래서 포트 포워딩 없이도 호스트의 포트에서 동작할 수 있게 돼요.

작성을 완료하면 다음의 명령어를 통해 컨테이너를 배포해 주세요.

docker compose up -d

이후 브라우저를 열고 http://내_도메인으로 접근해 보세요.

정상적으로 동작한다면 이와 같은 화면이 나타나요. 이번에는 연결한 다른 도메인으로도 접속을 시도해 보세요.

tinyrack.net 이라는 주소를 사용한다면 some-service.tinyrack.net 과 같은 도메인도 동일한 화면으로 접속할 수 있어야 해요. 잘 동작한다면 이제 nginx-proxy-manager가 모든 도메인에 대한 요청을 처리할 수 있다는 의미에요.

이번에는 브라우저에서 http://서버의_사설_IP:81 주소로 접속해 보세요. 81번 포트는 공유기에서 포트 포워딩 하지 않았기 때문에 사설 IP를 통해서만 접속할 수 있어요.

그러면 이번에는 nginx-proxy-manager 의 관리 화면으로 진입하게 돼요.

초기 계정의 이메일은 admin@example.com 이고 비밀번호는 changeme에요. 이를 사용해 로그인 해 주세요.

최초 로그인 시 계정 정보를 변경하라는 안내가 나타나요. 원하는 이름과 이메일 주소를 입력해 주세요.

다음은 현재 비밀번호와 변경할 비밀번호를 차례로 입력한 후 Save 버튼을 눌러 주세요.


중간 점검

graph TB;

root-domain["루트 도메인<br>tinyrack.net"]
wildcard-domain["와일드카드 도메인<br>*.tinyrack.net"]

internet["인터넷"]

subgraph router["공유기"];
  router-80["80"];
  router-443["443"];
end;

subgraph server["서버"];
  subgraph npm["Nginx Proxy Manager"];
    server-80["80<br>웹 서버"];
    server-443["443<br>웹 서버"];
    server-81["81<br>관리 페이지"];
  end;
end;

root-domain --> internet;
wildcard-domain --> internet;

internet --> router-80;
internet --> router-443;

router-80 --> server-80;
router-443 --> server-443;

지금까지 우리가 한 작업을 그림으로 그려보면 위와 같아요. 문제가 생긴 경우 현재 네트워크 구성을 그림으로 그려보며 어디에서 문제가 발생한 것인지 진단해야 해요.

관리 페이지는 공유기에서 포트 포워딩 되지 않았기 때문에 인터넷에서는 접속할 수 없는 상태에요. 보통 이러한 중요한 것들은 외부에 노출하지 않는 것이 보안상 권장돼요.


설정하기

도메인이 잘 동작한다면 이제 서비스를 연결해 볼 차례에요.

우선 할당할 서비스가 하나 필요하니 다음의 명령어를 통해 Memos 컨테이너를 실행해 주세요.

docker run \
  -d \
  --name memos \
  -p 5230:5230 \
  -v ~/.memos/:/var/opt/memos \
  neosmemo/memos:stable

그런 다음 우선 브라우저에서 http://사설_IP:5230으로 서비스에 잘 접속되는지 확인해 주세요.

잘 접속된다면 Nginx Proxy Manager의 관리 콘솔에서 Hosts - Proxy Hosts 메뉴에 들어가 주세요.

이곳에서는 Nginx로 네트워크 요청이 들어왔을 때, 어느 서버로 트래픽을 전달할 것인지 지정할 수 있어요.

오른쪽 상단의 Add Proxy Host 를 클릭해 주세요.

그리고 나온 팝업에서 다음의 사항을 참고해 입력해 주세요.

  • Domain Names: 서비스에 할당하고 싶은 도메인 주소
    • 원하는 도메인 주소를 넣어 주세요.
  • Forward Hostname / IP: 통신을 전달할 서비스의 주소
    • 127.0.0.1을 입력해 주세요.
  • Schema: 서비스가 사용하는 프로토콜
    • Memoshttp를 사용하니 이를 선택해 주세요.
  • Forward Port: 통신을 전달할 서비스의 포트
    • Memos의 포트인 5230을 넣어주세요.

여기서 127.0.0.1 이란 주소는 컴퓨터 자신의 주소를 의미해요. Nginx Proxy ManagerMemos가 한 컴퓨터에 같이 있기 때문에 자기 자신의 주소를 지정해야 해요.

입력을 완료했다면 Save 버튼을 눌러 주세요.

설정을 완료한 모습은 위와 같아요. 이제 할당한 도메인으로 접속해 보세요.

Memos 서비스로 잘 들어가 진다면 성공이에요!

축하드려요 :partying_face: 이제 서브도메인으로 마음껏 여러 서비스를 배포할 수 있게 됐어요. 사용하고 있는 다른 서비스가 있다면 같은 방법으로 서브 도메인을 할당해 보세요.