Nginx代理、缓存与Rewrite

一、正向代理

(一)核心概念与应用场景

正向代理是客户端(如浏览器)的代理,客户端明确配置代理服务器,由代理服务器代为向目标服务器发起请求。其核心作用包括:

  • 突破网络限制:访问被屏蔽的网站或资源。
  • 节省带宽:缓存公共资源(如软件包、镜像文件),减少重复请求。
  • 隐藏真实IP:客户端通过代理服务器访问目标,隐藏自身IP地址。
(二)Nginx正向代理编译安装(以OpenEuler为例)

1. 安装依赖软件

Nginx编译需要GCC、PCRE、Zlib、OpenSSL等开发包支持:
登录后复制

plain 复制代码
[root@localhost ~]# dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar

2. 创建专用用户与日志目录

为提升安全性,创建非交互式用户nginx,并设置日志目录权限:
登录后复制

plain 复制代码
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# mkdir -p /var/log/nginx
[root@localhost ~]# chown -R nginx:nginx /var/log/nginx

3. 下载与编译配置

  • 解压Nginx源码(示例版本1.26.3),并下载支持HTTPS转发的第三方模块ngx_http_proxy_connect_module(若源码已包含则无需下载):

登录后复制

plain 复制代码
[root@localhost ~]# tar zxf nginx-1.26.3_http_proxy.tar.gz
[root@localhost ~]# cd nginx-1.26.3
[root@localhost nginx-1.26.3]# ./configure \
  --prefix=/usr/local/nginx \
  --user=nginx \
  --group=nginx \
  --with-http_ssl_module \
  --with-http_v2_module \
  --with-http_realip_module \
  --with-http_stub_status_module \
  --with-http_gzip_static_module \
  --with-pcre \
  --with-stream \
  --with-stream_ssl_module \
  --with-stream_realip_module \
  --add-module=./ngx_http_proxy_connect_module  # 关键:支持HTTPS转发
  • 关键参数解析:

  • --add-module:引入第三方模块,解决Nginx默认不支持HTTPS转发的问题。
  • --with-http_ssl_module:开启HTTPS支持。
  • --with-stream:支持TCP/UDP四层代理。
  • 编译并安装:

登录后复制

plain 复制代码
[root@localhost nginx-1.26.3]# make && make install

4. 创建便捷执行链接
登录后复制

plain 复制代码
[root@localhost nginx-1.26.3]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/nginx
(三)验证正向代理

配置客户端(如Windows)的代理IP和端口为Nginx服务器地址,访问任意网站。通过查看Nginx访问日志(/usr/local/nginx/logs/access.log),可观察到客户端请求经代理转发,实现IP隐藏与流量代理。

二、反向代理

(一)七层代理(HTTP/HTTPS,应用层)

1. 核心功能与场景

  • 负载均衡:将流量分发到多台后端服务器(如Tomcat、Apache),避免单点故障。
  • 动静分离:静态资源(图片、CSS/JS)由Nginx直接响应,动态请求转发至后端。
  • SSL终端:统一处理HTTPS加密/解密,减轻后端压力。

2. 实战配置:转发HTTP请求到后端Httpd服务器

  • 环境准备(两台主机)
  • 代理服务器(192.168.10.101):运行Nginx。
  • 后端服务器(192.168.10.102):安装Httpd并部署静态页面:

登录后复制

plain 复制代码
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# dnf install httpd -y
[root@localhost ~]# echo "这是后端主机" > /var/www/html/index.html
[root@localhost ~]# systemctl start httpd
  • Nginx配置(代理服务器)

登录后复制

plain 复制代码
http {
  upstream backend {  # 定义后端服务器地址池
    server 192.168.10.102:80;
  }
  server {
    listen 80;
    server_name example.com;
    location / {
      proxy_pass http://backend;  # 请求转发到后端地址池
      proxy_set_header Host $host;  # 传递客户端请求的主机名
      proxy_set_header X-Real-IP $remote_addr;  # 传递客户端真实IP
    }
  }
}
  • 验证

