目录
一,正向代理
正向代理(Forward Proxy)是一种位于客户端和原始服务器之间的代理服务器,其主要作用是将客户端的请求转发给目标服务器,并将响应返回给客户端Nginx的正向代理充当客户端的“中间人”,代表用户访问外部资源并隐藏真实IP它是企业内网管控、安全审计与加速访问的核心工具。用于场景一般是:
内网访问控制: | 限制员工访问特定网站(如社交媒体) |
匿名访问: | 通过代理服务器隐藏用户真实身份。 |
资源缓存加速: | 缓存公共资源(如软件包、镜像文件),减少外网带宽消耗。 |
1,编译安装Nginx
Nginx的配置及运行需要pcre、zlib等软件包的支持,因此应预先安装这些软件的开发包(devel),以便提供相应的库和头文件,确保ginx的安装顺利完成。
(1)安装支持软件
(2)编译安装Nginx
配置Nginx的编译选项时,将安装目录设为/usr/local/nginx,运行用户和组均设为nginx;启用http_stub_status_module模块以支持状态统计,便于查看服务器的连接信息。具体项根据实际需要来定,配置前可参考“./configure--help”给出的说明。
--user=nginx | #指定nginx运行用户 |
--group=nginx | #指定nginx运行组 |
--with-http ssl module | #支持https:// |
--with-http_v2_module | #支持http版本2 |
--with-http realip module | #支持ip透传 |
--with-http_stub_status_module | #支持状态页面 |
--with-http_gzip_static module | #支持压缩 |
--with pcre | #支持正则 |
--with-stream | #支持tcp反向代理 |
--with-stream ssl module | #支持tcp的ssl加密 |
--with-stream realip module | #支持tcp的透传ip |
--add-module=./ngxhttp proxy connect module | #支持https转发(默认nginx不支持https转发,需要添加第三方模块) |
为了使Nginx服务器的运行更加方便,可以为主程序nginx创建链接文件,以便管理员直接执行“nginx”命令就可以调用Nginx的主程序。
(3)添加Nginx系统服务
2,配置正向代理
(1)编辑主配置文件添加正向代理相关配置
(2)验证正向代理
二,反向代理
Nginx的七层(应用层)反向代理基于HTTP/HTTPS协议,深度解析应用层内容(如URL、Header、Cookie),将客户端请求精准转发至后端服务器。作为企业级架构的“智能调度器”,它实现了负载均衡、安全隔离与性能优化的核心能力。应用场景一般是:
负载均衡: | 将流量分发至多台后端服务器,避免单点故障。 |
动静分离: | 静态资源(图片、CSS/JS)由Nginx直接响应,动态请求(PHP、API)转发至Apache/Tomcat. |
SSL终端: | 统一处理HTTPS加密/解密,降低后端服务器计算压力。 |
灰度发布 | :根据请求特征(如IP、Header)将部分流量导向新版本服务。 |
Nginx的四层(网络层)反向代理基于TCP/UDP协议,直接转发原始数据流,不解析应用层内容。它专为高性能、低延迟的传输层场景设计,是数据库、游戏服务器等非HTTP服务的理想选择。应用场景一般是:
数据库代理: | 对外暴露统一端口,内部转发至MySQL、Redis集群。 |
游戏服务器: | 代理UDP协议,实现实时数据包负载均衡。 |
SSH跳板机: | 通过端口映射安全访问内网服务器。 |
高可用服务: | TCP服务(如MQTT)的主备切换与健康检查。 |
反向代理,指的是浏览器/客户端并不知道自己要访问具体哪台目标服务器,只知道去访问代理服务器,代理服务器再通过反向代理+负载均衡实现请求分发到应用服务器的一种代理服务。
反向代理服务的特点是代理服务器代理的对象是应用服务器,也就是对于浏览器/客户端 来说应用服务器是隐藏的。
1,配置nginx七层代理
通过配置nginx七层代理实现转发nginx请求至后端的httpd服务,通过该转发也能实现nginx+httpd的动静分离,动静分离会在后续章节介绍
(1)环境安装
(2)配置nginx七层代理转发
上述配置中,使用upstream定义后端应用服务器的地址池“backend”,在location块中,使用proxy_pass,转发请求至后端地址池,proxy_set_header Host $host:将请求中的Host头部设置为客户端请求的主机名,proxy_set header X-Real-IP$remote_addr:将请求中的X-Real-IP头部设置为客户端的真实IP地址。
(3)验证转发效果
后端地址池中也可以定义多台主机,实现负载均衡
2,配置nginx四层代理
SSH协议是基于TCP协议的,配置nginx的四层代理,实现代理ssh请求至后端服务器,用以登录内网服务器场景
(1)配置四层代理
配置文件
(2)验证四层代理
第二台验证
三,Nginx缓存
Nginx的缓存功能是其核心能力之一,主要用于加速内容响应和降低后端服务器负载它的缓存功能主要基于反向代理(ProxyCache),但也可用于其他场景(如FastCGI 缓存)。以下是详细解析:
1,缓存功能的核心原理和缓存类型
缓存类型 | 作用场景 |
代理缓存 | 反向代理模式下缓存后端服务器(如Tomcat、Apache)的响应内容。 |
FastCGI 缓存 | 缓存PHP/Python等通过FastCG协议处理的动态内容(需配合PHP-FPM使用)。 |
uWSGI/SCGI 缓存 | 似 FastCGI,用于其他后端协议。 |
静态资源缓存 | 通过 expires指令设置客户端浏览器缓存(非服务端缓存)。 |
代理缓存原理:
第一步:客户端第一次向Nginx请求数据A;
第二步:当Nginx发现缓存中没有数据A时,会向服务端请求数据A:
第三步:服务端接收到Nginx发来的请求,则返回数据A到Nginx,并且缓存在Nginx;
第四步:Nginx返回数据A给客户端应用:
第五步:客户端第二次向Nginx请求数据A:
第六步:当Nginx发现缓存中存在数据A时,则不会请求服务端;第七步:Nginx把缓存中的数据A返回给客户端应用。
2,代理缓存功能设置
因代理缓存功能需在反向代理模式下缓存启端服务器(如Tomcat、Apache)的响应内容需要先配置七层反向代理
(1)反向代理配置
(2)设置缓存功能
关键配置解析
proxy_cache_path: | 定义缓存文件的存储路径 |
levels=1:2: | 定义缓存目录的层级结构,1evels=N:M,表示缓存文件路径的层级深度 |
keys_zone=my_cache:10m | 定义共享内存区域,用于存储缓存键(key)和元数据(如过期时间),10m:共享内存区大小(通常每1MB可存储约8000个键) |
inactive=60m | :定义缓存内容的闲置有效期。60分钟内未被访问,将被自动删除 |
max size=1g: | 定义缓存目录的最大磁盘空间。当缓存量达到1GB 时,Nginx 启动 LRU(最近最少使用)算法清理旧缓存。 |
use_temp path=off : | 控制临时文件的存储位置,推荐值:off(减少磁盘操作,提升性能) |
(3)验证缓存功能
curl -r 192.168.10.101
四,Nginx rewrite和正则
已成为现代Web服务的核心组件之一。它不仅是负载均衡、反向代理的首选工具,更是实现流量调度、安全防护和动态路由的关键枢纽。而在这其中,Rewrite模块作为Nginx的“规则引擎”,扮演着至关重要的角色--它赋予开发者精准控制URL的能力,让请求的流转不再受限于物理路径,而是通过逻辑规则灵活适配业务需求。
Rewrite的应用场景
路径美化:将/product/123转换为/index.php?id=123
旧链接迁移:将过期URL永久重定向(301)到新地址强制HTTPS/域名统一:自动跳转http://到https://,或合并www与非www域名动态路由:适配单页应用(SPA)、RESTfuIAPI路由灰度发布:按规则将部分流量导向新版本服务
1,Nginx正则
学习Rewrite之前要熟悉正则表达式,表中列举出一些常用的正则表达式元事符
字符 | 描述 |
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或多次。如"ol“"能匹配"o"及“ol”、"ol" |
+ | 匹配前面的字符一次或多次。如“ol+“能匹配"ol"及"oI"、“o“”,但不能匹配“o” |
? | 匹配前面的字符零次或一次,例如"do(es)?"能匹配“do"或者“does","?“等效于”(0,1} |
. | 匹配除“""之外的任何单个字符,若要匹配包括“""在内的任意字符,请使用诸如“[\n]之类的模式 |
\ | 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如\匹配个换行符,而“\$"则匹配“$” |
\d | 匹配纯数字 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,} | 匹配单个字符c |
[a-z] | 匹配 a-z小写字母的任意一个 |
[a-zA-Z] | 匹配a-z小写字母或A-Z大写字母的任意一个 |
2,nginx location
在学习rewrite前还要了解下location,因为rewrite 通常会与 location 结合使用,但并非绝对。二者的协作能实现更精细的路径控制,1ocation是Nginx中用于匹配请求URI(路径:只能对域名后边的除去传递的参数外的字符串起作用,例如http://www.kgc.com/index.php?id=1 只匹配/index.php)的核心指令,用于根据请求路径定义不同的处理逻辑(如静态资源服务、反向代理、重定向等)
(1)location 的语法
location[匹配模式]{
#处理逻辑(如root,proxy_pass,rewrite等)
匹配模式类型:
模式 | 说明 |
location /uri普通前缀匹配: | 匹配以指定路径开头的 URI |
location=/精确匹配: | 仅匹配完全相同的URI(优先级最高)。 |
location~ | 区分大小写的正则表达式匹配。 |
location~*正则匹配: | 不区分大小写的正则表达式匹配。 |
location·~ | 精确前缀匹配:匹配前缀路径后,不再检查正则匹配(优先级高于正则)。 |
location/通用匹配: | 默认方式,优先级最低,其他方式匹配不到时匹配 |
location 的优先级规则:
精确匹配 〉精确前缀匹配 〉正则匹配( 和 *同时存在时,文件中物理位置靠上的优先)>普通前缀匹配>通用匹配。
3,Rewrite
(1)Rewrite 语法
rewrite<regex><replacement>[flag];
regex:正则匹配URL字符串(只能对域名后边的除去传递的参数外的字符串起作用,例如
http://www.kgc.com/index.php?id=l 只对/index.php 重写)
replacement:重写跳转后的地址
flag类型:
last: | 重写后的URI 会重新触发的指令,是默认类型 |
break: | 重写后的URI不会重新匹配location,直接在当前location中处理,且后续的 rewrite 指令不再执行 |
redirect: | 返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url(因为是临时) |
permanent: | 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url 。 |
在实际工作的应用中,Nginx跳转需求有三种方式可实现。可以直接用rewrite进行匹配跳转,也可以使用if匹配全局变量后跳转。另外,还可以使用1ocation匹配再跳转所以rewrite 只能放在 server、if{}、location{}配置段中
1.server{}块中的rewrite
执行顺序:在请求进入server块后、匹配location前执行。
作用域:影响该server块下所有请求(全局生效)。
2.location{}块中的rewrite执行顺序:在请求匹配到该location后执行。
作用域:仅对该location匹配的请求生效(局部生效)。
3.if{}块中的 rewrite
执行顺序:在满足if 条件时触发。
作用域:依赖if表达式所在的上下文(如在server中或location中)。