1 准备负载均衡的环境
1.1 集群服务器部署
集群中每台服务器的配置一摸一样
- 先部署好一台LNMP服务器,上传代码信息
- 进行访问测试
- 批量部署多台web服务器
- 将nginx配置文件进行分发
- 将站点目录分发给所有主机
2 Nginx负载均衡服务器部署
2.1 部署nginx
使用ngx_http_upstream_module、ngx_http_proxy_module模块,配置lb.conf文件
基本配置:
Syntax: upstream name { ... }
Default: —
Context: http
vim lb.conf
#定义一个负载均衡集群bigsky
upstream bigsky{
server 172.16.1.7:80;
server 172.16.1.8:80;
server 172.16.1.9:80;
}
server {
listen 80;
server_name www.bigsky.cn;
location / {
#调用负载均衡集群bigsky
proxy_pass http://bigsky;
#反向代理时,转发用户真实请求host
proxy_set_header Host $http_host;
#反向代理时,记录用户源IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#后端web服务器返回错误时,跳过该服务器
proxy_next_upstream error timeout http_404 http_502;
}
}
2.1.1 调度功能
使用ngx_http_upstream_module模块
2.1.1.1 轮询分配,默认(平均)
2.1.1.2 权重分配
配置weight=,默认是1
upstream bigsky{
server 10.0.0.7:80 weight=3;
server 10.0.0.8:80 weight=2;
server 10.0.0.9:80 weight=1;
}
2.1.1.3 热备功能
配置backup,当所有其他server均无效时,backup生效
upstream bigsky{
server 10.0.0.7:80 ;
server 10.0.0.8:80 ;
server 10.0.0.9:80 backup;
}
2.1.1.4 最大失败次数--健康检查参数
设置max_fails=number,默认是1。达到失败次数后,认为server不可达。企业场景,建议2-3次。
2.1.1.5 失败后重传时间--健康检查参数
设置fail_timeout=time,默认是10s。当到达max_fails次数后,每隔多长时间再进行一次健康检查。常规业务2-3s比较合理。
2.1.1.6 限制最大的接收连接数
设置max_conns
upstream bigsky{
server 10.0.0.7:80 max_fails=2 fail_timeout=10 max_conns=100;
server 10.0.0.8:80 ;
server 10.0.0.9:80 ;
}
2.1.2 调度算法
使用ngx_http_upstream_module模块
1. rr 轮询调度算法,默认
2. wrr 权重调度算法,配置weight
upstream bigsky{
server 10.0.0.7:80 weight=5;
server 10.0.0.8:80 ;
server 10.0.0.9:80 ;
}
3. ip_hash 算法,源地址hash会话保持
upstream bigsky{
ip_hash;
server 10.0.0.7:80 ;
server 10.0.0.8:80 ;
server 10.0.0.9:80 ;
}
4. least_conn 根据服务器连接数分配资源
5. sticky 基于cookie的会话保持
语法sticky cookie name [expires=time] [domain=domain] [httponly] [secure] [path=path];,采用cookie插入方式
- name,cookie的名字
- expires=time,cookie过期时间,默认浏览器关闭过期
- domain=domain,哪些域名下能够使用这个cookie
- httponly,添加httponly属性到cookie
- secure,添加secure属性到cookie
- path=path,在哪个路径下使用cookie
upstream bigsky{
server 10.0.0.7:80 ;
server 10.0.0.8:80 ;
server 10.0.0.9:80 ;
sticky cookie srv_id expires=1h domain=.example.com path=/;
}
2.1.3 替换反向代理时的host
使用ngx_http_proxy_module模块,配置proxy_set_header Host $http_host;,反向代理时使用用户原有的请求host进行请求。如不配置,反向代理时,使用的是proxy_pass里的请求host。
server {
listen 80;
server_name www.bigsky.cn;
location / {
proxy_pass http://bigsky;
proxy_set_header Host $http_host;
}
}
2.1.4 反向代理时添加真实客户侧信息
使用ngx_http_proxy_module模块,配置proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;,反向代理时使用X-Forwarded-For记录用户原IP地址。
server {
listen 80;
server_name www.bigsky.cn;
location / {
proxy_pass http://bigsky;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
2.1.5 负载均衡时跳过返回错误的服务器
使用ngx_http_proxy_module模块,配置proxy_next_upstream error
Syntax: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off ...;
Default:
proxy_next_upstream error timeout;
Context: http, server, location
server {
listen 80;
server_name www.bigsky.cn;
location / {
proxy_pass http://bigsky;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout http_404 http_502;
}
}
2.2 排错思路
- 负载均衡-测试后端web节点服务器是否能正常访问
curl -H host:www.bigsky.cn 10.0.0.7/xxx.html
curl -H host:www.bigsky.cn 10.0.0.8/xxx.html
curl -H host:www.bigsky.cn 10.0.0.9/xxx.html
- 负载均衡-利用curl命令访问负载均衡服务器
- 外部ping负载均衡域名
- 配置文件编写不正确
3 负载均衡应用
3.1 根据用户访问的uri信息进行负载均衡
网站集群分离示例
实现网站集群动静分离:
- 提高网站服务安全性
- 管理操作工作简化
- 可以划分不同人员管理不同集群服务器
3.1.1 环境规划
| uri | 集群服务器地址 | 目录 | 集群类型 |
|---|---|---|---|
| /upload | 集群-10.0.0.8:80 | html/www/upload | upload服务器集群 |
| /static | 集群-10.0.0.7:80 | html/www/static | static服务器集群 |
| / | 集群-10.0.0.9:80 | html/www |
3.1.2 编写负载均衡配置文件
编写lb.conf
upstream upload{
server 10.0.0.8:80 ;
}
upstream static{
server 10.0.0.7:80 ;
}
upstream default{
server 10.0.0.9:80 ;
}
server {
listen 80;
server_name www.bigsky.cn;
location / {
proxy_pass http://default;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /upload/ {
proxy_pass http://upload;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /static/ {
proxy_pass http://static;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
3.2 根据用户访问的终端信息显示不同页面
3.2.1 环境规划
| 终端类型 | 集群服务器地址 | 访问域名 | 访问类型 | 集群类型 |
|---|---|---|---|---|
| iphone | 集群-10.0.0.7:80 | www.bigsky.cn | iphone_access | mobile移动端集群 |
| 谷歌 | 集群-10.0.0.8:80 | www.bigsky.cn | google_access | web端集群 |
| IE | 集群-10.0.0.9:80 | www.bigsky.cn | default_access | default端集群 |
3.2.2 编写负载均衡配置文件
编写lb.conf,使用$http_user_agent进行判断
upstream google{
server 10.0.0.8:80 ;
}
upstream mobile{
server 10.0.0.7:80 ;
}
upstream default{
server 10.0.0.9:80 ;
}
server {
listen 80;
server_name www.bigsky.cn;
location / {
if ($http_user_agent ~* "iphone"){
proxy_pass http://mobile;
}
if ($http_user_agent ~* "chrome"){
proxy_pass http://google;
}
proxy_pass http://default;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
4 利用redis解决后端session共享问题
4.1 后端php环境
修改/etc/php.ini文件
session.save_handler = redis
session.save_path = "tcp://redis ip地址:6379"
#如果redis存在密码,使用下面配置
session.save_path = "tcp://redis ip地址:6379?auth=密码"
注释php-fpm.d/www.conf里面内容,避免session内容写入本机文件,php注释使用;
;php_value[session.save_handler] = files
;php_value[session.save_path] = /var/lib/php/session
5 四层负载均衡配置
编译安装时需要加入--with-stream模块
创建4层负载配置文件
mkdir /usr/local/nginx/stream.conf.d
vim /usr/local/nginx/stream.conf.d/lb.conf
stream {
log_format proxy '$remote_addr $remote_port - [$time_local] $status $protocol '
'"$upstream_addr" "$upstream_bytes_sent" "$upstream_connect_time"' ;
access_log /usr/local/nginx/logs/proxy.log proxy;
upstream lb {
server 172.16.1.5:80 max_fails=3 fail_timeout=30s;
server 172.16.1.6:80 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
proxy_connect_timeout 3s;
proxy_timeout 30s;
proxy_pass lb;
}
}
编辑nginx.conf文件,include4层负载配置文件
events {
...
}
include /usr/local/nginx/stream.conf.d/*.conf
http {
...
}













网友评论