CatchAdmin PHP 后台管理框架 Logo CatchAdmin

基于多服务器 VPS 扩展 Laravel 应用的负载均衡、缓存与 Horizon 实践

随着 Laravel 应用不断增长,单台服务器很快就会难以满足性能、可靠性与可扩展性需求。无论是流量持续增长,还是后台任务数量不断增加,单服务器架构的限制都会迅速影响应用的扩展能力。

扩展 Laravel 应用通常需要搭建多服务器基础设施。这个过程具有一定复杂度,但对于提升性能与容错能力至关重要。典型的多服务器架构会包含负载均衡器、多台应用服务器、缓存服务器(通常是 Redis 或 Memcached),以及用于处理后台任务的专用 Worker 服务器。结合 Laravel Horizon,还可以进一步优化队列管理与监控。

本文受社区中关于在多服务器 VPS 环境部署 Laravel 的讨论启发,重点关注负载均衡、使用 Laravel Horizon 处理队列任务、扩展应用服务器,以及使用 Redis 做缓存等问题。文章将梳理该架构的关键组件,为每类配置提供技术示例,并说明如何扩展基础设施的各个部分以获得更高性能。

为什么多服务器 VPS 托管是扩展 Laravel 的关键

当 Laravel 应用部署在单台服务器上时,应用天然受限于该机器的硬件能力。随着流量与后台任务增加,单台服务器很快会达到上限,进而导致响应变慢、请求超时,甚至服务器崩溃。多服务器环境通过把负载分散到多台机器上来解决这个问题,并降低单点瓶颈风险。

单服务器部署的主要挑战

Web 服务器过载:单台服务器同时能处理的 HTTP 请求数量有限。随着流量增长,服务器负载可能迅速升高,请求也可能出现延迟或被丢弃。

队列处理延迟:Laravel 使用队列处理发送邮件、处理上传文件、执行 API 调用等后台任务。将队列 Worker 与 Web 应用运行在同一台服务器上会形成瓶颈,同时影响网站响应速度与任务处理效率。

扩展限制:服务器可以通过升级硬件进行纵向扩展,但纵向扩展存在上限。与持续为单台服务器增加资源相比,通过增加服务器进行横向扩展通常更高效,也更具成本优势。

多服务器托管的优势

负载均衡:使用多台 Web 服务器后,可以在它们之间分发 HTTP 流量,避免单台服务器过载。

更好的容错能力:多服务器环境中,一台服务器故障后,流量可以自动路由到健康服务器,从而减少停机时间。

职责分离:将 Web 服务器、缓存服务器与队列 Worker 隔离在不同机器上,可以优化资源使用,并避免高负载后台任务影响 Web 应用响应速度。

可扩展性:随着应用增长,增加资源会更加容易。无论需要更多 Web 服务器、缓存服务器还是队列 Worker,横向扩展都能支持应用持续增长。

在这个基础上,下面进入多服务器 Laravel 架构各部分的搭建与配置。

多服务器 VPS 架构的核心组件

在多服务器 VPS 环境中部署 Laravel 时,几个关键组件分别承担重要职责。

负载均衡器:负载均衡器将传入流量分发到多台 Web 服务器,以保证高可用性与容错能力。它可以防止某一台服务器成为瓶颈,并在应用扩展时高效处理流量。

Web 服务器(应用服务器):这些服务器运行 Laravel 应用并响应传入的 HTTP 请求。它们通常负责提供静态资源、渲染动态内容,并返回应用页面。

缓存服务器:缓存对性能至关重要。Redis 或 Memcached 服务器会缓存原本需要反复从数据库读取的数据,从而降低延迟并减少数据库负载。

队列 Worker 服务器:这些专用服务器负责在后台处理任务。Laravel 队列系统可以延迟执行发送邮件、上传文件、处理图片等耗时任务。将这类工作转移到独立服务器上,可以提升 Web 服务器响应速度。

数据库服务器:数据库是应用的核心支撑。数据库扩展通常需要复制或集群,以保证高可用性,并高效处理不断增加的读写操作。

健康检查与监控:持续监控每个组件可以保证系统处于健康状态。健康检查对负载均衡器尤其重要,因为它需要仅将流量路由到健康服务器。

多服务器 Laravel 环境搭建步骤

第 1 步 设置 Web 与应用服务器

Web 服务器负责处理 HTTP 请求并运行 Laravel 应用。在多服务器架构中,通常会配置两台或更多 Web 服务器来分担负载。

创建并配置 Web 服务器

  1. 创建多个 VPS 实例(例如 2 台或 3 台),使用 Linux 操作系统(例如 Ubuntu),并安装 PHP-FPM、Nginx 和 Laravel 依赖。

Nginx 配置示例

Nginx 经常作为 Laravel 的反向代理与 Web 服务器使用。下面是一个用于承载 Laravel 应用访问的基础 Nginx 配置。

nginx
server {
    listen 80;
    server_name yourapp.com;

    root /var/www/laravel/public;  # Point to your Laravel public directory
    index index.php index.html index.htm;

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

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;  # Adjust PHP version as needed
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    error_log /var/log/nginx/yourapp_error.log;
    access_log /var/log/nginx/yourapp_access.log;
}
  1. 在每台服务器上安装 Laravel,并确保应用代码在所有服务器之间保持同步。可以使用 Git,也可以实现 CI/CD 流水线进行持续部署,从而保证所有服务器上的应用一致。

