1、反向代理负载均衡服务概述
反向代理:
外网主机---互联网---中介---内网主机
正向代理:
内网主机---互联网---中介---外网主机(翻墙)
反向代理:nginx, 类似中介,中介帮你处理。
负载均衡:lvs,数据转发,帮你转发请求。
2、反向代理负载均衡配置过程
# 在负载均衡服务器上进行测试
[root@lb01 ~]# curl -H host:www.oldboy.com 10.0.0.7/oldboy.html
web01 www.oldboy.com
[root@lb01 ~]# curl -H host:www.oldboy.com 10.0.0.8/oldboy.html
web02 www.oldboy.com
[root@lb01 ~]# curl -H host:www.oldboy.com 10.0.0.9/oldboy.html
web03 www.oldboy.com
# 负载均衡配置部署
upstream --- 负载均衡模块
proxy_pass --- 反向代理模块
[root@lb01 nginx]# cat nginx.conf
user www;
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
keepalive_timeout 0;
upstream oldboy { --- 定义可以进行负载的web节点信息
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://oldboy; --- 反向代理将请求发送给指定集群
}
}
}
3、负载均衡 upstream 模块详细说明
1) weight: 权重参数
可以实现权重轮训分配资源, 默认是轮训分配资源
upstream oldboy {
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) least_conn: 按照节点连接数分配资源
upstream oldboy {
least_conn;
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80;
}
3) ip_hash: 确保一个用户多次访问, 负载均衡都会分配给相同web节点 了解
用户01(100人): 10.0.0.1 --- 001 (产生的哈希值是001) web01
用户02: 11.0.0.1 --- 011 web02
用户03: 12.0.0.1 --- 112 web03
000 ~ 150 (总的哈希值范围)
000 ~ 050 --> web01 100
051 ~ 100 --> web02
101 ~ 150 --> web03
会造成负载不均情况
优选:
用户01 --> web01(缓存客户端 memcache-php) 用户01登录信息
用户02 ---> lb01 --> web02(缓存客户端 memcache-php) 用户02登录信息 --> 缓存服务器 memcached (会话记录)
用户03 --> web03(缓存客户端 memcache-php) 用户03登录信息 session会话共享服务器
upstream oldboy {
ip_hash;
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80;
}
4) 负载均衡节点健康检查
max_fails=3 --- 最大的失败次数 lb01 --- http请求 --- web02
fail_timeout=30s --- 失败超时时间
请求 --- web01 1次失败 2次失败 3次失败,连续失败3次后,会在30秒之后再给一次机会,1次失败后,又是马上30s,并将请求给web02
请求 --- web02 1次成功
upstream oldboy {
server 10.0.0.7:80 max_fails=10 fail_timeout=60s;
server 10.0.0.8:80;
server 10.0.0.9:80;
}
5) 节点备份功能
upstream oldboy {
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80 backup;
}
备胎式备份, 只要有好的, 就不会用;当10.0.0.7 和 10.0.0.8 都不行了,才会用10.0.0.9
4、负载均衡 proxy 反向代理模块详细说明
proxy_pass: 反向代理指令
proxy_set_header: 设置请求头信息
01. 访问负载均衡可以显示不同网站页面
# 不设置的话,后端服务器看到请求头的 Host 信息是upstream模块定义的名字。
proxy_set_header Host $host;
02. 使网站节点日志可以记录真实IP地址
# $remote_addr 客户端ip, 负载均衡为服务端,记录下客户端的ip,赋值给X-Forwarded-For。
proxy_set_header X-Forwarded-For $remote_addr;
03. 检查网站页面是否正确
# 负载均衡拿到web读武器d的结果,如果遇到404的错误,不给用户,找upstream 定义的主机里的下一台,返回给用户。
proxy_next_upstream error timeout http_404;
location / {
proxy_pass http://oldboy;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404;
}
5、网站服务动静分离
[root@lb01 nginx]# cat nginx.conf
user www;
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
keepalive_timeout 0;
upstream upload {
server 10.0.0.7:80;
}
upstream static {
server 10.0.0.8:80;
}
upstream default {
server 10.0.0.9:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://default;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404;
}
location /upload/ {
proxy_pass http://upload;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404;
}
location /static/ {
proxy_pass http://static;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404;
}
}
}
6、网站服务根据客户端显示不同页面
[root@lb01 nginx]# cat nginx.conf
user www;
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
keepalive_timeout 0;
upstream iphone {
server 10.0.0.7:80;
}
upstream chrome {
server 10.0.0.8:80;
}
upstream default {
server 10.0.0.9:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://default;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404;
if ($http_user_agent ~* iphone) {
proxy_pass http://iphone;
}
if ($http_user_agent ~* Chrome) {
proxy_pass http://chrome;
}
}
}
}