登录后复制

plain 复制代码
[root@localhost ~]# curl 192.168.10.101  # 应返回"这是后端主机"
(二)四层代理(TCP/UDP,网络层)

1. 核心功能与场景

  • 非HTTP服务代理:如数据库(MySQL/Redis)、游戏服务器(UDP协议)、SSH跳板机。
  • 高性能转发:直接转发原始数据流,不解析应用层内容,低延迟。

2. 实战配置:SSH请求代理(端口2222转发到后端22)
登录后复制

plain 复制代码
stream {  # 与http模块平级,独立处理TCP/UDP流量
  upstream ssh_cluster {
    server 192.168.10.102:22;  # 后端SSH服务地址
  }
  server {
    listen 2222;  # 代理服务器监听端口
    proxy_pass ssh_cluster;  # 转发到后端地址池
    proxy_connect_timeout 5s;  # 连接超时时间
    proxy_timeout 1h;  # 长连接保持时间
  }
}
  • 验证

登录后复制

plain 复制代码
[root@localhost ~]# ssh root@192.168.10.101 -p 2222  # 成功登录后端服务器

三、代理缓存

(一)核心原理

Nginx缓存后端服务器的响应内容,当相同请求再次到达时,直接返回缓存数据,减少后端压力并加速响应。支持按URL、请求方法、协议等维度缓存。

(二)配置步骤(基于七层反向代理)

1. 创建缓存目录并设置权限
登录后复制

plain 复制代码
[root@localhost ~]# mkdir -p /data/nginx/cache
[root@localhost ~]# chown nginx:nginx /data/nginx/cache -R

2. 配置缓存参数
登录后复制

plain 复制代码
http {
  # 定义缓存路径与参数
  proxy_cache_path /data/nginx/cache \
    levels=1:2 \  # 缓存目录层级(一级目录1个字符,二级目录2个字符)
    keys_zone=my_cache:10m \  # 共享内存区,存储缓存键与元数据(10MB约存8万个键)
    inactive=60m \  # 60分钟未访问则删除缓存
    max_size=1g \  # 最大缓存空间,超出后按LRU算法清理
    use_temp_path=off;  # 禁用临时文件,直接写入缓存目录提升性能

  upstream backend {
    server 192.168.10.102:80;
  }

  server {
    listen 80;
    server_name example.com;
    location / {
      proxy_pass http://backend;
      proxy_cache my_cache;  # 启用名为my_cache的缓存区
      proxy_cache_key "$scheme$request_method$host$request_uri";  # 缓存键:协议+方法+主机+URI
      proxy_cache_valid 200 302 10m;  # 200/302状态码缓存10分钟
      proxy_cache_valid 404 1m;  # 404缓存1分钟
      proxy_cache_valid any 5s;  # 其他状态码缓存5秒
      add_header X-Cache-Status $upstream_cache_status;  # 添加缓存状态头(调试用)
    }
  }
}

3. 验证缓存效果

  • 首次请求(MISS,未命中缓存):

登录后复制

plain 复制代码
[root@localhost ~]# curl -I 192.168.10.101
# 响应头包含:X-Cache-Status: MISS
  • 再次请求(HIT,命中缓存):

登录后复制

plain 复制代码
[root@localhost ~]# curl -I 192.168.10.101
# 响应头包含:X-Cache-Status: HIT

四、Rewrite与正则

(一)正则表达式基础

Nginx Rewrite依赖正则匹配,常用元字符:

  • ^:匹配字符串开头,如^/api匹配以/api开头的URI。
  • $:匹配字符串结尾,如.jpg$匹配以.jpg结尾的文件。
  • +:匹配前一个字符1次或多次,如ab+匹配ababb等。
  • ():捕获组,如/user/(\d+)捕获用户ID到$1
(二)Location匹配模式与优先级

1. 语法与模式
登录后复制

