目录
[四、Nginx 缓存](#四、Nginx 缓存)
[1. 缓存功能的核心原理和缓存类型](#1. 缓存功能的核心原理和缓存类型)
[2. 代理缓存功能设置](#2. 代理缓存功能设置)
[五、Nginx rewrite和正则](#五、Nginx rewrite和正则)
[(1)Nginx 正则](#(1)Nginx 正则)
[(2)nginx location](#(2)nginx location)
一、Nginx
概述 :Nginx 是一款高性能的 开源 Web 服务器 和 反向代理服务器,以高并发处理、低内存消耗和模块化架构著称。
核心功能:
功能 | 说明 |
---|---|
静态资源服务 | 高效处理 HTML、CSS、JS、图片等静态文件,支持 Gzip 压缩和缓存优化。 |
反向代理 | 将客户端请求转发到后端服务器集群,实现负载均衡和高可用。 |
SSL/TLS 终止 | 处理 HTTPS 加密和解密,减轻后端服务器压力。 |
限流与防护 | 支持请求速率限制、IP 黑白名单、防 DDoS 攻击。 |
动态内容处理 | 通过 FastCGI 协议与 PHP、Python 等后端语言交互(需配合 PHP-FPM 等工具)。 |
注意:配置代理前提 nginx的版本必须高些
二、正向代理
概述 :正向代理是 客户端与目标服务器之间的中间服务器,代表客户端向外部服务器发送请求。

工作流程:
-
客户端配置代理服务器(如浏览器设置代理 IP 和端口)。
-
客户端发送请求到代理服务器。
-
代理服务器转发请求到目标服务器。
-
目标服务器返回响应到代理服务器。
-
代理服务器将响应返回给客户端。
配置步骤:
bash
#正向代理
vim /usr/local/nginx/conf/nginx.conf
......省略部分信息
server {
listen 8080;
resolver 114.114.114.114 8.8.8.8;
proxy_connect;
proxy_connect_allow 80 443;
proxy_connect_connect_timeout 10s;
proxy_connect_read_timeout 10s;
proxy_connect_send_timeout 10s;
server_name localhost;
location / {
# root html;
# index index.html index.htm;
proxy_pass $scheme://$http_host$request_uri;
proxy_set_header Host $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
nginx -t ##检查文件配置
三、反向代理
概述: 反向代理是 客户端与后端服务器之间的中间服务器,代表后端服务器接收客户端请求,隐藏真实服务器信息。

-
核心优势:
-
负载均衡:分发请求到多个后端服务器。
-
安全防护:隐藏后端服务器 IP,防止直接暴露。
-
缓存加速:缓存静态内容,减少后端压力。
-
配置步骤:
bash
#反向代理(七层代理)
进行反向代理的配置,写在server外面(准备两台httpd网站,两个网站,两个网站内容不同,记得关防火墙,启动httpd)
vim /usr/local/nginx/conf/nginx.conf
upstream myhttp {
server 192.168.10.103:80;
server 192.168.10.104:80;
}
#下面这个修改server里面的location
location / {
# root html;
# index index.html index.htm;
proxy_pass http://myhttp;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
nginx -t ##检查文件配置
(四层反向代理)并不在http里面写,在ecents下面写
vim /usr/local/nginx/conf/nginx.conf
stream {
upstream myssh{
server 192.168.10.102:22;
}
server {
listen 2222;
proxy_pass myssh;
proxy_connect_timeout 10s;
proxy_timeout 1h;
}
}
nginx -t ##检查文件配置
四、Nginx 缓存
Nginx 缓存通过存储响应内容(静态或动态)减少后端服务器负载,提升响应速度和并发能力。
1. 缓存功能的核心原理和缓存类型
(1)代理缓存
-
核心作用:通过缓存后端服务器的响应内容,减少重复请求对后端的压力,加快客户端访问速度。
-
缓存类型:
-
代理缓存(Proxy Cache):针对反向代理场景,缓存后端服务器的响应(如动态接口、静态页面)。
-
静态资源缓存 :直接缓存静态文件(如 CSS、JS、图片),通过
expires
或Cache-Control
头控制浏览器缓存。
-
(2)代理缓存原理
-
缓存键(Cache Key) :根据请求的 URL、HTTP 方法、请求头(如
Host
)生成唯一标识,用于判断是否命中缓存。 -
缓存存储 :将响应内容以文件形式存储在磁盘(或内存),并通过
proxy_cache_path
配置管理。 -
缓存有效性:
-
基于 HTTP 响应头(如
Cache-Control
、Expires
)自动判断缓存过期时间。 -
可手动设置缓存有效期(如
proxy_cache_valid
)。
-
-
缓存更新:当缓存过期或无效时,向后端服务器重新请求并更新缓存。
2. 代理缓存功能设置
(1)反向代理配置
bash
upstream backend {
server 10.0.0.1:80;
server 10.0.0.2:80;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
}
}
(2)设置缓存功能
分两步:定义缓存路径 和启用缓存规则。
-
定义缓存路径 (在
http
块中配置):bashhttp { proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off; # 参数说明: # - `/var/cache/nginx`: 缓存文件存储路径 # - `levels=1:2`: 目录层级结构(1层子目录,2位哈希字符) # - `keys_zone=my_cache:10m`: 定义缓存区域名称和共享内存大小(10MB) # - `max_size=1g`: 最大磁盘缓存空间 # - `inactive=60m`: 60分钟内未被访问的缓存自动删除 # - `use_temp_path=off`: 禁用临时文件路径,直接写入缓存目录 }
-
启用缓存规则 (在
location
块中配置):bashserver { location / { proxy_pass http://backend; proxy_cache my_cache; # 关联缓存区域 proxy_cache_valid 200 302 10m; # 状态码200/302缓存10分钟 proxy_cache_valid 404 1m; # 状态码404缓存1分钟 proxy_cache_key "$scheme$request_method$host$request_uri"; # 定义缓存键 add_header X-Cache-Status $upstream_cache_status; # 添加响应头显示缓存状态 } }
(3)验证缓存功能
-
查看响应头:
-
通过浏览器开发者工具或
curl
检查响应头是否包含X-Cache-Status
:curl -I http://example.com
-
可能的取值:
-
HIT
:缓存命中 -
MISS
:未命中,从后端获取 -
EXPIRED
:缓存已过期 -
BYPASS
:绕过缓存
-
-
-
检查缓存文件:
- 到
/var/cache/nginx
目录查看是否生成缓存文件(文件名基于哈希值)。
- 到
-
压力测试:
- 使用工具(如
ab
或wrk
)模拟高并发请求,观察后端服务器的负载是否降低。
- 使用工具(如
五、Nginx rewrite和正则
Rewrite 功能通过正则表达式实现 URL 重写、跳转和逻辑控制,是 SEO 优化和路由管理的核心工具。
Rewrite的应用场景:
- 路径美化:将/product/123 转换为 /index.php?id=123
- 旧链接迁移:将过期URL永久重定向(301)到新地址
- 强制HTTPS/域名统一:自动跳转http://到https://,或合并www与非www域名
- 动态路由:适配单页应用(SPA),RESTful API 路由
- 灰度发布:按规则将部分流量导向新版本服务
(1)Nginx 正则
符号 | 含义 | 示例 |
---|---|---|
^ |
匹配字符串开头 | ^/admin 匹配以 /admin 开头的路径 |
$ |
匹配字符串结尾 | .html$ 匹配以 .html 结尾的 URL |
. |
匹配任意单个字符(除换行符) | a.c 匹配 abc 、aac |
\d |
匹配数字(等价于 [0-9] ) |
user/\d+ → user/123 |
\w |
匹配字母、数字、下划线 | \w+ 匹配 user_123 |
() |
分组捕获,替换时用 $1 、$2 引用 |
^/(\w+)/(\d+)$ → /$1?id=$2 |
* |
匹配前一个字符 0 次或多次 | a* 匹配空、a 、aa |
+ |
匹配前一个字符 1 次或多次 | \d+ 匹配 1 、123 |
? |
匹配前一个字符 0 次或 1 次 | https? 匹配 http 或 https |
{n,m} |
匹配前一个字符 n 到 m 次 | a{2,4} 匹配 aa 、aaa 、aaaa |
[abc] |
匹配括号内任意一个字符 | [aeiou] 匹配元音字母 |
[^abc] |
匹配不在括号内的任意字符 | [^0-9] 匹配非数字字符 |
(2)nginx location
-
location 的语法:
bashlocation [匹配模式] { # 处理逻辑 (如 root, proxy_pass, rewrite 等) }
常用修饰符:
修饰符 作用 =
精确匹配(完全相等) ^~
前缀匹配(优先于正则匹配) ~
正则匹配(区分大小写) ~*
正则匹配(不区分大小写) 无修饰符 普通前缀匹配(优先级最低) -
**location 的优先级规则:**精确匹配 > 精确前缀匹配 > 正则匹配 (~ 和 ~* 同时存在时,文件中物理位置靠上的优先)> 普通前缀匹配 > 通用匹配
-
Location 匹配流程
精确匹配 :检查是否有
location =
精确匹配当前 URI,若有则立即使用。前缀匹配:
查找最长匹配的普通前缀(无修饰符)。
检查是否有
^~
前缀匹配,若有则停止后续正则匹配。正则匹配:按配置文件中的顺序依次匹配,首次匹配成功后停止。
默认处理:若未匹配任何规则,使用普通前缀匹配的最长路径
- location 验证:

(3)Rewrite
rewrite :
语法:rewrite <regex> <replacement> [flag];
regex:正则匹配URL字符串(只能对域名后边的除去传递的参数外的字符串起作用)
replacement: 重写跳转后的地址
-
正则表达式 :匹配请求 URI(如
^/old/(.*)
)。 -
替换规则 :生成新 URI(如
/new/$1
)。 -
Flag 类型:
Flag 作用 last
重写后重新匹配新 URL 的 location 块(类似循环,最多 10 次) break
立即停止处理后续规则,直接返回结果 redirect
返回 302 临时重定向(浏览器地址栏显示新 URL) permanent
返回 301 永久重定向(SEO 友好,浏览器缓存跳转)
Nginx 跳转:
- server{ } 块中的 rewrite
执行顺序:在请求进入server块后、匹配location前执行。
作用域:影响该server块下所有请求(全局生效)。
- location{ } 块中的 rewrite
执行顺序:在请求匹配到该 location 后执行。
作用域:仅对该 location 匹配的请求生效(局部生效)。
- if{ } 块中的 rewrite
执行顺序:在满足 if 条件时触发。
作用域:依赖 if 表达式所在的上下文(如在server中或location中)
-
rewrite flag 验证
bash验证方法: 查看响应头: curl -I http://example.com/old-path # 输出示例(301 重定向): # HTTP/1.1 301 Moved Permanently # Location: http://example.com/new-path 检查 Nginx 日志: rewrite_log on; error_log /var/log/nginx/error.log notice; # 查看重写过程日志
-
rewrite 中的捕获组
bash小括号()用于定义正则表达式的捕获组 捕获组"( )" 在正则表达式中, (pattern) 会匹配 pattern 并捕获内容,按顺序存入 $1, $2, $3 等变量中。 引用方式 在 rewrite 的替换字符串中,通过 $1 表示第一个捕获组,$2 表示第二个,依此类推。 [root@ localhost ~]# vim /usr/local/nginx/conf/nginx.conf location / category/ { #匹配 / category/ tech/123, 捕获 tech 到 $1,123 到 $2 rewrite ^/ category/(.+)/(\d+)$ /archive/$1/$2 last; ) location /archive/ { #返回捕获的分类和 ID return 200" Category: $1, ID: $2"; 测试访问 [root@ localhost~]# curl http://localhost/category/tech/456 Category: tech, ID: 456
-
nginx 中的set指令
bash语法: set $variable value vim /usr/local/nginx/conf/nginx.conf location /demo { set $name "Nginx"; #定义变量 $name return 200 "Hello, $name!"; #输出:Hello,Nginx! } 测试: curl http://localhost/demo Hello,Nginx!
(4)实例:
- 基于域名的跳转
bash
vim /usr/local/nginx/conf/nginx.conf
if ($host = 'www.kgc.com')
{
rewrite ^/(.*)$ http://www.newkgc.com/$1 permanent;
}
- 基于客户端IP访问跳转
bash
vim /usr/local/nginx/conf/nginx.conf
set $rewrite true;
if ($remote_addr = "192.168.6.125") {
set $rewrite false;
}
if ($rewrite = true {
rewrite (.+) /maintenance.html;
}
location = /maintenance.html {
root /usr/share/nginx/html;
}