题目
A(服务器)
基于ip的虚拟主机
http://a-ip1 RS1
http://a-ip2 RS2
http://a-ip3 RS3
B(服务器)
负载均衡
访问B机器 请求被转发到 a-ip1 a-ip2 a-ip3,分别接受到的请求量为 25% 25% 50%
如果有rs连续5次无法提供,则暂停转发请求 10s
A要记录真实的客户端cip
基本思路(可以做思维导图!?)
由于硬件条件不足,可以创建多台虚拟机
[用临时创建多个ip的方式实现];[最好在网页中多好标记方便查看实验结果]
[在主服务器nginx里面配置三个server]
在proxy服务器配置文件内添加proxy模块
在proxy模块里ip地址后面添加max_fail,wight等配置
在主服务器里设置log的格式
🙋:一定要在修改完配置文件后用[nginx -t]来检测配置文件是否有错误!
配置步骤
📌
##在主服务器
创建临时ip
ip addr add dev ens33 10.3.148.251/24
ip addr add dev ens33 10.3.148.252/24
ip addr add dev ens33 10.3.148.253/24
倒数后面的两个参数可以自定义----[ens33] and [10.3.148.253/24]
目前假设临时ip分别是251,252,253结尾
重启服务
systemctl restart network
ping一下看通不通
ping xxx.xxx.xxx.xxx
修改配置文件(3个主服务器)
vim /etc/nginx/nginx.conf ##编译安装路径
##以下内容一定要在http块里面写##
##第一个ip地址
server {
listen 10.3.148.147:80; ##监听此ip:端口号-80
server_name _; ##设置域名;区别同ip下不同的路径
location / {
root /usr/share/nginx/html; ##doc_root路径
index index.html; ##doc_root路径下目标路径下的html文件
}
##第二个ip地址
server {
listen 10.3.148.148:80;
server_name _;
location / {
root /usr/share/nginx/html1;
index index.html;
}
##第三个ip地址
server {
listen 10.3.148.149:80;
server_name _;
location / {
root /usr/share/nginx/html2;
index index.html;
}
######done#####
📌配置主机文件时需要注意的店
sever块一定要在http块里面
注意{}的使用它们是成对存在的
80端口通常需要写(default values)
此实验室用不同端口来代表不同主机
也可以创建临时的多个ip来代表不同主机
配置实验环境(添加目录及网站)
mkdir /usr/share/nginx/html{1,2}
echo rs2 > /usr/share/nginx/html1/index.html
echo rs3 > /usr/share/nginx/html2/index.html
📢此目的是 我们的实验是实现负载均衡
所以要有三台不同的主机;环境有限只能在一个虚拟机里面有三个虚拟ip
每个虚拟ip都要有不同的doc_root
但是我们安装的nginx的目录都是相同的
因此我们需要在/usr/share/nginx/下创建多个html{1,2,3}来区别doc_root
检测配置(重中之重)
nginx -t
重启nginx
systemctl restart nginx
测试realserver是否能通讯
方法1
curl 192.168.40.252
curl 192.168.40.251
curl 192.168.40.250
方法2
直接在浏览器里面输入此网址
💊如果是以域名输入的时候
💊这个最好在输入前在window host的本机解析里面输入我们的DNS(不然会load很慢)
以上操作全部完成就可以去设置proxy服务器!恭喜下一步!
##在proxy服务器
编辑proxy配置文件[目的:让服务器成为proxy服务器]
因为有三个不同的ip所以在用模块[upstream]来包含住三个ip
upstream后面要加上一个别名!
一定要与server里面的proxy_pass的一样
[松哥原话###此时配置让proxy跳转到某一个主机组]
proxy服务器里面的配置文件
http{
upstream ligoudan {
server 10.3.148.251:80; ##一定要在http里面
server 10.3.148.251:81; ##在server外面
server 10.3.148.251:82; ##目的为让proxy服务器能识别主服务的3个ip
}
server {
listen 80;
server_name www.gz2301.com;
location / {
proxy_pass http://ligoudan; ##服务器成为proxy的关键语句
# 配置请求头相关。为了然后端rs能够收到c-ip
proxy_set_header Host http_host;
proxy_set_header X-Real-IP remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 限制 proxy-rs 之间的各种连接建立时间
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
# 加快 rs--> proxy,proxy--client 的速率
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;
}
}
}
检查语句是否错误&&重启电脑
nginx -t
systemctl restart nginx
以上操作负载均衡以及反向代理都完成。恭喜!
有一个问题(查询RS日志谁来访问过)
因为完成反向代理有用户访问我们的3个RS都会先经过PROXY服务器
统一有proxy服务器转发到3台RS服务器
假设查看RS的服务器日志都是由PROXY的ip地址访问的
无法区分由哪一位用户访问哪一个RS主机
因此我们要用修改日志格式来区分ip地址
主要是用http_x_forwarded_for的参数来区分(转发)
修改日志格式配置(通常都是主机以及proxy服务器一并修改)
vim /etc/nginx/nginx.conf ### [配置在全局]
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;
以下是日志格式详解
remote_addr 10.3.135.4 客户端ip
$remote_user - 用户名
[$time_local] [21/Mar/2023:14:18:58 +0800] 日期
request GET / HTTP/1.1 请求方法 URI 协议/版本
status 304 http状态码
body_bytes_sent 0 请求结构体发送大小
http_referer - 请的请求是从哪跳转的
http_user_agent Mozillaxxx 客户端信息
http_x_forwarded_for - 请求从哪转发过来的
个人对转发和跳转的理解
跳转:
因为是跳所以理解为跨域的
举例---例如是我们访问百度搜查一个内容“好利来官网”,搜查到后我们点击进入好利来官网
这样就完成了跳转【从百度跳转至好利来官网】
转发:
转发我目前唯一的应用场景是proxy反向代理
一个用户访问192.168.40.1,此ip地址是proxy服务器,后面连接了好几台rs主机
他们存在一个局域网类
proxy相当于指挥员,指挥用户访问某一台rs主机,使这个请求转发到rs主机里面