Nginx를 활용한 파일 다운로드 링크 제공하기

소프트웨어 개발에 있어서 백엔트 서버에 리눅스의 활용이 확대됨에 따라, 많은 교육 기관이 소프트웨어 개발자 과정에 리눅스 기초를 가르치고 있다. 리눅스도 윈도우와 같이 데스크탑에 설치하여 GUI 환경에서 사용하는 것도 가능하지만, 일반적으로 리눅스를 사용한다고 하는 것은 백엔드 서버로 CLI 환경, 즉 리눅스 쉘을 사용한 커맨드라인 기반에서 사용하는 것을 의미하는 경우가 많다. 리눅스를 배운다고 하면 리눅스 설치, 계정 생성, 파일 권한, 인스턴스 실행, 각종 유틸리티 설치 등을 배우게 되는데 이런 아주 기초적이고 일반적인 내용을 배우는 것이 궁극적인 목적은 아니다. 결국은 리눅스를 서버로서 활용할 수 있어야 진정으로 리눅스 사용법을 배웠다고 말할 수 있을 것이다.

여기에서는 리눅스를 처음 접하고 아주 기본적이면서도 사실 실무적으로도 유용한, 리눅스 서버에 파일을 올려두고, 이에 대한 다운로드 링크를 만들어 사용할 수 있도록 구성하는 방법을 설명한다. 이 과정은 실제로 필자가 강의했던 인공지능 개발자 과정의 리눅스 실습 수업에 활용했던 것으로, AWS와 같은 퍼블릭 클라우드에 VM을 생성하고, apt를 사용하여 유틸리티를 설치한 후, 목적에 맞게 설정하는 방법을 가르치고자 구성한 내용이다. 이 과정을 통해 vi 에디터의 사용은 거의 필수이기 때문에 이에 대한 실습도 겸할 수 있으며, 백엔드(리눅스에서는 데몬이라는 말도 쓴다.) 인스턴스의 실행, 중단, 재시작 방법도 배울 수 있으며 가장 흔하게 활용되는 웹서버나 ftp 서버를 설치하는 법도 배울 수 있어 여러모로 유익할 것이라 생각한다.

1. ubuntu  서버에 nginx 패키지 설치

nginx는 사실 apache와 같은 웹서버 프로그램이다. 오픈 소스로서 무료로 자유롭게 사용할 수 있다는 장점과 더불어 리버스 프록시, IMAP/POP3 등의 서버 구동이 가능하여 활용도가 높으며 매우 가볍고 빠르다는 특징을 가지고 있다. 여기서는 웹서버로 활용하면서 실질적으로 파일다운로드 링크를 제공하는데 활용한다.

1) apt-get 업데이트하기

apt는 ubuntu 리눅스에서 사용할 수 있는 패키지 관리자이다. 리눅스에 설치하는 소프트웨어들은 많은 공유 라이브러리를 사용하는데 이에 대한 의존성 관리가 복잡하여 이를 해결할 목적으로 각각의 배포판마다 패키지 설치 관리자가 제작되었다. (대표적인게 ubuntu의 apt와 centos의 yum이다.) 여기서는 apt를 사용하여 nginx를 설치하려고 하며 그 전에 시스템에 이미 설치되어 있는 패키지들의 최신 업데이트를 수행하는 것이 좋다.

apt-get update를 통해 최신 업데이트를 수행한다.

apt-get update   // 패키지 업데이트 체크(최신 버전 체크)
apt-get upgrade  // 패키지 업그레이드(update에서 체크된  최신 버전으로 업그레이드)
apt-get dist-upgrade  //  패키지 업그레이드(의존성에 따라 업그레이드 & 필요없는 패키지는 삭제)

2) nginx 패키지 설치하고 시작하기

apt install 명령으로 nginx를 설치한다. 사실상 한 줄의 명령만으로 nginx가 설치되며, 설치 과정에 시스템에 없는 의존 라이브러리들이 자동으로 설치된다. 설치 후, service start를 통해 nginx를 시작할 수 있는데 기본 옵션으로도 아주 간단한 웹 서버가 실행된다. (실행 후, 웹브라우저에서 서버의 ip로 접속해보면 nginx의 기본 화면이 나타난다.)

– apt-get 업데이트

sudo apt-get update

– nginx 패키지 설치

sudo apt-get install nginx

– nginx 서비스 시작

sudo service nginx start

3) nginx 기타 명령어

nginx를 사용하기 위한 기본적인 명령어들을 소개한다. 실행, 재시작, 중지, 상태 확인 등이 있고, 중요한 점은 restart와 reload를 구분하는 것이다. restart는 완전하게 인스턴스를 종료했다가 다시 시작하는 것이고 reload는 인스턴스가 살아 있는 상태로 옵션 설정만 다시 불러온다.

– nginx 버전 확인

nginx -v

– nginx 서비스 재시작

sudo service nginx restart

– nginx 서비스 중지

sudo service nginx stop

– nginx 서비스 상태

sudo service nginx status

– nginx 서비스 설정 재로딩, 설정 파일을 변경했을 때는 restart하지 말고 reload를 한다.

sudo service nginx reload

– 설정파일 오류 체크

sudo nginx -t

– aws 보안규칙에 80포트 추가

2. 다운로드 링크 만들기

앞에서 nginx를 웹서버로 실행하였다. 하지만 실질적으로 웹 페이지를 만들지는 않았기 때문에 주소에 서버 아이피를 입력해봐야 nginx의 기본 페이지만 나올 뿐이다. 여기서는 nginx가 ftp 서버로 올림 파일 리스트를 보여줄 수 있도록 페이지를 링크하도록 설정한다.

