아파치 Forbidden You don’t have permission to access / on this server. 에러 해결


들어가며

맥북에서 아파치 가상호스트 설정에 성공했는데 이번에는 Forbidden 에러를 뿜었다.

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 : 폴더 경로

우선 폴더 경로가 제대로 잡혔는지부터 확인해 보자. 그리고 폴더 경로가 제대로인데 문제가 발생하는 것이라면 아래 해결책을 적용한다.

해결책은 두 단계다.

  1. 디렉토리 설정(2.4, 2.2)
  2. 권한 설정

디렉토리 설정

아파치 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를 적으면 되는데, OptionsAllowOverride 설정도 알아 두자.

  • 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 alldeny,allow 같은 것들은 대소문자 구분을 안 하는 듯하다.

Order를 자세하게 이해하기는 좀 난해했는데, 2.4부터는 사용하지도 않으니 자세히 알 필요는 없다. 필요한 경우 Order Directive를 참고하자.

위에서 설명한 규칙에 따라 자신의 프로젝트 폴더 관련 설정을 한다.

<Directory /path/to/workspace/>
    Order allow,deny
    Allow from all
    Options Indexes FollowSymLinks
    AllowOverride All
</Directory>

OptionsAllowOverride 설정은 내가 아파치 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도 재시작한다.

👇 카테고리 글 목록

대표글

댓글 남기기