본문으로 건너뛰기
버전: 10.x
Laravel 10.x · 한국어 문서https://laravel.com/docs/10.x/deployment

Deployment

Introduction​

Laravel 애플리케이션을 운영 환경에 배포할 준비가 되었다면, 애플리케이션이 최대한 효율적으로 동작하도록 하기 위해 취할 수 있는 중요한 사항들이 있습니다. 이 문서에서는 Laravel 애플리케이션을 올바르게 배포하기 위한 가장 기본적인 출발점들을 다루고 있습니다.

Server Requirements​

Laravel 프레임워크는 몇 가지 시스템 요구 사항이 있습니다. 여러분의 웹 서버가 아래 최소 PHP 버전과 확장 모듈을 갖추고 있는지 반드시 확인해야 합니다.

  • PHP >= 8.1
  • Ctype PHP Extension
  • cURL PHP Extension
  • DOM PHP Extension
  • Fileinfo PHP Extension
  • Filter PHP Extension
  • Hash PHP Extension
  • Mbstring PHP Extension
  • OpenSSL PHP Extension
  • PCRE PHP Extension
  • PDO PHP Extension
  • Session PHP Extension
  • Tokenizer PHP Extension
  • XML PHP Extension

Server Configuration​

Nginx​

만약 Nginx가 실행 중인 서버에 애플리케이션을 배포한다면, 아래의 설정 파일을 참고하여 웹 서버를 설정할 수 있습니다. 실제로는 여러분의 서버 환경에 맞게 이 파일을 추가로 수정해야 할 가능성이 높습니다. 서버 관리에 도움이 필요하다면, Laravel Forge와 같은 Laravel 공식 서버 관리 및 배포 서비스를 사용하는 것도 고려해보시기 바랍니다.

아래 예시 설정과 같이, 웹 서버가 모든 요청을 애플리케이션의 public/index.php 파일로 전달하도록 반드시 설정해야 합니다. 절대로 index.php 파일을 프로젝트 루트로 옮기는 시도를 해서는 안 됩니다. 만약 프로젝트의 루트에서 애플리케이션을 서비스하게 되면, 많은 민감한 설정 파일들이 외부에 노출될 수 있습니다.

server {
listen 80;
listen [::]:80;
server_name example.com;
root /srv/example.com/public;

add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";

index index.php;

charset utf-8;

location / {
try_files $uri $uri/ /index.php?$query_string;
}

location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }

error_page 404 /index.php;

location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}

location ~ /\.(?!well-known).* {
deny all;
}
}

Optimization​

Autoloader Optimization​

운영 환경에 배포할 때는 Composer의 클래스 오토로더 맵을 최적화해야 Composer가 클래스를 빠르게 찾아서 로드할 수 있습니다.

composer install --optimize-autoloader --no-dev

오토로더를 최적화하는 것과 더불어, 반드시 composer.lock 파일도 소스 컨트롤 저장소에 포함시켜야 합니다. composer.lock 파일이 있으면 프로젝트 의존성 설치 속도가 훨씬 빨라집니다.

Caching Configuration​

애플리케이션을 운영 환경에 배포할 때는, 배포 과정에서 반드시 config:cache 아티즌 명령어를 실행해야 합니다.

php artisan config:cache

이 명령어는 Laravel의 모든 설정 파일을 하나의 캐시 파일에 합쳐서 저장합니다. 덕분에 프레임워크가 설정값을 불러올 때 파일 시스템에 접근하는 횟수가 크게 줄어들어 성능이 향상됩니다.

배포 과정에서 config:cache 명령어를 실행하는 경우, 반드시 설정 파일 내에서만 env 함수를 호출해야 합니다. 설정을 캐시하면 .env 파일은 더 이상 로드되지 않으며, 이때부터 .env 변수의 값을 env 함수로 읽으면 항상 null을 반환합니다.

Caching Events​

애플리케이션에서 event discovery를 사용 중이라면, 배포 과정에서 애플리케이션의 이벤트-리스너 매핑도 캐싱해야 합니다. 이를 위해 배포 시 event:cache 아티즌 명령어를 실행하면 됩니다.

php artisan event:cache

Caching Routes​

라우트가 많은 대규모 애플리케이션을 빌드할 경우, 배포 과정에서 route:cache 아티즌 명령어를 실행해야 합니다.

php artisan route:cache

이 명령어는 모든 라우트 등록 정보를 하나의 캐시 파일 내에서 메서드 호출로 통합하여 저장합니다. 수백 개의 라우트를 등록할 때 라우트 등록 속도를 크게 개선할 수 있습니다.

Caching Views​

운영 환경에 애플리케이션을 배포할 때는, 배포 과정에서 반드시 view:cache 아티즌 명령어를 실행해야 합니다.

php artisan view:cache

이 명령어는 모든 Blade 뷰 파일을 미리 컴파일하여, 실제 요청마다 뷰가 실시간으로 컴파일되는 일이 없도록 하여 각 요청에서의 뷰 렌더링 성능을 높입니다.

Debug Mode​

config/app.php 설정 파일의 debug 옵션은 에러 발생 시 사용자에게 어느 정도의 정보가 노출되는지를 결정합니다. 기본적으로 이 옵션은 애플리케이션의 .env 파일에 저장된 APP_DEBUG 환경 변수 값을 따릅니다.

운영 환경에서는 이 값이 반드시 false로 설정되어 있어야 합니다. 운영 환경에서 APP_DEBUG 변수가 true로 설정되어 있으면, 애플리케이션의 엔드 유저에게 민감한 설정 값이 노출될 위험이 있습니다.

Easy Deployment With Forge / Vapor​

Laravel Forge​

서버 설정을 직접 관리할 준비가 되어 있지 않거나, Laravel 애플리케이션을 안정적으로 실행하기 위해 필요한 다양한 서비스를 직접 설정하는 것이 어렵다면, Laravel Forge는 훌륭한 대안이 될 수 있습니다.

Laravel Forge를 사용하면 DigitalOcean, Linode, AWS 등 여러 인프라 제공업체에 서버를 생성할 수 있습니다. 또한, Forge는 Nginx, MySQL, Redis, Memcached, Beanstalk 등 강력한 Laravel 애플리케이션에 필요한 도구를 자동으로 설치하고 관리해줍니다.

Laravel Forge로 배포하는 전체 가이드가 필요하다면 Laravel Bootcamp나 Forge의 video series available on Laracasts를 참고하세요.

Laravel Vapor​

완전히 서버리스(serverless)하며 Laravel에 최적화된 오토스케일링 배포 플랫폼을 원하신다면, Laravel Vapor를 확인해 보세요. Laravel Vapor는 AWS 기반의 Laravel 전용 서버리스 배포 플랫폼입니다. Vapor에서 Laravel 인프라를 손쉽게 시작할 수 있으며, 서버 관리의 복잡함 없이 확장 가능한 환경을 즐길 수 있습니다. Laravel의 제작진이 직접 세밀하게 튜닝했기 때문에 프레임워크와 완벽하게 연동되어, 익숙한 방식으로 Laravel 애플리케이션을 계속 개발할 수 있습니다.