[nginx + php-fpm] try_files $uri =404; 관찰

liljoon·2023년 12월 28일

docker-compose로 nginx, laravel(php 프레임워크), mysql을 이용하여 띄우는 강의를 보던 중 의문이 들었다.

server:
    image: "nginx:stable-alpine"
    ports:
      - 8000:80
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
      - ./src:/var/www/html

./src 안에는 Laravel 소스코드가 들어있다.
해당 강의에서는 맨 밑에 볼륨을 "nginx에서 php 소스코드를 모르고 단순히 php-fpm으로 요청만 보내기 때문에 볼륨을 통해 nginx에도 노출되어야 한다
"고 설명했다.
굉장히 의문이 들었다. 과거의 프로젝트에서 이거랑 관련해서 트러블 슈팅했던 경험이 있다.

결론부터 말하자면 없어도 php파일은 작동한다. nginx에서 요청을 Php-fpm에 전송하고 해당 컨테이너에서 요청을 처리하고 php파일을 실행시켜서 반환한다. 그렇기에 nginx는 굳이 Laravel 소스코드를 확인할 필요가 없다.

그렇지만 웹페이지 코드는 php만이 아니라 css,js,svg 등 다양한 static 파일을 갖고 있다. 그래서 해당 파일들을 전송시키려면 결국 볼륨을 연결해서 해야 정상적인 웹브라우저가 완성된다.

하지만 강의 코드와 내 코드에서는 달랐다.
해당 볼륨을 지우니 404error가 나왔다. 확인해보니 nginx 설정 파일에서 달랐다.

location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

해당 코드는 강의 코드이다. 내 과거의 코드에는 try_files 부분이 없다.
해당 코드는 현재 요청한 경로에 파일이 존재하지 않으면 404를 반환하는 것이다.

그렇다. 강의 코드에서는 Php요청을 보내기 전에 nginx자체에서 php파일이 존재하는지 먼저 확인한 후에 요청을 보내는 것이다. 없다면 404error를 php를 통해서 보내는 것이 아닌 자체적으로 보내는 것이었다.


결론

어차피 static 파일들 때문에 nginx도 소스코드와 볼륨 연결을 해야하는데 맘편히 항상 연결하자!

0개의 댓글