1) nginx에 다운로드 링크 설정하기

– /var/www/myserv 라는 디렉토리를 만든다.

> cd /var/www
> sudo mkdir myserv

– /etc/nginx/sites-available 경로의 default 파일을 아래와 같이 수정한다.

* 여기서 /var/www/myserv 라고 입력한 경로는 자신의 경우에 맞게 임의로 바꿀 수 있다. /home/계정명 아래에 files라는 디렉토리는 만들고, /home/계정명/files 라고 변경해도 된다. 여기서 계정명은 자신의 계정이름(예를 들어 yhcho)이다.)

– nginx 서비스의 설정 사항을 재로딩한다.

sudo service nginx reload

3. ubuntu 에 ftp 서버 설치

이제 다운로드 링크로 연결할 파일을 관리할 수 있도록 ftp 서버를 설치한다. 리눅스에서 사용할 수 있는 ftp 서버 프로그램을 여러가지가 있는데, 여기서는 그 중 설치와 설정이 가장 쉬운 vsftpd를 사용한다. (참고로 vsftpd의 끝 d는 demon을 뜻한다. 백그라운드로 실행되는 서버 프로그램을 리눅스에서는 데몬이라고 부른다.)

1) ftp 서버 설치하기

– vsftpd 설치

sudo apt-get install vsftpd

– 보안규칙 인바운드 규칙에 아래 포트의 허용을 추가한다. aws가 아니라면 이미 방화벽이 모두 오픈되어 있어 별도의 설정이 필요없을 수도 있다. aws의 경우에는 보안그룹이라는 형태로 방화벽이 내장되어 있는데 여기서 인바운드 규칙에 특정 포트를 열어주어야 한다. ftp의 well-known 포트는 20, 21번이므로 이 포트를 열어주어야 한다. 또한 파일 다운로드를 위해 추가적으로 1024~1048의 포트도 열어준다.

– AWS인 경우 아래 보안 규칙을 추가(보안그룹의 인바운드 규칙)하고, vmware 인 경우 필요없다.

TCP 20-21
TCP 1024-1048

– /etc/vsftpd.conf 파일을 다음과 같이 수정한다.

– 아래 옵션을 주석해제하고,

write_enable=YES
local_umask=022
chroot_local_user=YES
utf8_filesystem=YES

– 아래 옵션을 추가한다.

allow_writeable_chroot=YES

– 아래 옵션의 경우 AWS의 경우에만 추가한다.

pasv_enable=YES
pasv_min_port=1024
pasv_max_port=1048
pasv_address=자신의 인스턴스 공인 IP

– ftp의 루트를 특정 디렉토리로 지정하고자 한다면 vsftpd.conf  파일에 아래 내용을 추가한다.

user_sub_token=$USER
local_root=/home/$USER/ftp

– vsftpd.conf 파일 수정 사항을 적용한다. (restart하지 말고 reload한다. 설정만 바꾼 경우라면 reload로 충분하다. 물론 restart해도 되지만 그럴 필요까지 없다는 뜻이다.)

service vsftpd reload

2) ftp 전용 계정 생성하기

aws에 ubuntu를 설치하면 기본적으로 ubuntu 계정이 만들어져 있다. 이 계정은 관리자 권한이 부여되어 있어 사실상 루트 권한 수준의 막강한 권한을 가지고 있다. 리눅스를 관리하는데 있어서 계정에 적절한 권한을 부여하여 사용하는 것은 보안상 필수이다. 윈도우처럼 개인사용자용 OS로서의 특성을 강하게 가진 경우는 관리자 권한이라는 개념이 희박하고 있다고 하더라도 불편한 요소로 인식하는 경향이 있는데, 리눅스는 기본적으로 다중사용자용 OS이고 각각의 사용자에게 맞는 권한을 부여하는 것이 보안상 바람직하다. 로컬의 개발 환경이라면 크게 문제가 되지 않을지 모르지만 운영 환경에서는 반드시 용도에 맞는 계정을 별도로 생성하여 관리하고 그에 맞는 권한을 부여하여 관리하는 것을 권장한다. (권장 사항이 아니라 사실 의무사항에 가깝다.)

여기서는 ftp 접속을 위한 ftp용 계정을 별도로 생성한다. 이 계정에는 일반 로그인(putty와 같은 ssh 접속을 막는 것이다.)을 막고 순수하게 ftp로의 접속만 허용하도록 설정한다.

– ftp용 계정 생성한다.

sudo adduser ftpuser

3) ftp용 계정의 일반로그인 막기

– /etc/passwd 파일을 아래와 같이 수정한다.

ftpuser:x:1002:1002:,,,:/home/ftpuser:/bin/noshell

– /etc/shells파일에 아래와 같이 /bin/noshell을 추가한다.

 /bin/noshell

– 아래의 방법으로 /bin/noshell 파일 을 생성한다.

sudo touch /etc/noshell
sudo chmod 777 /etc/noshell

5. 파일 링크 경로 연결

이제 거의 다 되었다. 마지막으로 mount를 통해 ftp의 루트 디렉토리와 웹서버의 파일 링크 경로를 연결한다.

1) 파일링크 경로를 ftp 루트 디렉토리로 연결하기

– mount 명령을 이용하여 파일링크 경로를 ftp의 루트 디렉토리와 연결한다.

mount --bind /var/www/files /home/ftpuser/files

– 이제 웹 브라우저에서 nginx의 웹서버 주소로 접속하면 ftp서버에 업로드된 파일 리스트가 보이며 각 파일들에 대해 웹서버 주소를 통한 다운로드 링크 제공이 가능해진다.