实验环境
设置主机名
hostnamectl set-hostname xxx
一、编译安装nginx1.28(lb、web1、web2)
dnf -y install openssl-devel zlib-devel pcre-devel useradd -r -s /bin/false -m nginx
上传nginx-1.28.0.tar.gz源码包到/root目录
tar xf nginx-1.28.0.tar.gz cd nginx-1.28.0/ ./configure --prefix=/usr/local/nginx --group=nginx --user=nginx --with-http_ssl_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-http_stub_status_module --with-http_addition_module --with-http_random_index_module --with-http_slice_module make -j$(nproc) && make install chown -r nginx:nginx /usr/local/nginx/ ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx
创建systemctl管理nginx文件
tee /usr/lib/systemd/system/nginx.service <<eof [unit] description=nginx server daemon after=network.target [service] type=forking execstart=/usr/local/nginx/sbin/nginx execstop=/usr/local/nginx/sbin/nginx -s stop execreload=/usr/local/nginx/sbin/nginx -s reload killmode=process [install] wantedby=multi-user.target eof
启动nginx服务
systemctl enable --now nginx
二、准备网页
为了更好的测试,这里网站内容不一致,真是生成环境网站内容一样
web1:
echo '<h1>welcome to web1!</h1>' > /usr/local/nginx/html/index.html
web2:
- echo '<h1>welcome to web2!</h1>' > /usr/local/nginx/html/index.html
访问网页
使用浏览器访问192.168.10.41
使用浏览器访问192.168.10.42
三、配置负载均衡和反向代理(lb)
1、upstream
upstream 是 nginx 中用于定义后端服务器组的指令块,属于http 核心模块的一部分。它主要用于反向代理和负载均衡,允许将客户端请求分发到多个后端服务器(如 web 应用服务器、api 服务、数据库等)
(1)修改配置文件
vim /usr/local/nginx/conf/nginx.conf
添加:
在http字段中 upstream backend { server 192.168.10.41; server 192.168.10.42; }
proxy_pass http://backend;
(2)重启nginx服务
systemctl restart nginx
(3)访问验证
使用浏览器访问192.168.10.40
刷新
会轮询调度到每台web服务器中
2、upstream 模块的后端服务器参数
(1)backup
backup专门用于定义备用服务器,将服务器标记为备用节点(主节点不可用时启用)。
修改配置文件
vim /usr/local/nginx/conf/nginx.conf
添加:
重启nginx服务
systemctl restart nginx
验证
使用浏览器访问192.168.10.40
只能调度到web1服务器
关闭web1的ngix服务
systemctl stop nginx
使用浏览器再次访问192.168.10.40
因为web1的nginx服务已经停止,所以被调度到web2备用服务器上
测试完毕后开启web1的nginx服务
(2)weight
设置后端服务器权重值(负载均衡比例)
默认权重 1,不支持小数(如 weight=1.5 会报错)
修改配置文件
vim /usr/local/nginx/conf/nginx.conf
添加:
重启nginx服务
systemctl restart nginx
访问验证
curl 192.168.10.40
总共访问5次,web1会处理3次,web2会处理2次
(3)down
用于手动标记某台服务器为"停机维护"状态,nginx 不会将任何请求转发给它。不同于 backup(备用服务器),down 是显式禁用,通常用于:服务器维护期间、故障排查时隔离问题节点。
修改配置文件
vim /usr/local/nginx/conf/nginx.conf
添加:
重启nginx服务
systemctl restart nginx
访问验证
使用浏览器访问192.168.10.40
只能访问到web1服务器
(4)max_conns
限制单台服务器的最大并发连接数,防止过载。
当服务器的活跃连接数达到 max_conns 时,新请求会被转发到其他可用服务器。
默认值:0(无限制)。
修改配置文件
vim /usr/local/nginx/conf/nginx.conf
添加:
重启nginx服务
systemctl restart nginx
(5)least_conn
使用 least_conn(最少连接数)策略,nginx 会将新请求优先分配给当前活跃连接数最少的后端服务器。
修改配置文件
vim /usr/local/nginx/conf/nginx.conf
添加:
重启nginx服务
systemctl restart nginx
四、nginx 日志记录真实客户端 ip 地址
(1)开启日志(web1、web2)
vim /usr/local/nginx/conf/nginx.conf
修改:
$http_x_forwarded_for:为真实客户端ip
重启nginx服务
systemctl restart nginx
(2)查看访问日志(web1、web2)
tail -f /usr/local/nginx/logs/access.log
输入命令后使用浏览器访问192.168.10.40
$http_x_forwarded_for变量的值为空,用“-”代替
(3)修改配置文件(lb)
vim /usr/local/nginx/conf/nginx.conf
添加:
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 host $host;
作用:将客户端请求的原始 host 头(域名)传递给后端服务器。
proxy_set_header x-real-ip $remote_addr;
作用:将客户端的真实 ip 地址传递给后端服务器,存储在自定义头 x-real-ip 中。
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
作用:追加客户端 ip 到 x-forwarded-for 头,用于标识请求链路上的所有代理 ip。
重启nginx服务
systemctl restart nginx
(4)查看访问日志(web1、web2)
tail -f /usr/local/nginx/logs/access.log
输入命令后使用浏览器访问192.168.10.40
真实访问ip为192.168.10.1
五、nginx缓存(lb)
(1)修改配置文件
vim /usr/local/nginx/conf/nginx.conf
添加:
proxy_buffering on; proxy_temp_path /usr/local/nginx/proxy_temp; proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=my-cache:100m inactive=600m max_size=2g use_temp_path=off;
proxy_cache my-cache; proxy_cache_valid 200 304 301 302 8h; proxy_cache_valid 404 1m; proxy_cache_valid any 1d; proxy_cache_key "$scheme://$host$uri$is_args$args"; add_header x-cache-status $upstream_cache_status; proxy_cache_min_uses 3; proxy_cache_lock on;
重启nginx服务
systemctl restart nginx
(2)访问验证
使用浏览器访问192.168.10.40
x-cache-status返回“miss“表示未命中缓存,从后端获取
刷新超过三次(触发缓存)
x-cache-status返回“hit “表示响应来自缓存
观察 x-cache-status 的值:
- hit:响应来自缓存
- miss:未命中缓存,从后端获取
- bypass:显式跳过缓存(如设置了 proxy_cache_bypass)
- expired:缓存已过期
- stale:后端不可用时返回旧缓存
当看到的网页不变时,不是轮询失效,而是访问请求命中缓存,不在请求后端服务器。在真实生成环境中,网页都是一样的,这里只是为了测试轮询效果的展示。
(3)查看生成缓存文件
tree /usr/local/nginx/proxy_cache/
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论