Nginx代理、缓存与Rewrite

06-02 1635阅读

目录

一、正向代理

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

(二)Nginx正向代理编译安装(以OpenEuler为例)

(三)验证正向代理

二、反向代理

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

(二)四层代理(TCP/UDP,网络层)

三、代理缓存

(一)核心原理

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

四、Rewrite与正则

(一)正则表达式基础

(二)Location匹配模式与优先级

(三)Rewrite语法与Flag参数

(四)捕获组与Set指令

五、总结


一、正向代理

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

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

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

    1. 安装依赖软件

    Nginx编译需要GCC、PCRE、Zlib、OpenSSL等开发包支持:

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

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

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

    [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​​(若源码已包含则无需下载):
      [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四层代理。
          • 编译并安装:
            [root@localhost nginx-1.26.3]# make && make install

            4. 创建便捷执行链接

            [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隐藏与流量代理。

            Nginx代理、缓存与Rewrite

            二、反向代理

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

            1. 核心功能与场景

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

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

              • 环境准备(两台主机):
                • 代理服务器(192.168.10.101):运行Nginx。
                • 后端服务器(192.168.10.102):安装Httpd并部署静态页面:
                  [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配置(代理服务器):
                    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
                        }
                      }
                    }
                    • 验证:
                      [root@localhost ~]# curl 192.168.10.101  # 应返回“这是后端主机”
                      (二)四层代理(TCP/UDP,网络层)

                      1. 核心功能与场景

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

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

                        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;  # 长连接保持时间
                          }
                        }
                        • 验证:
                          [root@localhost ~]# ssh root@192.168.10.101 -p 2222  # 成功登录后端服务器

                          三、代理缓存

                          (一)核心原理

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

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

                          1. 创建缓存目录并设置权限

                          [root@localhost ~]# mkdir -p /data/nginx/cache
                          [root@localhost ~]# chown nginx:nginx /data/nginx/cache -R

                          2. 配置缓存参数

                          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,未命中缓存):
                            [root@localhost ~]# curl -I 192.168.10.101
                            # 响应头包含:X-Cache-Status: MISS
                            • 再次请求(HIT,命中缓存):
                              [root@localhost ~]# curl -I 192.168.10.101
                              # 响应头包含:X-Cache-Status: HIT

                              四、Rewrite与正则

                              (一)正则表达式基础

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

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

                                1. 语法与模式

                                location [匹配模式] { ... }
                                • 精确匹配:​​location = /uri​​​,优先级最高(如​​location = /index.html​​仅匹配完全相同的URI)。
                                • 正则匹配:​​location ~ /abc​​​(区分大小写)、​​location ~* /ABC​​(不区分大小写)。
                                • 普通前缀:​​location /abc​​​匹配以​​/abc​​开头的URI。
                                • 通用匹配:​​location /​​,优先级最低。

                                  2. 优先级规则

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

                                  (三)Rewrite语法与Flag参数

                                  1. 基本语法

                                  rewrite   [flag];
                                  • ​​regex​​:匹配当前URI的正则表达式(不包含域名和参数)。
                                  • ​​replacement​​:重写后的目标URI。
                                  • ​​flag​​:
                                    • ​​last​​:重写后重新匹配location(默认值)。
                                    • ​​break​​:重写后不再匹配location,直接处理当前请求。
                                    • ​​redirect​​:返回302临时重定向(浏览器地址栏更新)。
                                    • ​​permanent​​:返回301永久重定向(搜索引擎更新URL)。

                                      2. 实战示例

                                      • 路径美化:将​​/product/123​​​转换为​​/index.php?id=123​​:
                                        location /product/ {
                                          rewrite ^/product/(\d+)$ /index.php?id=$1 last;
                                        }
                                        • 强制HTTPS跳转:
                                          server {
                                            listen 80;
                                            server_name example.com;
                                            rewrite ^(.*)$ https://$server_name$1 permanent;  # 永久重定向到HTTPS
                                          }
                                          • 旧链接迁移(301永久重定向):
                                            location /old-page {
                                              rewrite ^ /new-page permanent;
                                            }
                                            (四)捕获组与Set指令

                                            1. 捕获组应用

                                            通过​​()​​​捕获正则匹配内容,使用​​$1​​​、​​$2​​引用:

                                            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指令定义变量

                                            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应用架构。

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码