nginx作为一款高性能的开源web服务器和反向代理工具,凭借其轻量级、高并发处理能力和灵活的模块化设计,已成为现代web架构的基石。从全球顶尖网站到微服务架构,nginx在负载均衡、缓存加速、安全防护等场景中扮演着关键角色。本文聚焦nginx的四大核心功能--反向代理(七层/四层)、正向代理、缓存机制和正则表达式匹配,通过理论解析与场景化案例,深入掌握其设计思想与实践技巧,为构建高效、稳定的web服务莫定坚实基础。
一、正向代理
正向代理(forward proxy)是一种位于客户端和原始服务器之间的代理服务器,其主要作用是将客户端的请求转发给目标服务器,并将响应返回给客户端nginx 的 正向代理 充当客户端的“中间人”,代表用户访问外部资源并隐藏真实 ip。它是企业内网管控、安全审计与加速访问的核心工具。用于场景一般是:
内网访问控制:限制员工访问特定网站(如社交媒体)
匿名访问:通过代理服务器隐藏用户真实身份。
资源缓存加速:缓存公共资源(如软件包、镜像文件),减少外网带宽消耗。
1.编译安装nginx
(1)安装支持软件
nginx 安装文件可以从官方网站 http://www.nginx.org/下载。
nginx 的配置及运行需要 pcre、zlib 等软件包的支持,因此应预先安装这些软件的开发包(devel),以便提供相应的库和头文件,确保 nginx 的安装顺利完成。
[root@localhost ~]# dnf -y install gcc* pcre-devel zlib-devel openssl-devel
(2)创建运行用户、组和日志目录
nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限,增加灵活性、降低安全风险。例如,创建一个名为nginx 的用户,不建立宿主文件夹,也禁止登录到she11 环境。
[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
配置nginx的编译选项时,将安装目录设为/usr/local/nginx,运行用户和组均设为nginx:启用 http_stub_status module 模块以支持状态统计,便于查看服务器的连接信息。具体选项根据实际需要来定,配置前可参考“./configure--help”给出的说明。
[root@localhost ~]# tar zxf nginx-1.26.3_http_proxy.tar.gz [root@localhost ~]# cd nginx-1.26.3 [root@localhost ~]# ./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_module
--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=./ngx http_proxy_connect_module:支持https转发(默认nginx不支持https转发,需要添加第三方模块)
为了使 nginx 服务器的运行更加方便,可以为主程序 nginx 创建链接文件,以便管理员直接执行“nginx”命令就可以调用 nginx 的主程序。
[root@localhost nginx-1.26.3]# ln-s /usr/local/nginx/sbin/nginx /usr/local/sbin/
(4)添加nginx系统服务
为了使 nginx 服务的启动、停止、重载等操作更加方便,可以编写 nginx 服务脚本,并使用 chkconfig 和 systemct1 工具来进行管理。
[root@localhost ~]# vi /lib/systemd/system/nginx.service [unit] description=the nginx http and reverse proxy server after=network.target [service] type=forking pidfile=/usr/local/nginx/logs/nginx.pid execstart=/usr/local/sbin/nginx execreload=/usr/local/sbin/nginx-s reload execstop=/usr/local/sbin/nginx -s stop [instal1] wantedby=multi-user.target
[root@localhost ~]# systemctl daemon-reload [root@localhost ~]# systemctl start nginx [root@localhost ~]# systemctl enable nginx
2.配置正向代理
(1)编辑主配置文件添加正向代理相关配置:
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf server { listen 8080; #代理监听端口 resolver 114.114.114.114 8.8.8.8; #解析域名使用的dns #多个dns用空格分隔 proxy_connect; #启用代理connect方法(支持https) proxy_connect_allow 80 443; #允许代理到80和443端口 proxy_connect_connect_timeout 10s; proxy_connect_read_timeout 10s; proxy_connect_send_timeout 10s; #处理http/https请求 location / { 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 ""; }
[root@localhost ~]# nginx -t [root@localhost ~]# nginx -s reload
(2)验证正向代理:
windows中验证,使用火狐浏览器,设置http和https代理即可:
linux中验证,使用curl命令,并指定代理服务器进行访问测试
[root@localhost ~]# curl -x http://192.168.10.101:8080 www.baidu.com
在101上查看日志
[root@localhost ~]# cat /usr/local/nginx/logs/access.log
二、反向代理
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)的主备切换与健康检查
反向代理,指的是浏览器/客户端并不知道自己要访问具体哪台目标服务器,只知道去访问代理服务器,代理服务器再通过反向代理 +负载均衡实现请求分发到应用服务器的一种代理服务。
反向代理服务的特点是代理服务器 代理的对象是应用服务器,也就是对于浏览器/客户端 来说应用服务器是隐藏的。
资源清单
本实验需要两台主机
操作系统 | 配置 | ip | 服务 |
openeuler | 2c4g | 192.168.10.101 | nginx |
openeuler | 2c4g | 192.168.10.102 | httpd |
1.配置nginx七层代理
(1)环境安装
192.168.10.102上操作:
[root@localhost ~]# systemctl stop firewalld [root@localhost ~]# dnf -y install httpd [root@localhost ~]# echo "这是后端主机" >/var/www/html/index.html [root@localhost ~]# systemctl start httpd
(2)配置nginx七层代理转发
192.168.10.101上的操作:
[root@localhost ]# vi /usr/local/nginx/conf/nginx.conf 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; } } } [root@localhost]# nginx -t [root@localhost]# nginx -s reload
上述配置中,使用upstream定义后端应用服务器的地址池“backend”,在location块中,使用proxy_pass,转发请求至后端地址池,proxy_set header host $host:将请求中的host头部设置为客户端请求的主机名,proxy_set header x-real-ip sremote addr:将请求中的 x-real-ip 头部设置为客户端的真实 ip 地址。
(3)验证转发效果
2.配置nginx四层代理
ssh协议是基于tcp协议的,配置nginx的四层代理,实现代理ssh请求后至后端服务器,可以登录内网服务器场景
(1)配置四层代理
192.168.10.101上操作:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf stream { upstream ssh_cluster { #定义后端地址池 server 192.168.10.102:22; #设置后端地址和服务端口 } server { listen 2222; proxy_pass ssh_cluster; proxy_connect_timeout 5s; #连接超时时间 proxy_timeout 1h; #长连接保持时间 } }
注意: stream需要与http{ }模块平级,不能在http{ }中嵌套
(2)验证四层代理
通过上面的验证发现,通过102的2222端口登录后,实际上是登录到101服务器。
三、nginx缓存
nginx 的缓存功能是其核心能力之一,主要用于加速内容响应和降低后端服务器负载。它的缓存功能主要基于反向代理(proxy cache),但也可用于其他场景(如 fastcgi 缓存)。以下是详细解析:
1.缓存功能的核心原理和缓存类型
缓存类型 | 作用场景 |
代理类型 | 反向代理模式下缓存后端服务器(如 tomcat、apache)的响应内容。 |
fastcgi 缓存 | 缓存 php/python 等通过 fastcgl 协议处理的动态内容(需配合 php-fpm使用)。 |
uwsgi/scgi缓存 | 类似 fastcg,用于其他后端协议。 |
静态资源缓存 | 通过 expires 指令设置客户端浏览器缓存(非服务端缓存)。 |
代理缓存原理:
第一步:客户端第一次向nginx请求数据a;
第二步:当nginx发现缓存中没有数据a时,回想服务端请求数据a;
第三步:服务端接收到ningx发来的请求,则返回数据a到nginx,并且缓存在nginx;
第四步:nginx返回数据a给客户端应用;
第五步:客户端第二次向nginx请求数据a;
第六步:当nginx发现缓存中存在数据a时,则不会请求服务端;
第七步:nginx把缓存中的数据a返回给客户端应用。
2.代理缓存功能设置
因代理缓存功能需在反向代理模式下缓存后端服务器(如tomcat、apache)的响应内容。
需要先配置七层反向代理
(1)反向代理配置
[root@localhost ]# vi /usr/local/nginx/conf/nginx.conf 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; } } } [root@localhost]# nginx -t [root@localhost]# nginx -s reloa
(2)设置缓存功能
[root@localhost ~]# mkdir -p /data/nginx/cache [root@localhost ~]# chown nginx:nginx /data/nginx/cache -r [root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf http { # 定义缓存路径和参数 proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g use_temp_path=off; server { listen 80: server_name_example.com; location / { proxy_pass http://backend; #启用缓存区 proxy_cache my_cache; #定义缓存键(url +请求方法 +协议) 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分钟 proxy_cache_valid any 5s; #其他状态码缓存5秒 #添加缓存状态头(调试用) add_header x-cache-status $upstream_cache_status; } } }
关键配置解析:
proxy_cache path:定义缓存文件的存储路径
levels=1:2:定义缓存目录的层级结构,1eve1s=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)验证缓存功能
四、nginx rewrite和正则
在云计算与分布式架构的时代,nginx 凭借其高性能、高并发处理能力以及模块化设计,已成为现代web服务的核心组件之一。它不仅是负载均衡、反向代理的首选工具,更是实现流量调度、安全防护和动态路由的关键枢纽。而在这其中,rewrite模块作为nginx的“规则引擎”,扮演着至关重要的角色--它赋予开发者精准控制url的能力,让请求的流转不再受限于物理路径,而是通过逻辑规则灵活适配业务需求。
rewrite的应用场景
路径美化:将/product/123转换为/index.php"h24">1.nginx正则
字符 | 描述 |
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或多次。如“o1““能匹配“o“及“o!”、"ol" |
+ | 匹配前面的字符一次或多次。如“ol+"能匹配"o1"及"oi"、"o”,但不能匹配"o” |
? | 匹配前面的字符零次或一次,例如"do(es)?"能匹配"do"或者“does","?等效于“{0,1}" |
` | 匹配除"\n"之外的任何单个字符,若要匹配包括“\n"在内的任意字符,请使用诸如[.\n]之类的模式 |
\ | 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n"匹配个换行符,而“$"则匹配“$” |
\d | 匹配纯数字 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{c} | 匹配单个字符c |
[a-z] | 匹配 a-z小写字母的任意一个 |
[a-za-z] | 匹配 a-z 小写字母或 a-z 大写字母的任意一个 |
1.nginx 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 / | 通用匹配 | 默认方式,优先级最低,其他方式匹配不到时匹配 |
loction 的优先级规则:
精确匹配 > 精确前缀匹配 > 正则匹配(~和~*同时存在时,文件中物理位置靠上的优先)>普通前缀匹配>通用匹配
(2)location验证
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf location / { return 200 "通用匹配"; } location /abc { return 200 "普通前缀匹配"; } location ~ /test/abcdef { return 200 "区分大小写正则"; } location ~* /test/abc { return 200 "不区分大小写正则"; } location ^~ /abcdef { return 200 "精确前缀匹配"; } location = /abc { return 200 "精确匹配"; }
每次请求192.168.10.101/abc后,按优先级顺序依次注释配置文件中的location,会发现每次的响应内容发生变更了。ps:使用正则模式时,uri部分可以使用正则表达式
例如:location ~\.(jpglpnglgif)$ {
}
2.rewrite
(1)rewrite语法
rewrite <regex> <replacement> [flag];
regex:正则匹配url字符串(只能对域名后边的除去传递的参数外的字符串起作用,例如http://www.kgc.com/index.php"background-color: rgb(231, 243, 237); padding: 1px 3px; border-radius: 4px; overflow-wrap: break-word; text-indent: 0px; display: inline-block;">replacement:重写跳转后的地址
flag类型:
last:重写后的 uri 会重新触发 1ocation 匹配,并执行新匹配到的location块中的指令,是默认类型
break:重写后的 uri 不会重新匹配 location,直接在当前 location 中处理,且后续的 rewrite 指令不再执行
redirect:返回302临时重定向,浏览器地址会显示跳转后的 url 地址,爬虫不会更新url(因为是临时)
permanent:返回301永久重定向,浏览器地址栏会显示跳转后的 url地址,爬虫更新url
在实际工作的应用中,nginx跳转需求有三种方式可实现。可以直接用 rewrite 进行匹配跳转,也可以使用 if 匹配全局变量后跳转。另外,还可以使用1ocation 匹配再跳转。所以rewrite 只能放在 server{}、if{}、locationt{}配置段中
1.servert{ } 块中的 rewrite
执行顺序:在请求进入server块后、匹配location前执行。
作用域:影响该server块下所有请求(全局生效)。
2.location{}块中的rewrite
执行顺序:在请求匹配到该 location 后执行
作用域:仅对该 1ocation 匹配的请求生效(局部生效)。
3.if{} 块中的 rewrite
执行顺序:在满足if 条件时触发。
作用域:依赖 if 表达式所在的上下文(如在server中或location中)。(2)rewrite flag验证
(2)rewrite flag验证
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf default_type text/plain; #使用浏览器验证时,为防止浏览器请求时直接下载return的内容,而不是在页面展示内容 location /abc { rewrite ^/ /def last; } location /def { return 200 "this is def"; } [root@localhost conf]# nginx -s reload
使用浏览器请求,发现相应内容是:this is def ,说明last标记后继续向下匹配location了
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf default_type text/plain; #使用浏览器验证时,为防止浏览器请求时直接下载return的内容,而不是在页面展示内容 location /abc { rewrite ^/ /def ; } location /def { return 200 "this is def"; } [root@localhost conf]# nginx -s reload
改成break标记,使用浏览器请求,发现请求页面未找到(因为网页代码目录确实不存在/def的内容)说明break标记使用当前结果不继续向下匹配了
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf default_type text/plain; #使用浏览器验证时,为防止浏览器请求时直接下载return的内容,而不是在页面展示内容 location /abc { rewrite ^/ /def permanent; } location /def { return 200 "this is def"; } [root@localhost conf]# nginx -s reload
改成permanent标记,使用浏览器请求,发现请求页面301跳转,并且地址栏显示的是跳转后的地址
(3)rewrite中的捕获组
在 nginx 的 rewrite 指令中,小括号 ()用于定义正则表达式的捕获组(capturegroup),捕获的文本可以通过 $1,$2,$3 等变量在重写后的 uri 中引用
捕获组“()”
在正则表达式中,(pattern)会匹配pattern 并捕获内容,按顺序存入$1,$2,$3 等变量中。
引用方式
在 rewrite 的替换字符串中,通过 81 表示第一个捕获组,$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 conf]# nginx -s reload
测试访问
(4)nginx中的set指令
在 nginx 中,set 指令用于定义变量并赋值,这些变量可以用于后续的条件判断、日志记录、重写规则等场景。它提供了灵活的动态配置能力,尤其在处理复杂的请求逻辑时非常有用。
语法:set $variable value;
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf location /demo { set $name "nginx"; return 200 "hello,$name!"; } [root@localhost conf]# nginx -s reload
测试访问
到此这篇关于nginx的核心功能--正向代理、反向代理、缓存和rewrite的文章就介绍到这了,更多相关nginx的正向代理、反向代理、缓存和rewrite内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论