Ubuntu LNMP实现负载均衡的完整步骤
在开始配置前,需确保所有服务器(负载均衡器+后端服务器)均满足以下条件:
Nginx是LNMP架构中最常用的负载均衡器,通过upstream模块定义后端服务器组,并将请求分发至各服务器。
sudo apt update
sudo apt install nginx
打开Nginx配置文件(通常为/etc/nginx/sites-available/default或/etc/nginx/nginx.conf),在http块中添加upstream模块,定义后端服务器组:
http {
# 定义后端服务器组(示例为3台服务器)
upstream backend {
server 192.168.1.101:80; # 后端服务器1
server 192.168.1.102:80; # 后端服务器2
server 192.168.1.103:80; # 后端服务器3
}
# 配置负载均衡服务器
server {
listen 80;
server_name yourdomain.com; # 替换为你的域名或IP
location / {
proxy_pass http://backend; # 将请求转发至后端服务器组
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
Nginx支持多种负载均衡算法,默认为轮询(Round Robin)(按顺序分发请求)。可根据业务需求调整:
weight参数),权重越高,接收的请求越多(适合服务器性能不均衡的场景)。upstream backend {
server 192.168.1.101 weight=3; # 权重3,接收3/5的请求
server 192.168.1.102 weight=2; # 权重2,接收2/5的请求
server 192.168.1.103 weight=1; # 权重1,接收1/5的请求
}
upstream backend {
ip_hash; # 启用IP哈希
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
}
upstream backend {
least_conn; # 启用最少连接
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
}
保存配置文件后,测试语法是否正确:
sudo nginx -t
若输出syntax is ok,则重启Nginx使配置生效:
sudo systemctl restart nginx
若后端服务器运行PHP应用(如WordPress、Laravel),需确保PHP-FPM已正确配置,能接收Nginx转发的请求。
sudo apt install php-fpm php-mysql
打开PHP-FPM池配置文件(通常为/etc/php/8.1/fpm/pool.d/www.conf,版本号根据实际安装调整):
[www]
listen = /run/php/php8.1-fpm.sock # 监听Unix套接字(推荐)或端口(如127.0.0.1:9000)
listen.owner = www-data
listen.group = www-data
pm = dynamic # 动态调整进程数
pm.max_children = 10 # 最大子进程数(根据服务器内存调整)
pm.start_servers = 2 # 启动时的子进程数
pm.min_spare_servers = 1 # 最小空闲子进程数
pm.max_spare_servers = 3 # 最大空闲子进程数
sudo systemctl restart php8.1-fpm
若应用需要处理大量数据库请求,可通过MySQL主从复制实现读写分离,减轻主库压力。
编辑主服务器MySQL配置文件(/etc/mysql/mysql.conf.d/mysqld.cnf):
[mysqld]
server-id = 1 # 主库ID(唯一)
log_bin = /var/log/mysql/mysql-bin.log # 开启二进制日志
binlog_do_db = your_database # 需要同步的数据库名
重启MySQL:
sudo systemctl restart mysql
创建复制用户并授权:
CREATE USER 'replicator'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;
查看主库二进制日志位置(用于从库配置):
SHOW MASTER STATUS;
记录File(如mysql-bin.000001)和Position(如154)的值。
编辑从服务器MySQL配置文件:
[mysqld]
server-id = 2 # 从库ID(唯一,不能与主库重复)
relay_log = /var/log/mysql/mysql-relay-bin.log # 开启中继日志
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = your_database
read_only = 1 # 设置为只读(防止误操作)
重启MySQL:
sudo systemctl restart mysql
配置从库连接主库:
CHANGE MASTER TO
MASTER_HOST='主库IP',
MASTER_USER='replicator',
MASTER_PASSWORD='your_password',
MASTER_LOG_FILE='mysql-bin.000001', # 主库记录的File值
MASTER_LOG_POS=154; # 主库记录的Position值
START SLAVE; # 启动复制
检查复制状态(Slave_IO_Running和Slave_SQL_Running应为Yes):
SHOW SLAVE STATUS\G;
通过浏览器或命令行工具(如curl)访问负载均衡器的IP或域名,观察请求是否被分发至不同后端服务器:
curl http://yourdomain.com
若后端服务器配置了不同的页面内容(如index.php中输出服务器IP),可通过多次请求确认请求被分发至不同服务器。
max_fails和fail_timeout参数排除故障服务器(如server 192.168.1.101 max_fails=3 fail_timeout=30s;,表示30秒内连续失败3次则暂时剔除)。ip_hash算法或通过Redis实现分布式会话。