배포
소개
Laravel 애플리케이션을 프로덕션 환경에 배포할 준비가 되었을 때, 애플리케이션이 최대한 효율적으로 실행되도록 하기 위해 할 수 있는 몇 가지 중요한 사항이 있습니다. 이 문서에서는 Laravel 애플리케이션을 올바르게 배포하기 위한 몇 가지 훌륭한 시작점을 다룰 것입니다.
서버 요구 사항
Laravel 프레임워크에는 몇 가지 시스템 요구 사항이 있습니다. 웹 서버에 다음 최소 PHP 버전 및 확장이 있는지 확인해야 합니다.
- PHP >= 8.2
- Ctype PHP 확장
- cURL PHP 확장
- DOM PHP 확장
- Fileinfo PHP 확장
- Filter PHP 확장
- Hash PHP 확장
- Mbstring PHP 확장
- OpenSSL PHP 확장
- PCRE PHP 확장
- PDO PHP 확장
- Session PHP 확장
- Tokenizer PHP 확장
- XML PHP 확장
서버 구성
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 ~ ^/index\.php(/|$) { fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; fastcgi_hide_header X-Powered-By; } location ~ /\.(?!well-known).* { deny all; }}
FrankenPHP
FrankenPHP는 Laravel 애플리케이션을 서비스하는 데에도 사용할 수 있습니다. FrankenPHP는 Go로 작성된 최신 PHP 애플리케이션 서버입니다. FrankenPHP를 사용하여 Laravel PHP 애플리케이션을 서비스하려면 간단히 php-server 명령을 호출하면 됩니다:
frankenphp php-server -r public/
FrankenPHP에서 제공하는 더욱 강력한 기능(예: Laravel Octane 통합, HTTP/3, 최신 압축 또는 Laravel 애플리케이션을 독립형 바이너리로 패키징하는 기능)을 활용하려면 FrankenPHP의 Laravel 문서를 참조하십시오.
디렉토리 권한
Laravel은 bootstrap/cache 및 storage 디렉토리에 써야 하므로 웹 서버 프로세스 소유자가 이 디렉토리에 쓸 수 있는 권한이 있는지 확인해야 합니다.
최적화
애플리케이션을 프로덕션에 배포할 때 구성, 이벤트, 라우트 및 뷰를 포함하여 캐시해야 하는 다양한 파일이 있습니다. Laravel은 이러한 모든 파일을 캐시하는 편리한 단일 optimize Artisan 명령을 제공합니다. 이 명령은 일반적으로 애플리케이션 배포 프로세스의 일부로 호출해야 합니다.
php artisan optimize
optimize:clear 메서드는 optimize 명령으로 생성된 모든 캐시 파일과 기본 캐시 드라이버의 모든 키를 제거하는 데 사용할 수 있습니다.
php artisan optimize:clear
다음 문서에서는 optimize 명령으로 실행되는 각 세분화된 최적화 명령에 대해 설명합니다.
구성 캐싱
애플리케이션을 프로덕션에 배포할 때 배포 프로세스 중에 config:cache Artisan 명령을 실행해야 합니다.
php artisan config:cache
이 명령어는 Laravel의 모든 설정 파일을 단일 캐시 파일로 결합하여 프레임워크가 설정 값을 로드할 때 파일 시스템으로 이동해야 하는 횟수를 크게 줄입니다.
배포 과정 중에 config:cache 명령어를 실행하는 경우, 설정 파일 내에서만 env 함수를 호출하는지 확인해야 합니다. 설정이 캐시되면 .env 파일이 로드되지 않으며, .env 변수에 대한 env 함수 호출은 모두 null을 반환합니다.
이벤트 캐싱
배포 과정 중에 애플리케이션의 자동 검색된 이벤트와 리스너 매핑을 캐시해야 합니다. 이는 배포 중에 event:cache Artisan 명령어를 호출하여 수행할 수 있습니다.
php artisan event:cache
라우트 캐싱
많은 라우트를 사용하는 대규모 애플리케이션을 구축하는 경우, 배포 과정 중에 route:cache Artisan 명령어를 실행해야 합니다.
php artisan route:cache
이 명령어는 모든 라우트 등록을 캐시된 파일 내에서 단일 메서드 호출로 줄여 수백 개의 라우트를 등록할 때 라우트 등록 성능을 향상시킵니다.
뷰 캐싱
애플리케이션을 프로덕션에 배포할 때, 배포 과정 중에 view:cache Artisan 명령어를 실행해야 합니다.
php artisan view:cache
이 명령은 모든 Blade 뷰를 미리 컴파일하여 요청 시 컴파일되지 않도록 하여 뷰를 반환하는 각 요청의 성능을 향상시킵니다.
디버그 모드
config/app.php 구성 파일의 디버그 옵션은 오류에 대한 정보가 사용자에게 실제로 얼마나 많이 표시되는지 결정합니다. 기본적으로 이 옵션은 애플리케이션의 .env 파일에 저장된 APP_DEBUG 환경 변수의 값을 따르도록 설정됩니다.
프로덕션 환경에서는 이 값이 항상 false여야 합니다. 프로덕션 환경에서 APP_DEBUG 변수가 true로 설정된 경우, 애플리케이션의 최종 사용자에게 민감한 구성 값이 노출될 위험이 있습니다.
상태 확인 경로
Laravel은 애플리케이션의 상태를 모니터링하는 데 사용할 수 있는 내장 상태 확인 경로를 포함합니다. 프로덕션 환경에서 이 경로는 애플리케이션의 상태를 가동 시간 모니터, 로드 밸런서 또는 Kubernetes와 같은 오케스트레이션 시스템에 보고하는 데 사용될 수 있습니다.
기본적으로 상태 확인 경로는 /up에서 제공되며, 예외 없이 애플리케이션이 부팅되면 200 HTTP 응답을 반환합니다. 그렇지 않으면 500 HTTP 응답이 반환됩니다. 애플리케이션의 bootstrap/app 파일에서 이 경로의 URI를 구성할 수 있습니다.
->withRouting( web: __DIR__.'/../routes/web.php', commands: __DIR__.'/../routes/console.php', health: '/up', health: '/status', )
이 경로에 HTTP 요청이 이루어지면 Laravel은 Illuminate\Foundation\Events\DiagnosingHealth 이벤트도 디스패치하여 애플리케이션과 관련된 추가 상태 검사를 수행할 수 있습니다. 이 이벤트의 리스너 내에서 애플리케이션의 데이터베이스 또는 캐시 상태를 확인할 수 있습니다. 애플리케이션에 문제가 감지되면 리스너에서 예외를 발생시킬 수 있습니다.
Forge/Vapor를 이용한 간편한 배포
Laravel Forge
자체 서버 구성을 관리할 준비가 안 되었거나 강력한 Laravel 애플리케이션을 실행하는 데 필요한 다양한 서비스를 구성하는 것이 익숙하지 않은 경우 Laravel Forge가 훌륭한 대안이 될 수 있습니다.
Laravel Forge는 DigitalOcean, Linode, AWS 등 다양한 인프라 제공업체에서 서버를 생성할 수 있습니다. 또한 Forge는 Nginx, MySQL, Redis, Memcached, Beanstalk 등 강력한 Laravel 애플리케이션을 구축하는 데 필요한 모든 도구를 설치하고 관리합니다.
Laravel Forge를 이용한 배포에 대한 전체 가이드가 필요하신가요? Laravel Bootcamp와 Laracasts에서 제공되는 Forge 비디오 시리즈를 확인해 보세요.
Laravel Vapor
Laravel에 최적화된 완전한 서버리스 자동 확장 배포 플랫폼을 원하시면 Laravel Vapor를 확인해 보세요. Laravel Vapor는 AWS에서 제공하는 Laravel용 서버리스 배포 플랫폼입니다. Vapor에서 Laravel 인프라를 시작하고 서버리스의 확장 가능한 단순함에 빠져보세요. Laravel Vapor는 Laravel의 제작자들이 프레임워크와 원활하게 작동하도록 미세 조정하여 익숙한 방식으로 Laravel 애플리케이션을 계속 작성할 수 있도록 합니다.