시작하기 전에 우선 폴더 경로에 오타가 없는지부터 확인하자. 내가 겪은 이 에러의 절반은 오타 때문이었다.
목차
들어가며
Forbidden
You don't have permission to access / on this server.
에러 로그(/var/log/apache2/error.log
혹은 /var/log/httpd/error_log
식의 경로를 찾으면 된다)를 보면 아래처럼 생겨먹었다.
client denied by server configuration : 폴더 경로
해결책은 두 단계다.
디렉토리 설정
아파치 2.4
(아파치 2.2 설명은 아래 있다.)
이런 에러가 나오는 이유는 apache <Directory>
설정에서 막아 둔 폴더에 접근하려 했기 때문이다. apache 기본 설정은 /
하위를 모두 막고, 열어둘 디렉토리만 지정하는 형식이다. 우분투 16.04, apache 2.4 기준으로 /etc/apache2/apache2.conf
파일을 보면 아래처럼 /usr/share
와 /var/www
만 열어 둔 것을 확인할 수 있다.
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
우선 /
폴더에는 Require all denied
라고 설정해 둔 것을 볼 수 있다. 전부 막는다는 뜻이다.
<Directory>
설정에 대한 자세한 설명은 아파치 문서의 <Directory>
지시 항목을 보라.
여기서 주목할 것은 Require
지시인데, 접근 권한에 대한 설정이다. 여러 가지로 설정을 할 수 있지만, 대략 세 가지만 알아 두면 되지 싶다.
(근데 이건 아파치 2.4 문법이다. 2.4보다 낮은 버전이라면 좀 스크롤을 내려서 2.2 관련 설명을 봐라.)
Require all granted
: 무조건 허용Require all denied
: 무조건 금지Require ip 10 172.20 192.168.2
: 특정 아이피만 접근 허용. 여기서는10
으로 시작하는 아이피,172.20
으로 시작하는 아이피,192.168.2
로 시작하는 아이피 세 개를 허용한 것 같다.
모든 설정을 보고 싶다면 Require Directive를 보면 된다.
이해했다면, 자신의 웹서버 디렉토리를 허용해 주자. 나는 apache2.conf
의 다른 디렉토리 설정들 밑에 아래처럼 추가했다.
<Directory /path/to/workspace/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
Require all granted
를 적으면 되는데, Options
와 AllowOverride
설정도 알아 두자.
Options
: 각종 옵션이다. 위에서 나는 두 가지를 설정했는데Indexes
는 기본으로 접근할 파일이 없을 때 디렉토리 목록을 보여 주게 하는 것이다. 나는 개발 용도로 설정한 거라 이 옵션을 줬는데, 제품 서버에선 이 옵션을 켜 두면 안 된다. 보이면 지워라.FollowSymLinks
는 심볼릭 링크1를 따라가게 하는 옵션이다. 제품 서버에서 켤지 말지는 판단을 해야 한다. 다양한 옵션은 Options 지시 문서를 참고하라.AllowOverride
:.htaccess
파일 작동을 허용할 조건을 설정한다. 보통All
아니면None
을 쓴다. 자세한 내용은 AllowOverride 지시 문서를 참고하라.
아파치 2.2
아파치 2.2에는 Require
지시가 아니라 Allow
지시와 Deny
지시가 적혀 있을 것이다. 아래처럼 말이다.
<Directory />
# 모두 접근 금지
Order Deny,Allow
Deny from All
</Directory>
<Directory /var/www>
# 모두 접근 허용
Order allow,deny
Allow from all
</Directory>
2.4의 Require all granted
에 해당하는 것은 Allow from All
, Order allow,deny
이다.
24.의 Require all denied
에 해당하는 것은 Deny from All
, Order Deny,Allow
이다.
(참고 Upgrading to 2.4 from 2.2).
키 말고 값으로 들어가는from all
과 deny,allow
같은 것들은 대소문자 구분을 안 하는 듯하다.
Order
를 자세하게 이해하기는 좀 난해했는데, 2.4부터는 사용하지도 않으니 자세히 알 필요는 없다. 필요한 경우 Order Directive를 참고하자.
위에서 설명한 규칙에 따라 자신의 프로젝트 폴더 관련 설정을 한다.
<Directory /path/to/workspace/>
Order allow,deny
Allow from all
Options Indexes FollowSymLinks
AllowOverride All
</Directory>
Options
와 AllowOverride
설정은 내가 아파치 2.4 파트에 설명을 적어 뒀으니 참고하면 된다.
아파치 재시작
아파치 설정을 변경한 뒤 적용하려면 아파치를 재시작해야 한다. 아래 명령어 중 하나로 하면 된다.
sudo apachectl restart # 맥
brew services restart httpd # 맥 HomeBrew
sudo service apache2 restart # System V 사용 리눅스
sudo systemctl restart apache2 # systemd 사용 리눅스
php-fpm을 사용하는 경우 php-fpm도 재시작해 준다.
brew services restart php # 맥 HomeBrew
sudo service php7.4-fpm # System V 사용 리눅스(7.4는 자신의 버전에 맞게)
sudo systemctl restart php7.4-fpm # systemd 사용 리눅스(7.4는 자신의 버전에 맞게)
권한 설정 ― 아파치 사용자가 실행/읽기 권한이 있어야 한다
아파치 설정에서 디렉토리 접근을 허용한 뒤에도 접속이 안 되고, 에러 로그를 봤는데 퍼미션이 없다고 나오면 이제 아파치 사용자에게 해당 폴더의 퍼미션을 주면 된다.
[core:error] [pid xxx:tid xxx] (13)Permission denied: [client 127.0.0.1:54576] AH00035: access to / denied (filesystem path '/path/to/workspace') because search permissions are missing on a component of the path
아파치 서버 실행은 루트 권한으로 하지만, 아파치 프로세스가 루트 사용자 권한을 가지진 않는다.
아파치를 돌리는 아파치 전용 사용자(우분투의 경우 www-data
)가 프로세스를 소유하고, 아파치 프로세스는 이 전용 사용자의 권한을 가진다.
웹 서버가 일반 사용자의 파일을 함부로 읽거나 쓰면 안 되기 때문에, 딱 웹사이트 서비스에 필요한 디렉토리와 파일에만 접근하도록 사용자를 분리해서 권한을 주는 것이다.
그렇다면 웹서버용 폴더와 파일에는 당연히 아파치 사용자가 접근할 수 있어야 한다.
구체적으로는 폴더는 읽기/실행 권한, 파일은 읽기 권한, 업로드를 하거나 파일을 작성하거나 수정하려면 쓰기 권한까지 있어야 한다.
또한 폴더의 부모 폴더도 읽고 실행할 수 있어야 한다.
이를 위해 아래 두 가지 권한 전략 중 하나를 택할 수 있다.
경로 상위 폴더까지 익명 사용자에게 읽기와 실행 권한을 주는 방법
웹서버 폴더의 경로가 /path/to/workspace
라고 한다면 아래 명령을 실행한다. 경로 세 개에 대해 익명 사용자에게 읽기와 실행 권한을 주는 방법이다.
sudo chmod o+rx /path /path/to /path/to/workspace
파일과 폴더를 아파치 소유로 하는 방법
웹사이트 파일과 폴더를 몽땅 아파치 사용자의 소유로 하고 소유자 실행 권한, 읽기 쓰기 권한을 준다. 간편하지만 피곤하다. 내가 파일을 수정할 수가 없게 된다.
sudo chown -R www-data:www-data /path /path/to /path/to/workspace
아파치 그룹에 쓰기 권한을 부여하는 방법
웹사이트 파일과 폴더, 상위 폴더의 그룹을 아파치 그룹으로 변경하고, 쓰기 권한을 부여하는 방법이다. 나도, 아파치 소유자도 모두 파일을 수정할 수 있으므로 가장 편리한 방법이다.
sudo chgrp -R www-data /path /path/to /path/to/workspace
sudo chmod -R g+w /path /path/to /path/to/workspace
셋 중 하나를 실행한 뒤 아파치를 재시작한다. php-fpm을 사용한다면 php-fpm도 재시작한다.
댓글 남기기