附加一份Apache的配置文件参数
本博文的前期环境准备参考:博客《nginx简单实现负载均衡》
负载均衡配置指令详细
负载均衡模块:upstream
作用:定义可以进行负载均衡后端节点信息
配置方式参考(当前是least_conn模式)
[root@lb01 conf.d]# cat /etc/nginx/nginx.conf
user nginx;
worker_processes 1;
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;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
#include /etc/nginx/conf.d/*.conf;
upstream oldboy {
least_conn;
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;
}
}
}
upstream模块功能作用:(这个模块配置在HTTP模块中,一般在upstream后面还有一个HTTP的}括号)
有效定义分配负载均衡方式
1)默认采用轮询方式分配资源:平均分配
2)按比例分配资源信息(weight)配置权重信息
upstream oldboy {
server 10.0.0.7:80 weight=10;
server 10.0.0.8:80 weight=1;
server 10.0.0.9:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://oldboy;
}
}
3)根据服务器连接数量分配资源 least_conn 比较闲会分配更多的资源
upstream oldboy {
least_conn;
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;
}
}
4)根据请求处理能力分配资源: fair 根据节点处理效率
5)根据hash算法分配资源信息 ip_hash 测试效果就是一直是一个web信息,相当于一个厨师负责一个桌客人的菜,一直都是一个厨师负责。
upstream oldboy {
ip_hash;
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;
}
}
进行后端节点健康检查 LVS没有健康检查功能。
用户访问网站 www.oldboy.com —负载均衡 --web01 服务正常状态 正常响应
1)设置失败访问次数 给一个节点几次机会(连续) max_files默认数值为1
upstream oldboy {
server 10.0.0.7:80 max_fails=3;
server 10.0.0.8:80 max_fails=3;
server 10.0.0.9:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://oldboy;
}
}
2)设置检查超时时间 多久之后再对用问题的节点进行检查
默认是10s
upstream oldboy {
server 10.0.0.7:80 max_fails=3 fail_timeout=10s;
server 10.0.0.8:80 max_fails=3 fail_timeout=10s;
server 10.0.0.9:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://oldboy;
}
}
3)设置热备服务器 (情侣备胎)
upstream oldboy {
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80 backup;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://oldboy;
}
}
反向代理模块:proxy_pass
1)指定调用集群信息
proxy_pass http://oldboy;
2)识别用户请求host信息
proxy_set_header host $host
; —设置修改负载均衡HTTP请求报文中请求头内容
调用负载均衡HTTP请求报文中的host提取,并修改为$host (调用用户请求报文中host)
修改web节点信息:
1加载bbs网站信息 (web01 web02 web03)
vim /etc/nginx/nginx.conf
include /etc/nginx/conf.d/www.conf;
include /etc/nginx/conf.d/bbs.conf;
2 在站点目录下创建首页文件
web01:
echo bbs01-info >/html/bbs/index.html
web02
echo bbs02-info >/html/bbs/index.html
web03
echo bbs03-info >/html/bbs/index.html
提示
:这里的bbs.conf文件内容一致;都是:
server {
listen 80;
server_name bbs.oldboy.com;
location / {
root /html/bbs/;
index index.html;
}
}
3 访问测试过程(lb01)
注意
:这个是在负载均衡服务器作为用户进行访问的。也就是没有负载均衡,用户直接网站时。一切正常。
[root@lb01 conf.d]# curl -H host:bbs.oldboy.com 10.0.0.7
web01-info
[root@lb01 conf.d]# curl -H host:bbs.oldboy.com 10.0.0.7
bbs01-info
[root@lb01 conf.d]# curl -H host:bbs.oldboy.com 10.0.0.8
bbs02-info
[root@lb01 conf.d]# curl -H host:bbs.oldboy.com 10.0.0.9
bbs03-info
[root@lb01 conf.d]# curl -H host:www.oldboy.com 10.0.0.9
web03-info
[root@lb01 conf.d]# curl -H host:www.oldboy.com 10.0.0.8
web02-info
[root@lb01 conf.d]# curl -H host:www.oldboy.com 10.0.0.7
web01-info
如果是用户经过负载均衡在访问网站时:(在web服务器作为用户,访问负载服务器)
[root@web01 conf.d]# curl -H host:bbs.oldboy.com 10.0.0.31
web02-info
[root@web01 conf.d]# curl -H host:bbs.oldboy.com 10.0.0.31
web01-info
[root@web01 conf.d]# curl -H host:bbs.oldboy.com 10.0.0.31
web02-info
[root@web01 conf.d]# curl -H host:www.oldboy.com 10.0.0.31
web01-info
[root@web01 conf.d]# curl -H host:www.oldboy.com 10.0.0.31
web02-info
[root@web01 conf.d]# curl -H host:www.oldboy.com 10.0.0.31
出现了问题:怎么访问bbs出现www的页面???
原因:因为两个网址都符合四层的匹配条件,然后因为在主配置文件中的文件加载顺序的原因,导致访问不同域名仍然出现同一个服务器内容。最直接的原因是因为post头部携带的信息发生了改变,不再是一开始指定的www.oldboy.com信息(默认修改为了oldboy信息)
nginx.conf中include位置越靠前越优先加载
如果include是*.conf,则根据字母顺序优先级匹配
而负载均衡的识别host头部信息的作用就可以解决这个问题
负载均衡配置:
upstream oldboy {
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80 backup;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://oldboy;
proxy_set_header host $host;
}
}
再次测试:
[root@web01 conf.d]# curl -H host:www.oldboy.com 10.0.0.31
web01-info
[root@web01 conf.d]# curl -H host:www.oldboy.com 10.0.0.31
web02-info
[root@web01 conf.d]# curl -H host:bbs.oldboy.com 10.0.0.31
bbs01-info
[root@web01 conf.d]# curl -H host:bbs.oldboy.com 10.0.0.31
bbs02-info
[root@web01 conf.d]# curl -H host:bbs.oldboy.com 10.0.0.31
bbs01-info
一切正常。利用负载均衡可以加载不同网站页面。
3)识别用户真实IP地址信息
$http_x_forwarded for —日志格式变量用于记录真实用户IP地址
用户访问 --- 负载均衡(记录用户IP地址) --- web服务器(查看用户IP地址)
HTTP请求报文(IP地址信息) --> 识别真实用户地址
proxy_set_header —设置负载均衡请求头的信息
proxy_set_header X-Forwarded-For $remoe_addr;
负载均衡配置:
upstream oldboy {
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80 backup;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://oldboy;
proxy_set_header host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
这个配置好以后在日志中查看真实的IP地址。
注意:
如图所示,访问负载均衡,负载均衡将访问给到了第一台web01服务器,那么在web01的服务器上查看日志才能看到真实IP地址
,不能是在负载均衡的服务器上查看日志。那样是看不到的。
日志信息如下:
10.0.0.31 - - [17/Feb/2020:09:31:09 -0500] "GET / HTTP/1.0" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36" "10.0.0.1"
10.0.0.31 - - [17/Feb/2020:09:31:09 -0500] "GET / HTTP/1.0" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36" "10.0.0.1"
10.0.0.31 - - [17/Feb/2020:09:35:00 -0500] "GET / HTTP/1.0" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36" "10.0.0.1"
4)负载均衡健康检查并不能对页面信息做检测检查,如何处理
实现对网站页面进行健康检查
proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429
解决
:监控网站页面是否正常,负载均衡只返回用户正确页面。
如下的配置中:
如果页面出现403的错误,那么负载就不会将请求发送给他,保证用户看不到出错页面。
负载配置信息:
upstream oldboy {
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80 backup;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://oldboy;
proxy_set_header host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout invalid_header http_403;
}
}
负载均衡企业中实际应用
1)实现网站动静分离过程
动静分离的架构 --URI信息不同
访问URI信息 静态资源 —静态集群
访问URI信息 动态资源 ----动态集群
架构环境规划:
用户请求(URI) 处理请求服务器 站点目录 功能
/upload 10.0.0.8:80 (upload) html/www/upload upload服务器
/static 10.0.0.7:80 (static) html/www/static static静态服务器
/ 10.0.0.9:80 (默认) html/www 默认
第一个历程:在后端节点上创建不同集群节点资源
· 上传集群节点配置: 10.0.0.8
编写nginx.conf / 修改站点目录
www - server 站点目录 /html/www/upload
mkdir /html/www/upload -p
echo upload-page > /html/www/upload/index.html
· 静态集群节点配置: 10.0.0.7
编写nginx.conf / 修改站点目录
www - server 站点目录 /html/www/static/
mkdir /html/www/static
echo static-page >/html/www/static/index.html
第二个历程:修改负载均衡j节点的配置文件
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 localhost;
location /upload {
proxy_pass http://upload;
proxy_set_header host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
location /static {
proxy_pass http://static;
proxy_set_header host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout invalid_header http_403;
}
location / {
proxy_pass http://default;
proxy_set_header host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout invalid_header http_403;
}
}
}
第三历程:其实没有第三个历程了,但是容易出错,就把和这个给放到这儿吧。
web01
的www.conf配置文件
[root@web01 static]# cat /etc/nginx/conf.d/www.conf
server {
listen 80;
server_name www.oldboy.com;
location / {
root /html/www/;
index index.html;
}
}
web02
的www.conf配置文件
server {
listen 80;
server_name www.oldboy.com;
location / {
root /html/www/;
index index.html;
}
}
注意新添加的文件后属主属组是否和/html/www下面
一样。
注意:单点配置IP地址以及动态静态划分和负载主配置文件中指定的是否一样
。
2)实现根据用户端不同显示不同页面
架构环境规划
手机端集群 iphone 10.0.0.7 显示页面信息 iphone-page
电脑端集群 PC 10.0.0.8 显示页面信息 PC-page
第一个历程:配置负载均衡节点信息
iphone集群中的节点: 10.0.0.7
echo iphone-page > /html/www/index.html
PC集群中的节点: 10.0.0.8
echo PC-page > /html/www/index.html
第二个历程:负载均衡配置信息
upstream PC {
server 10.0.0.8:80;
}
upstream iphone {
server 10.0.0.7:80;
}
server {
listen 80;
server_name localhost;
location / {
if ($http_user_agent ~* "iphone|Android") {
proxy_pass http://iphone;
}
if ($http_user_agent ~* "chrome") {
proxy_pass http://PC;
}
proxy_set_header host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout invalid_header http_403;
}
}