NGINX dav module 활용 NGINX 파일 공유 서버 구성 가이드

이 포스트는 NGINX dav module(ngx_http_dav_module) 을 활용하여 NGINX 서버를 파일 공유 서버로 사용할 수 있는 WebDAV 서버로 구성하는 방법에 관해 설명합니다. 이 모듈은 PUT, DELETE, MKCOL, COPY, MOVE 메서드를 처리합니다.
PROPFIND나 LOCK, UNLOCK 등 추가적인 WebDAV 메서드가 필요한 클라이언트는 이 모듈로 구성된 서버와 호환되지 않습니다.

이 모듈은 NGINX OSS, NGINX Plus 모두 사용 가능하며, 패키지 설치 시 자동으로 빌드됩니다.
컴파일 설치 시 --with-http_dav_module 설정 매개변수를 통해 빌드해야 합니다.

목차

1. WebDAV란?
2. NGINX dav module 지시문

3. NGINX dav module 활용 WebDAV 서버 구성
4. 결론

1. WebDAV란?

WebDAV(Web Distributed Authoring and Versioning)는 HTTP 프로토콜을 확장하여 웹 서버에서 파일을 관리하고 편집할 수 있게 해주는 기술입니다. WebDAV 서버는 파일 업로드, 다운로드, 삭제 및 디렉토리 생성 등의 작업을 지원하여 파일 공유 및 협업에 유용한 환경을 제공합니다.

PROPFIND, OPTIONS 메서드를 지원하는 WebDAV 서버의 경우, 네트워크 드라이브 연결을 통해 해당 서버를 로컬 드라이브처럼 사용할 수 있습니다.

2. NGINX dav module 지시문

1. create_full_put_path on | off;
기본값 : create_full_put_path off;
컨텍스트 : http, server, location

off로 설정 시 기존에 존재하는 디렉터리에만 파일을 생성할 수 있습니다.
on으로 설정 시 파일 생성에 필요한 모든 중간 디렉터리를 생성할 수 있습니다.

2. dav_access users:permissions …;
기본값 : dav_access user:rw;
컨텍스트 : http, server, location

새로 생성된 파일과 디렉터리의 접근 권한을 설정합니다. 예:

dav_access user:rw group:rw all:r;

group이나 all 권한이 설정된 경우, user 권한은 생략할 수 있습니다.

dav_access group:rw all:r;

3. dav_methods off | method …;
기본값 : dav_methods off;
컨텍스트 : http, server, location

정의된 HTTP/WebDAV 메서드를 허용합니다. PUT, DELETE, MKCOL, COPY, MOVE 메서드를 지원합니다.

PUT 메서드를 통한 파일 업로드는 먼저 임시 파일로 작성되고, 이후 파일 이름이 변경됩니다. 임시 파일이 저장될 경로는 client_body_temp_path 지시문(ngx_http_core_module)의 설정을 따릅니다.
PUT 메서드로 파일을 생성할 때, Date 헤더 필드를 통해 파일의 수정 날짜를 지정할 수 있습니다.

4. min_delete_depth number;
기본값 : min_delete_depth 0;
컨텍스트 : http, server, location

DELETE 메서드를 사용할 때, 지정된 디렉터리 깊이보다 낮은 파일은 삭제되지 않도록 제한합니다.

min_delete_depth 4 설정의 경우 :

  • 가능한 파일 삭제 요청:
/users/00/00/name
/users/00/00/name/pic.jpg
/users/00/00/page.html
  • 제한되는 파일 삭제 요청:
/users/00/00

3. NGINX dav module 활용 WebDAV 서버 구성

NGINX dav module을 통해 NGINX 서버를 WebDAV 서버로 구성하기 위해 다음 설정 파일을 사용했습니다.

dav.conf
server {
    listen 5000;

    access_log /var/log/nginx/dav_access.log main;
    error_log /var/log/nginx/dav_error.log;

    # 웹에서 디렉터리 리스트를 확인하기 위한 autoindex 설정
    autoindex on;
    autoindex_localtime on;

    # 한글 깨짐 방지를 위한 charset 설정
    charset utf-8;

    # 서버로 업로드할 수 있는 최대 파일 크기 제한 해제 / 값이 낮아 제한 초과 시 413 응답
    client_max_body_size 0;

    location / {
        # 파일 관리 root 디렉터리 설정
        root                  /data/www;
        
        # PUT 메서드 요청 시 임시 파일 생성 경로
        client_body_temp_path /data/client_temp;

        # 허용할 메서드 정의
        dav_methods PUT DELETE MKCOL COPY MOVE;

        # 중간 디렉터리 생성 활성화 - 디렉터리 하위에 파일을 생성할 때 디렉터리 자동 생성
        create_full_put_path  on;
        # 파일 권한 설정
        dav_access            group:rw  all:r;

        # 지정 IP range를 제외한 접속은 GET 요청만 허용
        limit_except GET {
            allow 192.168.0.0/16;
            deny  all;
        }
    }
}

