当前位置: 首页 > ds >正文

Nginx核心功能02

目录

一:正向代理

1.编译安装nginx

2.配置正向代理

二:反向代理

1.配置nginx七层代理

2.配置nginx四层代理(传输层,TCP/UDP)

三:nginx缓存

1.缓存功能的核心原理和缓存类型

2.代理缓存功能设置

四:nginx rewrite和正则

1.nginx正则

2.nginx location

3.Rewrite


一:正向代理

正向代理的定义:

正向代理(Forward Proxy)是位于客户端和目标服务器之间的中间服务器。客户端通过配置明确指定正向代理服务器,由代理服务器代替客户端向目标服务器发起请求并返回响应。对目标服务器而言,请求的来源是代理服务器而非真实客户端。

核心特点:

  • 客户端感知:需显式配置代理地址(如浏览器或系统设置)。

  • 隐藏客户端:目标服务器仅看到代理服务器的IP。

  • 用途:突破访问限制、匿名访问、缓存加速、内网穿透等。

1.编译安装nginx

查看状态:netstat -anpt | grep nginx
停止:systemctl stop nginx
rm -rf nginx-1.24.0*
拉取nginx-1.24.3.tar.gz
解压并cd、并配置(配置参数.txt)./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 --with-http_gzip_static_module --add-module=./ngx_http_proxy_connect_modulemake && make installnginx -t 
systemctl start nginx
netstat -anpt | grep nginx
——快照——

./configure 是一个配置脚本,用于检查系统环境并生成适合当前系统的 Makefile(编译配置文件)。这里使用的参数如下:

  • --prefix=/usr/local/nginx
    指定 Nginx 的安装路径为 /usr/local/nginx(默认安装目录)。

  • --user=nginx --group=nginx
    指定 Nginx 运行时使用的用户和组为 nginx(需提前创建该用户和组)。

  • --with-http_ssl_module
    启用 HTTPS/SSL 支持(使 Nginx 能处理加密的 HTTPS 请求)。

  • --with-http_v2_module
    启用 HTTP/2 协议支持(现代浏览器支持的更高效的 HTTP 协议版本)。

  • --with-http_realip_module
    启用真实 IP 模块,用于从代理服务器(如 CDN)获取客户端的真实 IP 地址。

  • --with-http_stub_status_module
    启用状态监控模块,可以通过访问特定页面获取 Nginx 的运行状态信息。

  • --with-http_gzip_static_module
    启用预压缩静态文件支持(可直接发送 .gz 文件,减少 CPU 压缩开销)。

  • --with-pcre
    启用 PCRE(Perl Compatible Regular Expressions)支持,用于正则表达式匹配(如 location 路由规则)。

  • --with-stream
    启用 TCP/UDP 代理模块(用于反向代理非 HTTP 协议,如数据库、邮件服务等)。

  • --with-stream_ssl_module
    为 TCP/UDP 代理启用 SSL/TLS 加密支持。

  • --with-stream_realip_module
    为 TCP/UDP 代理启用真实 IP 获取功能。

  • --add-module=./ngx_http_proxy_connect_module
    添加一个第三方模块 ngx_http_proxy_connect_module,用于支持 HTTP CONNECT 方法(常用于正向代理场景)。

2.配置正向代理

(1)编辑Nginx配置文件(/usr/local/nginx/conf/nginx.conf),添加以下内容:

server {listen 3128;  # 代理服务端口resolver 8.8.8.8;  # DNS解析服务器# 允许CONNECT方法(用于HTTPS代理)proxy_connect;proxy_connect_allow 443 80;proxy_connect_connect_timeout 10s;proxy_connect_read_timeout 10s;proxy_connect_send_timeout 10s;location / {# 限制访问权限(按需配置)allow 192.168.1.0/24;  # 允许的内网IP段deny all;# 普通HTTP代理proxy_pass http://$http_host$request_uri;proxy_set_header Host $http_host;}
}

关键指令说明:

  • proxy_connect:启用HTTPS代理支持。

  • resolver:指定DNS服务器,避免代理无法解析域名。

  • 访问控制:通过allow/deny限制客户端IP范围。

(2)验证正向代理

# 启动Nginx
/usr/local/nginx/sbin/nginx# 测试代理(以curl为例)
curl --proxy http://代理服务器IP:3128 http://example.com

二:反向代理

反向代理的定义:

反向代理(Reverse Proxy)是位于服务器端的一个代理服务,接收客户端请求后转发给内网的真实服务器,并将结果返回给客户端。客户端无需感知真实服务器的存在。

核心特点:

  • 服务端感知:由服务器管理员配置,客户端无感知。

  • 隐藏真实服务器:保护后端服务器安全。

  • 用途:负载均衡、缓存加速、SSL终结、统一入口等。

1.配置nginx七层代理

七层代理基于HTTP协议,可处理URL、Header等应用层信息。

示例配置nginx.conf):