plain 复制代码
location [匹配模式] { ... }
  • 精确匹配location = /uri,优先级最高(如location = /index.html仅匹配完全相同的URI)。

  • 正则匹配location ~ /abc(区分大小写)、location ~* /ABC(不区分大小写)。

  • 普通前缀location /abc匹配以/abc开头的URI。

  • 通用匹配location /,优先级最低。

2. 优先级规则

精确匹配 > 精确前缀 > 正则匹配(文件中位置靠上的优先) > 普通前缀 > 通用匹配。

(三)Rewrite语法与Flag参数

1. 基本语法
登录后复制

plain 复制代码
rewrite <regex> <replacement> [flag];
  • regex:匹配当前URI的正则表达式(不包含域名和参数)。

  • replacement:重写后的目标URI。

  • flag

  • last:重写后重新匹配location(默认值)。
  • break:重写后不再匹配location,直接处理当前请求。
  • redirect:返回302临时重定向(浏览器地址栏更新)。
  • permanent:返回301永久重定向(搜索引擎更新URL)。

2. 实战示例

  • 路径美化 :将/product/123转换为/index.php?id=123

登录后复制

plain 复制代码
location /product/ {
  rewrite ^/product/(\d+)$ /index.php?id=$1 last;
}
  • 强制HTTPS跳转

登录后复制

plain 复制代码
server {
  listen 80;
  server_name example.com;
  rewrite ^(.*)$ https://$server_name$1 permanent;  # 永久重定向到HTTPS
}
  • 旧链接迁移(301永久重定向)

登录后复制

plain 复制代码
location /old-page {
  rewrite ^ /new-page permanent;
}
(四)捕获组与Set指令

1. 捕获组应用

通过()捕获正则匹配内容,使用$1$2引用:
登录后复制

plain 复制代码
location /category/ {
  # 匹配/category/tech/123,捕获"tech"到$1,"123"到$2
  rewrite ^/category/(.+)/(\d+)$ /archive/$1/$2 last;
}
location /archive/ {
  return 200 "Category: $1, ID: $2";  # 输出捕获结果
}

2. Set指令定义变量
登录后复制

plain 复制代码
location /demo {
  set $name "Nginx";  # 定义变量$name
  return 200 "Hello, $name!";  # 输出:Hello, Nginx!
}

五、总结

本文全面解析了Nginx的三大核心功能:

  1. 正向代理:客户端代理,突破限制、隐藏IP。
  2. 反向代理:服务器端代理,支持七层(HTTP/HTTPS)与四层(TCP/UDP),实现负载均衡、动静分离等。
  3. 代理缓存:通过缓存后端响应,降低延迟、提升性能。
  4. Rewrite与正则:灵活控制URL,实现路径美化、重定向、动态路由等。

通过合理配置Nginx,可显著提升网站的性能、安全性和可维护性。在实际应用中,需根据业务需求选择合适的代理模式,结合缓存策略和Rewrite规则,打造高效稳定的Web应用架构。

相关推荐
wanhengidc3 分钟前
云手机 开发测试中的便捷工具
运维·服务器·科技·智能手机·云计算
HalvmånEver15 分钟前
Linux:基础IO(终)
linux·运维·c++·学习·缓冲区·libc
大江东第一深情1 小时前
Origin 2024 进行语言切换后仍然显示为英文
运维·前端
CSDN官方博客1 小时前
CSDN社区镜像创作活动
大数据·运维·人工智能
石小千1 小时前
Ubuntu24.04 安装Docker
运维·docker·容器
zhuzewennamoamtf1 小时前
Linux设备树理解和应用
linux·运维·服务器
雨大王5121 小时前
汽车厂内物流如何通过自动化实现降本增效?
运维·自动化
Qzkj6661 小时前
医疗和教育行业自动化、精准匹配、易掌握的数据分类分级最佳实践与案例
大数据·运维·自动化
我科绝伦(Huanhuan Zhou)1 小时前
Linux 环境下 SQL Server 自动收缩日志作业创建脚本(Shell 版)
linux·运维·数据库·sql server
徐徐图之!2 小时前
五、【阶段一运维基础 之 干货!!!】安装 Vmware 和 CentOS
linux·运维·centos