Laravel 应用服务器 .env 示例

dotenv
APP_ENV=production
APP_DEBUG=false
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis
REDIS_HOST=redis-server.example.com
DB_HOST=db-server.example.com

共享文件存储

上传文件应使用云存储,例如 AWS S3、Google Cloud Storage、DigitalOcean Spaces,作为本地文件存储的替代方案。这样可以确保所有 Web 服务器都能访问同一批文件。

Laravel 存储配置示例

dotenv
FILESYSTEM_DRIVER=s3
AWS_ACCESS_KEY_ID=your-access-key-id
AWS_SECRET_ACCESS_KEY=your-secret-access-key
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=your-bucket-name

第 2 步 配置负载均衡器

负载均衡器负责在应用服务器之间分发 HTTP 流量。它会确保请求由健康服务器处理,并防止某一台服务器过载。

创建负载均衡器

可以使用 Nginx 或 HAProxy 作为负载均衡器。AWS ELB 或 DigitalOcean Load Balancer 这类云服务通常配置更简单。

  1. 在负载均衡 VPS 上安装 Nginx,并将其配置为把流量分发到 Web 服务器。

Nginx 负载均衡配置示例

nginx
upstream laravel_app {
    server 10.0.0.11:80;  # App Server 1
    server 10.0.0.12:80;  # App Server 2
    least_conn;            # Load balancing algorithm
}

server {
    listen 80;
    server_name yourapp.com;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://laravel_app;
    }
}

该配置使用最少连接数算法,将流量发送到当前活动连接数最少的服务器。

健康检查

  1. 在负载均衡器上配置健康检查,确保流量只路由到健康的应用服务器。

Nginx 示例:

nginx
location /health {
    access_log off;
    return 200 'healthy';
}

设置自动检查机制,让负载均衡器仅把流量路由到健康的应用服务器。

第 3 步 设置 Redis 用于缓存与队列管理

Redis 对缓存常用数据与管理后台任务队列至关重要。在多服务器架构中,Redis 可以为所有 Web 服务器与 Worker 服务器提供统一的缓存、会话与队列状态存储。

创建 Redis 服务器

  1. 创建一台独立 VPS 作为 Redis 服务器;如果需要高可用,可以使用 Redis 集群。需要确保所有 Web 服务器与 Worker 服务器都能连接到 Redis。

  2. 在 Laravel .env 文件中配置 Redis,用于缓存与队列管理。

dotenv
REDIS_HOST=redis-server.internal
REDIS_PASSWORD=your_redis_password
QUEUE_CONNECTION=redis
CACHE_DRIVER=redis
SESSION_DRIVER=redis
  1. 测试 Redis 连接,确认所有组件都能访问 Redis 服务器。可以使用 redis-cli 工具进行测试。

第 4 步 使用 Laravel Horizon 配置队列 Worker

Laravel Horizon 可以简化队列管理与扩展。它还提供界面来监控任务状态、失败情况和处理时间。

安装 Laravel Horizon

  1. 在每台应用服务器上安装 Horizon:
bash
composer require laravel/horizon
php artisan horizon:install
php artisan migrate  # Run migrations for Horizon
  1. 配置 Supervisor 管理 Horizon 进程,确保它们持续运行,并在崩溃后自动重启。

Supervisor 配置

ini
[program:horizon]
process_name=%(program_name)s
command=php /path/to/your/laravel/artisan horizon
autostart=true
autorestart=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/path/to/your/storage/logs/horizon.log

扩展 Horizon Worker

要扩展 Worker 数量,可以使用 horizon:scale 命令:

bash
php artisan horizon:scale default 20

该命令会为 default 队列增加 20 个 Worker。可以根据当前队列长度或任务优先级来扩展 Worker。

第 5 步 扩展应用

横向扩展是确保 Laravel 应用高效处理不断增加的流量与任务队列的关键。

扩展 Web 服务器

随着流量增加,可以添加更多 Web 服务器来处理负载。随后更新负载均衡器配置,将新服务器纳入上游服务列表。

扩展 Horizon Worker

当任务队列增长时,可以在 Worker 服务器上扩展 Horizon Worker 数量。Horizon 可以让 Worker 数量的动态调整更容易。

第 6 步 监控与性能优化

有效监控对于理解应用性能、确认所有组件按预期运行非常关键。

Horizon 监控:使用 Horizon 仪表盘监控任务状态、处理时间、失败情况和其他指标。

Web 服务器监控:使用 New Relic 或 Datadog 监控 Web 服务器性能,包括响应时间与资源利用率。

集中式日志:使用 ELK Stack(Elasticsearch、Logstash、Kibana)或 Graylog 实现集中式日志,聚合所有服务器的日志。

结语

使用负载均衡器、缓存服务器和 Horizon 队列管理构建多服务器 VPS 架构,是 Laravel 应用承载高流量与大规模任务队列、同时保持性能与可用性的关键方式。该架构可以灵活扩展 Web 服务器、Worker 和缓存系统等独立组件,确保应用按需增长。

通过本文提供的分步说明、技术示例和配置样例,可以为 Laravel 应用搭建稳健的多服务器环境,同时支持增长的访问流量与后台任务处理需求。随着应用规模扩大,可以相应调整服务器与 Worker 数量,确保系统保持响应迅速且性能稳定。

本作品采用《CC 协议》,转载必须注明作者和本文链接