Ubuntu PHP应用如何进行负载均衡
导读:Ubuntu PHP应用的负载均衡实践 一、架构选型与适用场景 应用层负载均衡:使用 Nginx 的 upstream 将 HTTP 请求分发到多台运行 PHP-FPM 的应用服务器(适合多机横向扩展,简单可靠)。 进程内负载均衡:在同一...
Ubuntu PHP应用的负载均衡实践
一、架构选型与适用场景
- 应用层负载均衡:使用 Nginx 的 upstream 将 HTTP 请求分发到多台运行 PHP-FPM 的应用服务器(适合多机横向扩展,简单可靠)。
- 进程内负载均衡:在同一台机器上运行多个 PHP-FPM 实例(不同 Unix socket 或 端口),由 Nginx 按请求分发到不同实例(提升单机并发与资源利用)。
- 专用负载均衡器:使用 HAProxy 作为前端,后端对接多台应用服务器或多实例 PHP-FPM(适合更复杂的调度、健康检查与观测)。
二、方案一 Nginx 应用层负载均衡(多台服务器)
- 前置条件
- 多台 Ubuntu 服务器已安装 Nginx + PHP-FPM,应用代码与目录结构一致,且 session 共享(如 Redis/Memcached)与上传目录(如 /var/www/uploads)已做共享或禁用上传。
- 负载均衡器配置(示例)
- 编辑 /etc/nginx/sites-available/default 或 /etc/nginx/nginx.conf 的 http 段:
http { upstream php_app { least_conn; # 或 round-robin server 10.0.0.11:80 max_fails=3 fail_timeout=30s; server 10.0.0.12:80 max_fails=3 fail_timeout=30s; server 10.0.0.13:80 max_fails=3 fail_timeout=30s; } server { listen 80; server_name your_domain.com; root /var/www/html; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_pass php_app; # 指向 upstream 名称 } location ~ /\.ht { deny all; } } } - 每台后端 Nginx 将 PHP 请求转发到本机 PHP-FPM(以 PHP 7.4 为例):
location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_pass unix:/run/php/php7.4-fpm.sock; }
- 编辑 /etc/nginx/sites-available/default 或 /etc/nginx/nginx.conf 的 http 段:
- 生效与验证
- 检查并重载:sudo nginx -t & & sudo systemctl reload nginx
- 验证分发:在各后端写入差异化 /health.php,多次 curl 观察命中分布。
三、方案二 Nginx 进程内负载均衡(单机多 PHP-FPM 实例)
- 适用场景:单机多核,提升 PHP-FPM 并发与稳定性。
- 步骤
- 复制并调整 PHP-FPM 池(以 PHP 7.4 为例):
sudo cp /etc/php/7.4/fpm/pool.d/www.conf /etc/php/7.4/fpm/pool.d/www1.conf sudo cp /etc/php/7.4/fpm/pool.d/www.conf /etc/php/7.4/fpm/pool.d/www2.conf- www1.conf:
listen = /run/php/php7.4-fpm-www1.sock - www2.conf:
listen = /run/php/7.4-fpm-www2.sock - 确保运行用户与权限一致(如 www-data),并调整 pm 参数(如 pm.max_children)。
- www1.conf:
- 重启 PHP-FPM:sudo systemctl restart php7.4-fpm
- 配置 Nginx 使用 upstream 分发到多个 Unix socket:
upstream php_backend { least_conn; server unix:/run/php/php7.4-fpm-www1.sock; server unix:/run/php/php7.4-fpm-www2.sock; } server { listen 80; root /var/www/html; index index.php; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_pass php_backend; } } - 生效:sudo nginx -t & & sudo systemctl reload nginx
- 验证:观察不同 PHP-FPM 进程处理请求的情况(如 status 页面或日志)。
- 复制并调整 PHP-FPM 池(以 PHP 7.4 为例):
四、方案三 使用 HAProxy 作为前端负载均衡器
- 安装:sudo apt update & & sudo apt install haproxy
- 配置 /etc/haproxy/haproxy.cfg(示例为应用层分发到多台 HTTP 服务器):
global log /dev/log local0 log /dev/log local1 notice daemon defaults log global mode http option httplog option dontlognull timeout connect 5000ms timeout client 50000ms timeout server 50000ms frontend http_front bind *:80 default_backend http_back backend http_back balance roundrobin server app1 10.0.0.11:80 check server app2 10.0.0.12:80 check server app3 10.0.0.13:80 check - 生效:sudo systemctl restart haproxy
- 可选:若需直接转发到本机多个 PHP-FPM socket,可将 backend 改为:
并确保 HAProxy 有权限访问这些 socket。backend php_fpm_back balance roundrobin server fpm1 unix:/run/php/php7.x-fpm-www1.sock check server fpm2 unix:/run/php/php7.x-fpm-www2.sock check
五、关键注意事项与优化
- 会话与缓存:使用 Redis/Memcached 集中存储 PHP session,避免单机粘滞导致负载不均;静态资源使用 Nginx 直接服务或 CDN。
- 文件上传:将上传目录(如 /var/www/uploads)放在共享存储(如 NFS/对象存储),或在负载均衡器层做特殊处理。
- 健康检查与容错:配置 max_fails/fail_timeout(Nginx)或 check(HAProxy),自动摘除异常实例。
- 日志与观测:集中收集 Nginx access/error 与 PHP-FPM slow/error 日志;按需接入 Prometheus + Grafana 做容量与性能观测与告警。
- 安全加固:限制管理接口与状态页访问;对外仅暴露 80/443;使用 TLS;为 Unix socket 设置合适的权限(如 www-data)。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu PHP应用如何进行负载均衡
本文地址: https://pptw.com/jishu/783976.html
