아래와 같은 443 포트 서버 블록의 root와 index 값을 지정하고 index 파일을 띄우려고 했는데 계속 404 에러가 떴다.
다른 서버 블록들에서는 다 잘 적용됐는데 443 포트를 바라보고 있는 서버 블록만 계속 index가 적용이 안되는 문제가 발생했다.
server {
# SSL configuration
listen 443 ssl default_server;
listen [::]:443 ssl default_server ipv6only=on;
server_name 도메인명;
root 루트폴더경로;
index i.html;
ssl_certificate 키경로;
ssl_certificate_key 키경로;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
location / {
proxy_pass http://localhost:포트번호;
proxy_read_timeout 6000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
}
구글링을 통해 443 포트 서버 블록의 location = / {} 블록을 통해 root와 index를 다시 지정한 후 해당 도메인명 주소로 들어올 때만 지정된 html 파일을 띄우려고 했는데 계속 404 에러가 발생했다.
다른 서버 블록들에선 다 정상 작동하는데 해당 블록에서만 발생한 문제로 구글링을 통해 계속 여러 방식들을 적용해봤지만 404 에러가 사라지지 않았다.
그러다 우연히 root 대신 alias를 사용한 코드를 보게 됐고 해당 문법을 활용해 404 에러를 해결했다.
root는 상대 경로를 사용하고 alias는 절대경로를 사용하는데 alias를 사용했을 때 404 에러가 사라진 걸 보니 기본으로 설정된 상대 경로에서 다시 동일한 위치 상대 경로로 접근을 하려고 해서 잘못된 주소로 접근을 했던게아닌가싶다.
server {
# SSL configuration
listen 443 ssl default_server;
listen [::]:443 ssl default_server ipv6only=on;
server_name 도메인명;
root 루트폴더경로;
index i.html;
ssl_certificate 키경로;
ssl_certificate_key 키경로;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
location = / {
default_type "text/html"; //해당 코드가 없으면 html이 띄워지지 않고 다운된다고 한다.
alias 루트폴더경로;
index i.html;
}
location / {
proxy_pass http://localhost:포트번호;
proxy_read_timeout 6000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
}
해당 코드를 통해 404 에러를 없애는 것 까지는 성공했는데 이후 403 에러가 발생했다.
관련해서 다시 구글링도 해보고 nginx 에러 로그도 들어가서 보니 권한 문제라고 한다.
해결법을 찾아보니 권한을 가진 nginx 설정 파일의 사용자와 html 파일의 사용자가 동일한지 체크해야하고 그래도 안되면 권한 설정 명령어를 통해 해당 root 폴더의 권한을 변경해줘야한다고 돼있었다. 권한 설정을 바꾸는 건 보안상 좋은 해결법은 아닌 것 같다.
띄우고자 하는 html 파일 경로에 들어가서 아래 명령어를 치면 권한이 있는 사용자와 권한 허용영역을 알 수 있다.
ls -al
사용자의 이름이 ubuntu임을 확인한 후 nginx 설정 파일에서 사용자 권한을 찾아봤다.
cd /etc/nginx
vi nginx.conf
해당 설정 파일의 첫줄에 user 사용자명;이라고 적힌 부분을 통해 권한이 있는 사용자명을 확인할 수 있는데 html 파일 권한자의 이름과 일치 하지 않았다.
nginx.conf 파일에서 사용자명을 html 파일의 사용자명으로 바꾼후 저장을 하고 nginx를 재시작하면 해결된다고 한다.
다른 서버 블록들은 알아서 잘 띄어지던데 해당 서버 블록만 왜 적용이 안됐던 건지 nginx 설정에 관해 더 공부를 해보면 좋을 것 같다.
참고 사이트