Nginx 反向代理与缓存功能

一、正向代理和反向代理

1.1 正向代理概述

正向代理是位于客户端和目标服务器之间的中间服务器,代理的是客户端。客户端向代理服务器发送包含目标服务器的请求,代理服务器转发请求并将结果返回给客户端。

正向代理的作用
  • 为局域网客户端提供访问 Internet 的途径
  • 利用缓冲特性减少网络使用率
  • 帮助访问受地理位置限制的网络
  • 隐藏客户端真实 IP 地址
正向代理基本配置格式
复制代码
server {
    listen 192.164.65.100:80;
    server_name 客户端访问的域名;

    location / {
      proxy_pass http://目标服务器地址;
    }
}

1.2 反向代理概述

反向代理代理的是服务端,客户端不直接与后端服务器通信,而是与反向代理服务器交互,从而隐藏了后端服务器的 IP 地址。

反向代理的主要功能
  • 负载均衡:将请求分发给多个后端服务器,平衡负载
  • 缓存功能:缓存静态文件或动态页面,提高响应速度
  • 动静分离:分离动态内容和静态资源到不同服务器
  • 多站点代理:代理多个域名,转发到不同后端服务器
反向代理常用模块
复制代码
ngx_http_proxy_module:# 以http协议转发请求至指定服务器
ngx_http_upstream_module # 定义后端服务器分组
ngx_stream_proxy_module:# 以tcp协议转发请求
ngx_http_fastcgi_module:# 以fastcgi协议转发php请求
ngx_http_uwsgi_module: # 以uwsgi协议转发Python请求

二、反向代理配置详解

2.1 核心配置参数

proxy_pass 指令

用于设置将客户端请求转发给的后端服务器,格式如下:

复制代码
proxy_pass 地址:端口;

不同用法的区别:

复制代码
# 不带斜线,会将location后的url附加到proxy_pass指定的url后
proxy_pass http://10.0.0.18:8080; 

# 带斜线,相当于置换,访问/web时实际访问后端的/
proxy_pass http://10.0.0.18:8080/;   

注意:如果 location 使用正则表达式模式,则 proxy_pass 之后不能使用 uri(即不能有 /)

其他常用参数
复制代码
# 隐藏后端服务器响应头部信息
proxy_hide_header field;

# 传递后端服务器特定首部字段给客户端
proxy_pass_header field;

# 是否向后端服务器发送HTTP实体部分,默认开启
proxy_pass_request_body on | off; 

# 是否将客户端的请求头部转发给后端服务器,默认开启
proxy_pass_request_headers on | off; 

三、反向代理实战案例

3.1 反向代理单台 web 服务器

代理服务器配置

复制代码
vim /apps/nginx/conf.d/pc.conf
server{
    listen 192.164.65.100:80;
    server_name  www.pc.com;
    root    /apps/nginx/html/pc;
    location  / {
        proxy_pass http://192.164.65.101;
    }
}

真实服务端配置

复制代码
# 安装httpd服务
yum install httpd -y

# 创建主页内容
cd /var/www/html
echo "Hi~" > index.html

# 启动服务
systemctl start httpd

客户机配置 hosts

复制代码
vim /etc/hosts
192.164.65.100 www.pc.com

测试

复制代码
curl 192.164.65.100

3.2 实现动静分离的反向代理

通过不同 location 配置,将动态资源和静态资源转发到不同服务器:

复制代码
# 代理服务器配置
vim /apps/nginx/conf.d/pc.conf
location /api {
    proxy_pass http://192.164.65.101;
}

location /static {
    proxy_pass http://192.164.65.103;
}

动态资源服务器配置

复制代码
# 创建动态资源
cd /usr/share/nginx/html
mkdir api
echo this is api > ./api/index.html

静态资源服务器配置

复制代码
# 创建静态资源
cd /usr/share/nginx/html
mkdir static
echo this is static > ./static/index.html

测试

复制代码
# 测试动态资源
curl 192.164.65.100/api -L

# 测试静态资源
curl 192.164.65.100/static -L

3.3 Nginx 缓存功能配置

Nginx 可以缓存静态资源,减少后端服务器压力,提高响应速度。

缓存核心配置
复制代码
# 在http配置块中定义缓存信息
proxy_cache_path /var/cache/nginx/proxy_cache  # 缓存保存路径
levels=1:2:2                                   # 缓存目录结构层次
keys_zone=proxycache:20m                       # 内存中缓存的大小
inactive=120s                                  # 缓存有效时间  
max_size=10g;                                  # 最大磁盘占用空间

# 在server或location块中调用缓存
proxy_cache proxycache;
proxy_cache_key $request_uri;                  # 缓存key
proxy_cache_valid 200 302 301 10m;             # 特定状态码缓存时长
proxy_cache_valid any 1m;                      # 其他状态码缓存时长
缓存相关参数
复制代码
# 定义对哪些请求方法进行缓存
proxy_cache_methods GET | HEAD | POST ...;

# 后端服务器异常时是否使用过期缓存
proxy_cache_use_stale error | timeout | http_500 ...;
缓存清理方法
  1. 直接删除缓存目录:rm -rf 缓存目录
  2. 使用第三方扩展模块 ngx_cache_purge

3.4 实现客户端 IP 透传

