当准备将 Laravel 应用程序部署到生产环境时,有一些关键步骤可以帮助确保应用程序高效稳定地运行。在本文中,我们将介绍一些最佳实践,帮助大家成功部署 Laravel 应用程序。
一、Laravel对服务器要求
Laravel 框架对服务器环境有一些基本要求。请确保 Web 服务器满足以下最低 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 扩展
二、服务器配置
1、Nginx配置
如果将应用程序部署到运行 Nginx 的服务器上,可以参考以下配置文件。这份配置文件可能需要根据实际情况进行调整。若希望更轻松地管理服务器,建议使用 Laravel 官方的部署和服务器管理工具——Laravel Forge。
确保配置文件中的所有请求都指向应用程序的 “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; } }
2、使用FrankenPHP运行Laravel应用
也可以使用 FrankenPHP 来运行 Laravel 应用。FrankenPHP 是一个由 Go 语言编写的现代 PHP 应用服务器。要使用 FrankenPHP 服务 Laravel 应用,只需运行以下命令:
frankenphp php-server -r public/
通过 FrankenPHP,还可以利用其与 Laravel Octane 的集成、HTTP/3 支持、现代压缩技术以及将 Laravel 应用打包为独立二进制文件的功能。有关更多信息,请查阅 FrankenPHP 的 Laravel 文档。
3、目录权限
Laravel 需要对 “bootstrap/cache” 和 “storage” 目录具有写权限。确保 Web 服务器进程有权写入这些目录,以避免权限问题。
三、优化
在将应用程序部署到生产环境时,应该缓存多个文件来提高性能。Laravel 提供了一个 “optimize” Artisan 命令,能将各种文件缓存起来。一般来说,应该在部署过程中运行该命令:
php artisan optimize
如果需要清除缓存,可以使用 “optimize:clear” 命令:
php artisan optimize:clear
下面是 Laravel 提供的一些具体优化命令:
1、配置缓存
运行 “config:cache” 命令将所有配置文件合并为一个缓存文件,这样可以大大减少框架加载配置时的文件系统访问次数。部署过程中必须运行此命令:
php artisan config:cache
警告:在执行 “config:cache” 命令时,请确保只从配置文件中调用 “env” 函数。一旦配置被缓存,”.env” 文件将不会被加载,所有对 “.env” 变量的 “env” 函数调用都会返回 “null”。
2、事件缓存
为了提高性能,应在部署过程中缓存应用程序的自动发现事件和监听器映射。可以使用以下命令来实现:
php artisan event:cache
3、路由缓存
对于包含大量路由的应用程序,部署时应运行 “route:cache” 命令。此命令将所有路由注册转换为一个缓存文件,能显著提高路由注册的性能。
php artisan route:cache
4、视图缓存
为了提高视图渲染的性能,可以通过以下命令预编译所有的 Blade 视图:
php artisan view:cache
会确保视图不会在每个请求时动态编译,从而提高应用响应速度。
5、调试模式
在生产环境中,”config/app.php” 配置文件中的 “debug” 设置决定了向用户显示的错误信息的详细程度。默认情况下,”debug” 设置为 “true”,并且依赖于 “.env” 文件中的 “APP_DEBUG” 环境变量。
注意:在生产环境中,”APP_DEBUG” 必须设置为 “false”。 如果在生产环境中将其设置为 “true”,可能会泄露敏感配置给终端用户,造成安全风险。
四、健康检查路由
Laravel 提供了内置的健康检查路由,用于监控应用程序的运行状态。在生产环境中,可以通过该路由将应用的健康状态报告给负载均衡器、Kubernetes 或其他监控系统。
默认情况下,健康检查路由位于 “/up”,如果应用正常运行,将返回 HTTP 200 响应;如果应用出现问题,将返回 HTTP 500 响应。可以在应用的 “bootstrap/app” 文件中配置此路由的 URI:
->withRouting( web: __DIR__.'/../routes/web.php', commands: __DIR__.'/../routes/console.php', health: '/up', // [tl! remove] health: '/status', // [tl! add] )
当访问该路由时,Laravel 会触发 “Illuminate\Foundation\Events\DiagnosingHealth” 事件,允许执行其他健康检查,比如检查数据库或缓存状态。如果检测到问题,可以在监听器中抛出异常。
五、使用Laravel Forge/Vapor部署
1、Laravel Forge
如果不想自行管理服务器配置,或者不熟悉如何配置和运行 Laravel 应用,Laravel Forge 是一个非常好的选择。
Laravel Forge 可以帮助在各种云服务提供商(如 DigitalOcean、Linode、AWS)上创建服务器,并自动安装和管理 Laravel 所需的各种服务,如 Nginx、MySQL、Redis 等。
2、Laravel Vapor
如果希望完全无服务器、自动扩展的部署平台,Laravel Vapor 是一个理想的选择。Vapor 是一个由 AWS 支持的无服务器平台,专为 Laravel 设计,可以让在无需管理服务器的情况下部署应用。
Vapor 与 Laravel 无缝集成,提供了无服务器架构的强大功能,可以轻松扩展应用,同时继续像平时一样编写 Laravel 代码。