http {upstream backend_servers {server 192.168.1.2:80 weight=3;  # 权重负载均衡server 192.168.1.3:80;keepalive 32;  # 长连接优化}server {listen 80;server_name example.com;location / {proxy_pass http://backend_servers;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_cache my_cache;proxy_cache_valid 200 1h;proxy_connect_timeout 5s;}}
}

关键指令说明:

  • upstream:定义后端服务器组,支持权重、轮询等策略。

  • proxy_set_header:传递客户端原始信息(如IP)。

  • proxy_cache:启用响应缓存减轻后端压力。

2.配置nginx四层代理(传输层,TCP/UDP)

四层代理基于IP和端口,不解析应用层协议(如HTTP),性能更高。

(1)配置TCP/UDP代理(在nginx.conf的顶层或单独文件):

stream {upstream tcp_backend {server 192.168.1.4:3306;  # 代理MySQL服务server 192.168.1.5:3306;}server {listen 3306;  # 暴露给客户端的端口proxy_pass tcp_backend;proxy_timeout 60s;}# UDP示例(如DNS代理)server {listen 53 udp;proxy_pass 8.8.8.8:53;proxy_responses 1;}
}

关键指令:

  • stream:定义四层代理上下文。

  • proxy_pass:直接转发原始数据流。

  • proxy_responses:UDP代理需指定响应包数量。

(2)验证与测试

七层代理:

curl http://example.com  # 应返回后端服务器响应

四层代理:

telnet 代理服务器IP 3306  # 测试TCP端口连通性

三:nginx缓存

核心原理:

Nginx缓存通过将后端服务器的响应内容存储到本地磁盘或内存中,当相同请求再次到达时直接返回缓存内容,减少对后端服务器的请求压力,显著提升响应速度。

1.缓存功能的核心原理和缓存类型

  1. 代理缓存(Proxy Cache)

    • 缓存反向代理从后端服务器获取的响应。

    • 适用于动态内容(如API、数据库查询结果)。

  2. FastCGI缓存

    • 缓存PHP/Python等动态程序通过FastCGI协议返回的响应。

    • 适用于WordPress等CMS系统。

  3. 静态资源缓存

    • 直接缓存静态文件(如JS/CSS/图片)。

    • 通过expiresCache-Control头控制浏览器缓存。

  4. 微缓存(Microcache)

    • 极短期缓存(如1秒),用于高并发场景缓解后端压力。

2.代理缓存功能设置

步骤1:配置缓存路径及参数
http块中定义缓存路径和共享内存区域:

http {proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off;# 参数说明:# - `/var/cache/nginx`:缓存文件存储路径# - `levels=1:2`:目录层级结构# - `keys_zone=my_cache:10m`:共享内存区名称及大小# - `inactive=60m`:60分钟内未被访问的缓存自动清理# - `use_temp_path=off`:禁用临时路径提升性能
}

步骤2:在Server/Location中启用缓存

server {listen 80;server_name example.com;location / {proxy_pass http://backend_servers;proxy_cache my_cache;  # 启用定义的缓存区域proxy_cache_key "$scheme$request_method$host$request_uri";  # 缓存键生成规则proxy_cache_valid 200 302 10m;  # 200/302状态码缓存10分钟proxy_cache_valid 404      1m;  # 404状态码缓存1分钟# 缓存命中状态头(调试用)add_header X-Cache-Status $upstream_cache_status;}
}#proxy_cache:指定使用的缓存区域。#proxy_cache_key:定义缓存唯一标识(默认包含URL和头信息)。#proxy_cache_valid:按状态码设置缓存时间。#$upstream_cache_status:返回缓存命中状态(HIT/MISS/BYPASS)。

四:nginx rewrite和正则

1.nginx正则

Nginx 使用 PCRE(Perl Compatible Regular Expressions) 语法支持正则匹配,常用于 location 和 rewrite 规则中。

常用正则符号

符号说明示例
^匹配字符串开头^/api 匹配以 /api 开头的路径
$匹配字符串结尾\.html$ 匹配以 .html 结尾的URL
.*匹配任意字符(除换行外)零次或多次^/images/.*\.jpg$ 匹配所有JPEG图片
.+匹配任意字符至少一次^/.+$ 匹配所有非空路径
?匹配前一个字符零次或一次^/user/? 匹配 /user 或 /user/
[abc]匹配括号内的任意一个字符^/[ab]/ 匹配 /a/ 或 /b/
[^abc]匹配不在括号内的任意字符^/[^ab]/ 匹配不以 /a/ 或 /b/ 开头的路径
(pattern)捕获分组,可通过 $1 $2 引用^/(img)/(.*)\.jpg$ 捕获 img 和文件名

2.nginx location

Nginx location 配置中 location 的顺序没有太大关系。匹配优先级和 location 表达式的类型有关:相同类型的表达式,字符串长的会优先匹配

以下是按优先级排列说明:

等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。

^~类型表达式。一旦匹配成功,则不再查找其他匹配项。

正则表达式类型(~~*)的优先级次之。

常规字符串匹配类型。按前缀匹配。

通用匹配(/),如果没有其它匹配,任何请求都会匹配到。

备注:

= 严格匹配。如果这个查询匹配,那么将停止搜索并立即处理此请求。

~ 区分大小写匹配(可用正则表达式)

!~区分大小写不匹配

~* 不区分大小写匹配(可用正则表达式)

!~*不区分大小写不匹配

^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式。

很多情况下 rewrite 也会写在 location 里,它们的执行顺序如下:

(1) 执行 server 块里面的 rewrite 指令。

(2) 执行 location 匹配。

(3) 执行选定的 location 中的 rewrite 指令。

server {location = /favicon.ico {access_log off;return 204;  # 快速处理favicon请求}location ^~ /static/ {root /var/www/html;  # 静态文件直接返回}location ~* \.(php|jsp)$ {proxy_pass http://backend;  # 动态请求转发后端}location / {try_files $uri $uri/ /index.html;  # 单页应用路由}
}

3.Rewrite

(1)Nginx Rewrite 概述

1:Rewrite 跳转场景

  • 可以调整用户浏览的 URL,看起来更规范,合乎开发及产品人员的需求。
  •  为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态 URL 地址伪装成静态地址提供服务。
  • 网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的 360buy.com 会跳转到 jd.com
  • 根据特殊变量、目录、客户端的信息进行 URL 调整等。

2:Rewrite 跳转实现

Nginx 是通过 ngx_http_rewrite_module 模块支持 url 重写、支持 if 条件判断,但不支持 else。另外该模块需要 PCRE 支持,应在编译 Nginx 时指定 PCRE 支持,默认已经安装。

(2)Rewrite 语法

rewrite<regex><replacement>[flag];

flag 标记说明:

  • last:相当于 Apache 的[L]标记,表示完成 rewrite。
  • break:本条规则匹配完成即终止,不再匹配后面的任何规则。
  • redirect:返回 302 临时重定向,浏览器地址会显示跳转后的 URL 地址,爬虫不会更新url(因为是临时)。
  • permanent:返回 301 永久重定向,浏览器地址栏会显示跳转后的 URL 地址,爬虫更新 url。
#基于客户端 IP 访问跳转
server {listen       80;server_name  www.benet.com;#access_log  /var/log/nginx/host.access.log  main;set $rewrite true;if ($remote_addr = "192.168.10.51") {set $rewrite false;}if ($rewrite = true) {rewrite (.+) /maintenance.html;}location / {root   html;index  index.html index.htm;#	if ($host = 'www.benet.com') 
#	  {
#	  rewrite ^/(.*)$ http://www.accp.com/$1 permanent; 
#	  }}
}#基于旧域名跳转到新域名后面加目录
访问http://bbs.benet.com/post时,需要将这个域名跳转到http://www.benet.com/bbs/post
[root@localhost html]# cd /usr/local/nginx/html/
[root@localhost html]# mkdir -p bbs/post
[root@localhost html]# cd bbs/post
[root@localhost post]# echo "i am bbs">index.html[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  bbs.benet.com;#access_log  /var/log/nginx/host.access.log  main;location /post {rewrite (.+) http://www.benet.com/bbs$1 permanent;}location / {root   html;index  index.html index.htm;}
}[root@localhost ~]# systemctl restart nginx

http://www.xdnf.cn/news/3373.html

相关文章:

  • 对js的Date二次封装,继承了原Date的所有方法,增加了自己扩展的方法,可以实现任意时间往前往后推算多少小时、多少天、多少周、多少月;
  • django_rq
  • Unity编辑器扩展之导出项目中所有Script里面的文本内容
  • 《Python实战进阶》No45:性能分析工具 cProfile 与 line_profiler
  • 【SLAM】svo 的深度滤波和 msckf 的后端的点的优化的差异是什么?delayinit和depthfilter之间的差异是什么?
  • 多帧Dicom文件获取ImagePosition、Intercept、Slope、PixelSpacing
  • AndroidStudio生成AAR
  • 网页工具箱 --- 一个强大的浏览器脚本工具
  • 前端开发 Markdown 编辑器与富文本编辑器详解
  • 长尾关键词SEO优化策略精解
  • Vcpkg C++库管理工具安装
  • Azure AI Foundry实战:从零开始构建智能应用
  • 关于 live555延迟优化之缓存区优化“StreamParser::afterGettingBytes() warning: read”” 的解决方法
  • 晶振:从消费电子到航天领域的时间精度定义者
  • Git仓库目录的所有权问题
  • 2025 新生 DL-FWI 培训
  • Web开发-JavaEE应用SpringBoot栈模版注入ThymeleafFreemarkerVelocity
  • Antd Upload组件连续回车会多次触发文件夹弹窗的bug修复
  • MATLAB绘制饼图(二维/三维)
  • 如何解决服务器文件丢失或损坏的问题
  • linux中systemctl stop 和 kill -9的区别
  • 字节暑期实习-网络运维工程师面经
  • Java学习计划与资源推荐(入门到进阶、高阶、实战)
  • 从 PID 到 Agent:工业控制算法的五代进化史与智能协同革命
  • CentOS网络之network和NetworkManager深度解析
  • 小刚说C语言刷题—1462小明的游泳时间
  • spring中关键字Assert和jdk的assert关键字
  • finereport普通报表设置冻结列后实现点击单元格整行背景变色
  • Kaamel白皮书:MCP安全实践
  • 司南评测集社区 4 月上新一览