在反向代理中,通过特定 HTTP 头字段将客户端真实 IP 传递给后端服务器。

一级代理配置
复制代码
# 代理服务器配置
server{
    listen 192.164.65.100:80;
    server_name  www.pc.com;
    location  / {
        proxy_pass http://192.164.65.101;
        # 添加IP透传配置
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

$proxy_add_x_forwarded_for变量会获取客户端真实 IP 并添加到X-Forwarded-For头字段中,后端服务器可通过该字段获取真实客户端 IP。

多级代理配置

在每一级代理服务器都添加相同的proxy_set_header X-Forwarded-For配置,即可实现多级代理下的 IP 透传。

3.5 反向代理负载均衡

Nginx 基于ngx_http_upstream_module模块提供负载均衡功能,支持多种调度算法。

常见配置参数
复制代码
upstream 服务器组名 {
    server 后端服务器地址 [参数];
}

# 常用参数
weight=number      # 权重,默认为1
max_conns=number   # 最大活动连接数
max_fails=number   # 失败次数阈值
fail_timeout=time  # 失败重试时间
backup             # 备份服务器
down               # 标记为不可用
常用调度算法

轮询(Round Robin)

复制代码
upstream backend {  
    server 192.164.65.1;    
    server 192.164.65.2;  
}
  1. 加权轮询(Weighted Round Robin)

    upstream backend {
    server 192.164.65.1 weight=10;
    server 192.164.65.2 weight=20;
    }

  2. IP 哈希(ip_hash)

    upstream backend {
    ip_hash;
    server 192.164.65.1:88;
    server 192.164.65.2:80;
    }

  3. 最少连接数(least_conn)

    upstream backend {
    least_conn;
    server backend1.example.com;
    server backend2.example.com;
    }

  4. 第三方算法:fair(按响应时间)、url_hash(按 URL 哈希)

负载均衡实战配置
复制代码
# 在主配置文件中定义服务器组
vim /apps/nginx/conf/nginx.conf
upstream group1{
    server 192.164.65.102 weight=2;
    server 192.164.65.103 weight=3;
}

# 在子配置文件中引用
vim /apps/nginx/conf.d/pc.com
location / {
    proxy_pass http://group1;
}

四、Nginx 配置跨域 CORS

4.1 跨域的定义与限制

同源策略是浏览器的安全机制,限制不同源之间的交互。同源指协议、域名和端口都相同。

不同源的限制包括:

  • 数据层面:限制读取 Cookie、IndexDB 等数据
  • DOM 层面:限制对 DOM 对象的操作
  • 网络层面:限制跨域请求

4.2 Nginx 解决跨域的原理

浏览器向与前端同源的 Nginx 服务器发送请求,Nginx 转发请求到目标服务器,再将响应返回给浏览器,从而绕过 CORS 限制。

4.3 跨域配置案例

复制代码
server {
    listen        80;
    server_name  fe.server.com;
    location / {
        proxy_pass dev.server.com;
        proxy_set_header Host target-domain.com;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 跨域相关配置
        proxy_set_header Access-Control-Allow-Origin http://fe.server.com;
        proxy_set_header Access-Control-Allow-Methods GET,POST,PUT,DELETE;
        proxy_set_header Access-Control-Allow-Headers Content-Type,Authorization;
    }
}

五、Nginx 防盗链设置

5.1 防盗链原理

基于 HTTP 的 Referer 机制,通过识别请求来源,限制未经允许的网站盗用资源。Referer 头信息表示请求的来源页面。

5.2 防盗链配置

复制代码
server {
    listen 80;
    server_name localhost;
    
    location ~* \.(js|img|css|png)$ {
        # 只允许指定来源访问
        valid_referers 192.168.166.9;
        # 非法来源返回403
        if ($invalid_referer) {
            return 403;
        }
        root html;
    }
}
valid_referers 参数说明
  • none:允许没有 Referer 的请求
  • blocked:允许 Referer 不以 http:// 或 https:// 开头的请求
  • server_names:允许指定域名的请求
  • 可以直接指定 IP 或域名作为白名单

通过以上配置,Nginx 可以有效防止静态资源被其他网站盗用,保护服务器带宽资源。

相关推荐
ybb_ymm2 小时前
Docker下的使用命令
运维·docker·容器
qq_10055170753 小时前
WordPress给指定分类文章添加一个自动化高亮(一键复制)功能
运维·前端·自动化·php
Flash Dog3 小时前
【Redis原理】缓存的内部逻辑
数据库·redis·缓存
_BugMan4 小时前
docker实战:基础操作、镜像打包、网络、容器编排
运维·docker·容器
Clownseven4 小时前
2025开发者云服务器评测:AWS, Vercel, Railway该如何选?
运维·服务器·aws
一条懒鱼6664 小时前
Nginx反向代理与缓存功能
运维·nginx
AscendKing5 小时前
Docker 部署 Ollama 详细教程以及镜像高速下载地址
运维·docker·容器
努力努力再努力wz5 小时前
【C++进阶系列】:位图和布隆过滤器(附模拟实现的源码)
java·linux·运维·开发语言·数据结构·c++
wayuncn5 小时前
哈尔滨服务器托管优选-青蛙云
运维·服务器·服务器租用·服务器托管·物理机租用·idc服务商