문서 루트 밖에 있는 저장소나 미디어 디렉터리를 웹으로 열 때 쓰는 방법은 둘이다.
| 방법 | 성격 |
|---|---|
Alias |
URL 경로 하나를 파일시스템 경로에 직접 매핑한다. Apache 설정 안에서 끝난다 |
| 심볼릭 링크 | 문서 루트 아래에 링크를 만들고 Apache 가 따라가게 한다. 파일시스템 쪽에서 관리한다 |
웬만하면 Alias 를 쓴다. 설정 파일만 보면 무엇이 어디로 열려 있는지 알 수 있고, Options 를 느슨하게 풀지 않아도 된다.
Alias /storage "/srv/storage"
<Directory "/srv/storage">
Options Indexes
AllowOverride None
Require all granted
IndexOptions FancyIndexing HTMLTable NameWidth=* VersionSort Charset=UTF-8
</Directory>
Alias 의 URL 부분에 슬래시를 붙이는지 여부를 양쪽에서 맞춘다. Alias /storage/ "/srv/storage/" 로 쓰면 /storage 로는 접근되지 않는다.
링크를 만들고, 해당 디렉터리에 FollowSymLinks 를 준다. 기본 설정에서는 꺼져 있는 경우가 많다.
ln -s /srv/storage /var/www/html/storage
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
FollowSymLinks 가 없으면 500 이 나고 에러 로그에 이 줄이 남는다.
Symbolic link not allowed or link target not accessible
조금 더 조이려면 SymLinksIfOwnerMatch 를 쓴다. 링크와 대상의 소유자가 같을 때만 따라간다. 다만 대상마다 stat 을 한 번 더 부르므로 파일이 많은 트리에서는 느려진다.
Options Indexes SymLinksIfOwnerMatch
대상 디렉터리 권한만 맞춰 놓고 안 되는 경우가 가장 흔하다. httpd 실행 계정(RHEL 계열은 apache)은 최상위부터 대상까지 모든 중간 디렉터리에 실행(x) 권한이 있어야 한다.
namei -l /srv/storage
sudo -u apache ls -l /srv/storage
sudo -u apache ls 가 실패하면 웹에서도 실패한다. 여기서 먼저 가른다. 읽기만 열 것이면 디렉터리 755, 파일 644 로 충분하고 소유자를 바꿀 필요가 없다.
SELinux 가 켜진 호스트에서는 레이블도 봐야 한다. 권한이 맞는데도 거부되면 이쪽이다.
ls -Zd /srv/storage
sudo semanage fcontext -a -t httpd_sys_content_t "/srv/storage(/.*)?"
sudo restorecon -Rv /srv/storage
컨테이너 안의 심볼릭 링크는 컨테이너 파일시스템 기준으로 해석된다. 호스트 경로를 가리키는 링크를 그대로 넣으면 대상이 없다. 링크가 가리키는 경로도 함께 마운트하거나, 아예 그 경로를 문서 루트 아래에 직접 마운트한다.
services:
web:
image: httpd:2.4
volumes:
- ./html:/var/www/html
- /srv/storage:/srv/storage:ro
파일명이 UTF-8 로 저장돼 있어도 응답 헤더의 문자셋이 다르면 목록에서 깨진다.
AddDefaultCharset UTF-8
IndexOptions Charset=UTF-8
WebDAV 로 붙는 윈도우 탐색기처럼 클라이언트가 자기 코드페이지로 해석하는 경우도 있으므로, 서버에서 UTF-8 로 못 박아 둔다.
열어 둔 경로에 인증을 걸 때는 Basic 인증과 htpasswd 를 쓴다. 자격 증명이 평문으로 실려 가므로 반드시 TLS 위에 둔다. 구체적인 설정과 WebDAV 를 함께 쓰는 형태는 아래 문서에 있다.
htpasswd 설정.Options 상속과 + · - 표기의 차이.