Blog

NAS 파일서버 구축과 웹서버(Nginx)를 통한 파일 서빙

Category
Author
citeFred
citeFred
PinOnMain
1 more property
로컬 장비를 활용한 배포를 위한 준비
Table of Content

NAS 파일 스토리지를 활용하기

NAS:
역할: 대용량 스토리지로서 AWS S3의 스토리지 서비스 역할 대체
Nginx:
역할: NAS의 정적 파일을 서빙
기능: AWS S3의 정적 파일 URL 제공 역할 대체
NAS 내부 파일 서버 애플리케이션:
역할: NestJS API로 파일 시스템 전용 서버 기능: 서비스 백엔드 서버의 파일 시스템(I/O) 기능이 독립화된 별도 서비스
매개체 역할: NAS와 서비스 백엔드 서버 간의 파일 관련 매개체 역할 수행 (리버스 프록시)
서비스 백엔드 서버:
역할: NestJS 기반의 서비스 관련 API 서버
기능: 웹 애플리케이션의 기본적인 CRUD 기능 제공
데이터 저장: 파일 경로를 데이터베이스에 URL Path 형태로 저장
서비스 프론트엔드 서버:
역할: 웹 애플리케이션의 전체 뷰 페이지 렌더링 담당
기능: 백엔드 API와 통신을 통한 동적 페이지 렌더링 파일 제공: 각종 파일은 백엔드로부터 전달받는 URL Path를 통해 제공
추가 고려 사항
보안:
외부 접근: 외부 접근을 허용하는 경우, 보안 설정 중요
HTTPS: 암호화된 연결 제공 및 인증, 권한 관리 고려
성능 최적화:
Nginx 캐싱: 정적 파일의 성능 개선을 위해 Nginx의 캐싱 기능 활용
비동기 처리: NAS 내부 파일 서버 애플리케이션에서 비동기 처리 및 큐 시스템 도입으로 파일 업로드 성능 향상
모니터링 및 로깅:
로그 모니터링: 각 구성 요소의 로그를 주기적으로 모니터링하여 이슈 조기 발견 및 대응
개발 과정 중 문제 해결과 현재 상태
NAS내 SSH 포트(22) 접근 권한을 열고 외부 접속으로 터미널에 접근
FTP 및 자체 대시보드 클라이언트인 DSM으로도 접근이 가능하지만 node 기반의 커스텀된 서버 실행을 위해서는 내부 Linux OS에 접근이 필요, SSH 포트를 개방하고 접근
인터넷이 연결된 스토리지라는 점을 활용해서 github의 원격 저장소에 로컬 파일 시스템에 접근하여 읽기, 쓰기 기능 모듈 프로젝트를 git clone을 통해 삽입 및 실행
아래와 같이 간단히 업로드 경로에 파일을 업로드하는 기능을 작성
해당 경로는 NAS의 시스템 root 계정이 생성한 폴더이므로 파일 읽기, 쓰기 기능 전에 접근 권한의 문제가 발생.
폴더의 권한을 변경하여 현재 파일서버 모듈이 해당 폴더의 권한을 가지도록 변경
이제 클론 받은 프로젝트를 빌드하여 실행시키면 {NAS_localhost}:3000 포트로 컨트롤러에 설정된 각 엔드포인트의 요청을 받을 수 있는 API 서버가 실행되는 상태
이제 NAS에서는 3000번 포트가 작동하지만, 이곳에 파일 저장관련 요청을 보낼 백엔드 서버는 다른 위치에서 작동 할 수 있으므로 NAS는 외부에서 접근 가능해야 하며, 또한 특정 포트(3000 등)이 개방되어 있어야 함.
따라서, NAS가 연결되어있는 네트워크의 구성은
외부IP(인터넷) → 라우터(공유기) → NAS(192.168.0.10)으로 내부IP로 고정하여 할당한 상태
따라서 외부IP:3000 이라는 요청은 내부NAS_IP:3000 요청으로 인식 될 수 있도록 설정하면 됨
이 과정을 통신하는 외부 IP 주소와 포트 번호를 내부 호스트에 다시 매핑하는 포트포워딩을 활용해 구성 할 수 있으며 이는 이미 SSH로 외부에서 NAS 터미널에 접근하도록 구성한 것과 동일하다는 것을 인지해야 함
이 부분은 이후 nginx등 웹서버가 정적 파일(HTML뿐만이 아닌 각종 파일도 정적 서빙의 대상임)들이 모이는 어떠한 폴더를 서빙하도록 구성할 것인데 이 또한 접근 할 수 있는 특정 내부 포트를 외부IP의 포트와 매핑하면서 파일에 접근 할 수 있도록 구성 될 것임
간단하게 현재 AWS의 S3라는 스토리지 서비스에 파일을 업로드하면 해당 파일에 외부에서 접근 할 수 있는 URL을 제공받을 수 있는데, 이것을 NAS로 구현한 것이라 보면 됨.
위와 같은 배경에 따라, 현재 파일을 업로드하는 NestJS 파일서버는 3000번 포트를 리스닝하고 있기 때문에 외부 3000번 포트로 맵핑하고 개방하면 해당 파일 서버에 요청을 보낼 수 있고 파일을 NAS 내부 스토리지에 저장 할 수 있도록 처리 할 수 있음
NAS 내부의 파일서버를 실행시키고, 파일 업로드 기능이 외부에서 되는지 테스트하기 위해 POSTMAN으로 HTTP POST 요청에 영상과 같은 파일을 업로드하는 요청을 보냄
NAS 내부에서 실행중인 파일서버는 해당 요청을 컨트롤러가 응답하여 서비스를 통해 NAS 내부의 volume2/video 라는 공유폴더까지 접근하여 해당 파일을 생성함.
실제 NAS내부에 지정한 폴더에 해당 파일이 생성 되는 것을 확인 할 수 있음
이 부분에서 특정 클라이언트(서버클라이언트)만이 해당 요청을 받을 수 있도록 CORS 교차 출처에서 해당 클라이언트만 허용 할 수 있도록 추가 설정이 필요하며 보안관련 설정을 추가해나갈 필요가 있음.
NAS 자체는 다양한 방식으로 파일을 공유 할 수 있는 내부 애플리케이션을 제공하지만, 이는 DSM이라는 NAS 전용 OS에 종속되어 있고 이는 NAS에 등록된 유저를 확인하는 과정이 있음
NAS는 단순히 스토리지 역할을 하면서 사용자들에게 영상 등 자료를 보여줄 수 있는 역할만 하도록 구성하고자 함에 각 사용자에게 영상을 보기 위해 해당 NAS 등 스트리밍 플랫폼의 추가 가입은 불필요한 상황
이 문제가 발생하는 이유는 해당 파일 공유 시스템은 대부분 웹하드와 유사한 형태로 일부 폐쇄적 작동되기 때문
이에 따라 NAS의 애플리케이션 중 웹서버로 홈페이지를 쉽게 배포해줄 수 있는 Web Station을 활용
특정 포트, 웹서버 활용, 루트 폴더 선택 기능으로 간단하게 정적 파일(폴더)를 서빙
특히 Nginx의 config를 통해 캐싱 등 부가적인 부분을 해결 할 수 있으므로 사용하게 되었음
IP주소가 아닌 커스텀 도메인인 citefred.synology.me:4000 포트를 통해 해당 경로에 저장되어 있는 파일에 정상 접근되어 강의 영상을 볼 수 있는 상태 확인
특정 IP가 노출 되지 않도록 추후 커스텀 도메인으로 변경 할 필요가 있으며 현재는 Synology사가 제공해주는 무료 도메인으로도 Nginx 웹서버가 개방한 4000번 포트에 정상적으로 정적 파일이 접근 되는 것을 확인 할 수 있음
이처럼 NAS에 파일 업로드 / NAS에 있는 파일 제공 두가지 문제의 기초 솔루션으로 활용하고 추가적인 보안 등 고려할 문제를 파악, 해결해야 함
특히 NAS 자체가 제공해주는 무료 도메인, 무료 인증서를 통해서 보안적인 기초 문제를 해결 할 가능성이 높음
Search
 | Main Page | Category |  Tags | About Me | Contact | Portfolio