NGINX 서버의 5000번 포트로 웹에서 접속 시 autoindex 모듈로 인해 아래와 같은 디렉터리 리스트 화면을 확인할 수 있습니다.
autoindex 모듈에 대해 더 자세히 알고 싶으시다면, NGINX autoindex module 활용 디렉터리 인덱싱 페이지 구성 가이드를 참고하세요.

NGINX dav module server root

PUT 메서드 요청을 통해 NGINX 서버에 파일을 업로드 할 수 있습니다. -T 옵션을 통해 업로드 할 파일을 지정합니다.

$ curl -i -X PUT "http://192.168.200.176:5000/test.txt" -T 'test.txt'

HTTP/1.1 201 Created
Server: nginx/1.25.5
Date: Wed, 13 Nov 2024 05:21:55 GMT
Content-Length: 0
Location: http://192.168.200.176:5000/test.txt
Connection: keep-alive

MKCOL 메서드 요청을 통해 NGINX 서버에 디렉터리를 생성할 수 있습니다.

$ curl -i -X MKCOL "http://192.168.200.176:5000/mydir/"

HTTP/1.1 201 Created
Server: nginx/1.25.5
Date: Wed, 13 Nov 2024 05:23:44 GMT
Content-Length: 0
Location: http://192.168.200.176:5000/mydir/
Connection: keep-alive
NGINX dav module server files

MKCOL 메서드를 통한 디렉터리 생성 시 슬래시(/)가 없으면 409 응답이 반환됩니다.

$ curl -i -X MKCOL "http://192.168.200.176:5000/mydir"

HTTP/1.1 409 Conflict
Server: nginx/1.25.5
Date: Wed, 13 Nov 2024 05:23:38 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 151
Connection: keep-alive

create_full_put_path on 지시문으로 인해 PUT 요청을 통해 디렉터리와 디렉터리 하위의 파일을 한 번에 생성 할 수 있습니다. 해당 지시문의 값이 off인 경우 500 응답을 반환합니다.

$  curl -i -X PUT "http://192.168.200.176:5000/images/image.png" -T 'nginx plus.png'

HTTP/1.1 201 Created
Server: nginx/1.25.5
Date: Wed, 13 Nov 2024 05:28:41 GMT
Content-Length: 0
Location: http://192.168.200.176:5000/images/image.png
Connection: keep-alive
NGINX dav module server files

MOVE 메서드 요청을 Destination 헤더와 함께 전송하여 파일을 옮길 수 있습니다.

$ curl -i -X MOVE "http://192.168.200.176:5000/images/image.png" -H "Destination: http://192.168.200.176:5000/mydir/my_image.png"

HTTP/1.1 204 No Content
Server: nginx/1.25.5
Date: Wed, 13 Nov 2024 05:34:28 GMT
Connection: keep-alive
NGINX dav module server images directory
NGINX dav module server mydir directory

COPY 메서드 요청을 Destination 헤더와 함께 전송하여 파일을 복사할 수 있습니다.

$ curl -i -X COPY "http://192.168.200.176:5000/mydir/my_image.png" -H "Destination: http://192.168.200.176:5000/root_image.png"

HTTP/1.1 204 No Content
Server: nginx/1.25.5
Date: Wed, 13 Nov 2024 08:42:46 GMT
Connection: keep-alive

GET 메서드 요청을 전송하여 파일을 다운로드할 수 있습니다.

$ curl -i -X GET "http://192.168.200.176:5000/test.txt" -o downloaded.txt

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    11  100    11    0     0    467      0 --:--:-- --:--:-- --:--:--   478
$ ls

    디렉터리: C:\Users\devopssong\nginx\dav

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----      2024-11-13   오후 5:46            262 downloaded.txt
-a----      2024-08-21   오후 4:28           2950 nginx plus.png
-a----      2024-11-13   오후 2:21             11 test.txt

DELETE 메서드 요청을 전송하여 파일을 삭제할 수 있습니다.

$ curl -i -X DELETE "http://192.168.200.176:5000/images/"

HTTP/1.1 204 No Content
Server: nginx/1.25.5
Date: Wed, 13 Nov 2024 08:48:32 GMT
Connection: keep-alive

4. 결론

이번 포스트에서는 NGINX dav module을 활용하여 NGINX 서버를 파일을 관리하고 편집할 수 있는 WebDAV 서버로 구성하는 방법에 관해 알아봤습니다.

PUT, DELETE, MKCOL, COPY, MOVE 메서드를 사용하여 NGINX 서버와 통신을 통해 직접 파일을 관리하고, autoindex 모듈을 활용하여 웹에서 디렉터리 리스트를 통해 변화를 확인했습니다. 이러한 서버 구성을 통해 NGINX를 파일 공유 서버로 사용할 수 있습니다.
다만, PROPFIND나 LOCK, UNLOCK 등 추가적인 WebDAV 메서드가 필요한 클라이언트와는 호환이 되지 않기 때문에 주의가 필요합니다.

NGINX OSS가 사용할 수 있는 모듈을 비롯해 추가로 사용할 수 있는 전용 모듈이 존재하는 NGINX Plus를 체험해 보고 싶으시다면 NGINX STORE를 통해 문의해 무료로 NGINX Plus trial을 체험해 보세요.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required