Nginx反向代理与缓存配置方式

 更新时间:2025年07月24日 10:01:24   作者:LKAI.  
本文指导Nginx安装、负载均衡配置(含轮询、备用、权重等参数)、真实IP日志记录及缓存机制设置,涵盖反向代理、服务器状态管理与缓存验证测试

实验环境

设置主机名

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/

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用Nginx搭建文件服务器的全过程

    使用Nginx搭建文件服务器的全过程

    文章介绍了选择Nginx作为文件服务器的原因,包括其高性能、轻量级、高稳定性等优势,以及Nginx的基本配置、高级配置和生产环境配置,文章还详细介绍了如何使用Nginx进行HTTPS配置、防盗链配置、压缩传输等高级功能,需要的朋友可以参考下
    2026-01-01
  • nginx代理minio的实现示例

    nginx代理minio的实现示例

    本文介绍通过Nginx代理MinIO实现预签名URL的配置方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-05-05
  • 解决Nginx端口冲突的排查方法示例

    解决Nginx端口冲突的排查方法示例

    这篇文章主要介绍了解决Nginx端口冲突的排查方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 快速解决nginx的access.log持续变大问题

    快速解决nginx的access.log持续变大问题

    文章主要讲述了nginx的access.log日志文件突然变大的问题,提供了几种解决方案,包括停止nginx并删除日志文件、覆盖日志文件为空以及在配置文件中修改设置以不打印日志
    2025-11-11
  • nginx做代理时如何修改querystring方法详解

    nginx做代理时如何修改querystring方法详解

    这篇文章主要介绍了nginx做代理时如何修改querystring的方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • nginx安装并转发socket服务实现方式

    nginx安装并转发socket服务实现方式

    文章指导如何安装编译工具、PCRE和Nginx,并通过修改配置文件添加stream块实现端口转发,将9999/801端口分别映射至9988/1557端口
    2025-07-07
  • 使用Nginx做WebSockets代理教程

    使用Nginx做WebSockets代理教程

    这篇文章主要介绍了使用Nginx做WebSockets代理教程,本文给出了代理配置,和一个完整的node.js实现的WebSockets实例,需要的朋友可以参考下
    2015-01-01
  • nginx禁用ip实现方法

    nginx禁用ip实现方法

    Nginx禁特定IP访问的方法包括使用deny指令、组合使用allow和deny指令以及利用HTTP模块的limit_conn和limit_req指令限制连接数和请求频率,这些方法能有效禁止或限制特定IP的访问
    2026-05-05
  • 使用Nginx代理解决跨域问题并传递请求头的完整指南

    使用Nginx代理解决跨域问题并传递请求头的完整指南

    在现代 Web 开发中,跨域资源共享(CORS)是一个常见的问题,当你的前端应用尝试从一个域名请求另一个域名的资源时,浏览器会阻止这种请求,除非目标服务器明确允许跨域访问,本文将详细介绍如何使用 Nginx 作为代理服务器来解决跨域问题,需要的朋友可以参考下
    2025-01-01
  • Nginx配置ssl实现https的全过程记录

    Nginx配置ssl实现https的全过程记录

    这篇文章主要给大家介绍了关于Nginx配置ssl实现https的相关资料,文章通过实例代码介绍的非常详细,对大家学习或者使用Nginx具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03

最新评论