在Ubuntu上实现LNMP(Linux+Nginx+MySQL+PHP)负载均衡前,需完成以下准备工作:
sudo apt update && sudo apt install nginx -y
ping或telnet命令验证连通性。Nginx通过upstream模块定义后端服务器组,结合proxy_pass指令实现请求转发。以下是常见配置场景:
轮询是Nginx的默认负载均衡算法,按顺序将请求分发到后端服务器,适用于服务器性能相近的场景。
http {
upstream backend {
server 192.168.1.101:80; # 后端服务器1
server 192.168.1.102:80; # 后端服务器2
}
server {
listen 80;
server_name example.com; # 负载均衡器域名
location / {
proxy_pass http://backend; # 转发至backend服务器组
proxy_set_header Host $host; # 保留原始主机头
proxy_set_header X-Real-IP $remote_addr; # 记录客户端真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 记录代理路径IP
}
}
}
说明:proxy_set_header指令用于传递客户端真实信息,避免后端应用无法获取正确IP。
若后端服务器性能差异较大(如CPU、内存不同),可通过weight参数分配权重,权重越高,处理的请求数越多。
upstream backend {
server 192.168.1.101:80 weight=3; # 权重3,处理约50%请求
server 192.168.1.102:80 weight=1; # 权重1,处理约25%请求
}
适用场景:高性能服务器承担更多流量,提升整体资源利用率。
对于需要会话保持的应用(如用户登录状态、购物车数据),ip_hash指令可根据客户端IP地址进行哈希运算,确保同一IP的请求始终分发到同一后端服务器。
upstream backend {
ip_hash; # 启用IP哈希
server 192.168.1.101:80;
server 192.168.1.102:80;
}
注意:若后端服务器需要扩容或缩容,IP哈希可能导致会话失效,需谨慎使用。
least_conn指令将请求分发到当前连接数最少的服务器,适用于处理动态内容(如PHP、数据库查询)且服务器负载波动较大的场景。
upstream backend {
least_conn; # 启用最少连接
server 192.168.1.101:80;
server 192.168.1.102:80;
}
优势:动态调整流量分配,避免某台服务器过载。
Nginx Plus(商业版)支持内置健康检查,开源版可通过max_fails和fail_timeout参数模拟健康检查:
upstream backend {
server 192.168.1.101:80 max_fails=3 fail_timeout=30s; # 3次失败后,30秒内不再使用
server 192.168.1.102:80 max_fails=3 fail_timeout=30s;
}
说明:max_fails表示允许的最大失败次数,fail_timeout表示失败后的冷却时间。
若后端应用使用PHP,需确保每台服务器上的PHP-FPM配置合理,以处理并发请求。编辑/etc/php/7.4/fpm/pool.d/www.conf(根据PHP版本调整):
[www]
listen = /var/run/php/php7.4-fpm.sock # 使用Unix socket(性能更高)
listen.allowed_clients = 127.0.0.1 # 允许Nginx访问
pm = dynamic # 动态进程管理
pm.max_children = 50 # 最大子进程数(根据服务器内存调整)
pm.start_servers = 10 # 启动时的子进程数
pm.min_spare_servers = 5 # 最小空闲子进程数
pm.max_spare_servers = 20 # 最大空闲子进程数
说明:调整pm.max_children需考虑服务器内存(每个PHP进程约占用10-20MB内存),避免内存耗尽。
若应用需要数据库负载均衡,可配置MySQL主从复制(读写分离):
log_bin(开启二进制日志)、server-id=1,创建复制用户。relay_log(开启中继日志)、server-id=2,执行CHANGE MASTER TO同步主服务器数据。upstream模块或专门的数据库负载均衡工具(如ProxySQL),将读请求分发到从服务器,写请求发送到主服务器。sudo nginx -t
若输出syntax is ok,说明配置正确。sudo systemctl restart nginx
tail -f /var/log/nginx/access.log,观察请求是否分发到不同服务器。ab(Apache Benchmark)工具模拟并发请求:ab -n 100 -c 10 http://example.com/
查看响应时间和请求分发情况。通过以上步骤,即可在Ubuntu的LNMP环境中实现高效的负载均衡,提升应用的可用性与性能。根据实际需求,可选择不同的负载均衡策略,并结合健康检查、性能调优等手段优化配置。