目录
一:正向代理
1:编译安装nginx
(1)安装支持软件
(2)创建运行用户、组和日志目录
(3)编译安装nginx
(4)添加nginx系统服务
2:配置正向代理
(1)编辑主配置文件添加正向代理相关配置
(2)验证正向代理
二:反向代理
1:配置nginx七层代理
(1)环境安装
(2)配置nginx七层代理转发
(3)验证转发效果
2:配置nginx四层代理
(1)配置四层代理
(2)验证四层代理
三:Nginx缓存
1:缓存功能的核心原理和缓存类型
2:代理缓存功能设置
(1)反向代理配置
(2)设置缓存功能
(3)验证缓存功能
四:Nginx rewrite和正则
1:nginx正则
2:nginx location
(1)location 的语法:
(2)location 验证
3:Rewrite
一:正向代理
正向代理(Forward Proxy)是一种位于客户端和原始服务器之间的代理服务器,其主要作用是将客户端的请求转发给目标服务器,并将响应返回给客户端Nginx的正向代理充当客户端的"中间人",代表用户访问外部资源并隐藏真实IP。它是企业内网管控、安全审计与加速访问的核心工具。
用于场景一般是:
>内网访问控制:限制员工访问特定网站(如社交媒体)
>匿名访问:通过代理服务器隐藏用户真实身份。
>资源缓存加速:缓存公共资源(如软件包、镜像文件)减少外网带宽消耗.
1:编译安装nginx
(1)安装支持软件
(1)安装支持软件
Nginx的配置及运行需要pcre、zlib等软件包的支持,因此应预先安装这些软
件的开发包(devel),以便提供相应的库和头文件,确保Nginx的安装顺利完成。
[root@localhost ^]# dnf install -y gcc make pcre-devel z]ib-developenssl-devel perl-ExtUtils-MakeMaker git wget tar
(2)创建运行用户、组和日志目录
Nginx服务程序默认以nobody身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限,增加灵活性、降低安全风险。例如,创建一个名为nginx的用户,不建立宿主文件夹,也禁止登录到Shell环境。
[root@localhostuseradd -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 `]# git clone
https://github.com/chobits/ngx_http_proxy_connect_module.git#(默认nginx不支持转发https)下载第三方模块,用以支持正向代理https发,提供的源码目录已提前放置该模块,这里无需下载,仅作为介绍
[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_staticmodule
--with-pcre --with-stream --with-stream_ssl_module
--with-stream_realip_module --with-http_gzip_static_module
--add-module=./ngx_http_proxy_connect_module
[root@localhost nginx-1.26.3]# make & make install
参数说明:
#指定nginx运行用户 --user=nginx
#指定nginx运行组 --group=nginx
#支持https:// --with-http_ssl_module
#支持http版本2 --with-http_v2_module
#支持ip透传 --with-http_realip_module
#支持状态页面 --with-http_stub_status_module
#支持压缩 --with-http_gzip_static_module
#支持正则 --with-pcre
#支持tcp反向代理 --with-stream
#支持tcp的ssl加密 --with-stream_ssl_module
#支持tcp的透传ip --with-stream_realip_module
--add-module=./ngx_http_proxy_connect_module #支持https转发默认nginx不支持https转发,需要添加第三方模块
为了使Nginx服务器的运行更加方便,可以为主程序nginx创建链接文件,以便管理员直接执行"nginx"命令就可以调用 Nginx的主利星序。
[root@localhost nginx-1.26.3]# 1n -s /usr/local/nginx/sbin/nginx/usr/local/sbin/
(4)添加nginx系统服务
为了使Nginx服务的启动、停止、重载等操作更加方便,可以编写Nginx朋务脚本,并使用chkconfig和systemctl工具来进行管理。
[root@localhost ^]# vi /lib/systemd/system/nginx. service
[Unit]
Description=The NGINX HTTP and reverse proxy servver
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/sbin/nginx -t
ExecStart=/usr/local/sbin/nginx
ExecReload=/usr/local/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
User=root
Group=root
[Install]
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.cont
server {
listen 8080; #代理监听端口
server_name proxy.example.com;#解析域名使用的DNS
resolver 8.8.8.8 1.1.1.1; #多个DNS用空格分隔
#启用代理CONNECT方法(支持HTTPS)
proxy_connect;
proxy_connect_allow 443 80; #允许代理到80和443端口
proxy_connect_connect_timeout 10s;
proxy_connect_read_timeout 10s;
proxy_connect_send_timeout 10s;
#处理HTTP/HTTPS请求
location / {
proxy_pass $scheme://shttp_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)验证正向代理
Linux中验证,使用curl命令,并指定代理服务器进行访问测试
[root@localhost ^]curl -x http://192.168.10.202:8080www.baidu.com
二:反向代理
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)的主备切换与健康检查E。
反向代理,指的是浏览器/客户端并不知道自己要访问具体哪台目标服务器,只知道去访问代理服务器,代理服务器再通过反向代理+负载均衡实现请求分发到应用服务器的一种代理服务。
反向代理服务的特点是代理服务器代理的对象是应用服务器,也就是对于浏览器/客户端 来说应用服务器是隐藏的。
1:配置nginx七层代理
(1)环境安装
192.168.10.201上操作:
[root@localhost~]#systemctl stop firewalld
[root@localhost~]#dnf install httpd -y
[root@localhost~]#echo"这是后端主机">/var/www/html/index.html
[root@localhost~]#systemctl start httpd
(2)配置nginx七层代理转发
192.168.10.202上操作:
[root@localhost^]# vi /usr/local/nginx/conf/nginx.conf
http {
upstream backend #后端地址池设置
server 192.168.10.201:80; #后端主机设置
}server {
listen 80;
server_name example.com;
location/{
proxy_passhttp://backend;#动态请求转发
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;}
location /static/ {
root/data/www; #静态资源直接响应
expires 30d; #客户端缓存30天}
}
}
[root@localhost#nginx -t
[root@localhost#nginx -s reload
上述配置中,使用upstream定义后端应用服务器的地址池"backend",在location块中,使proxy_pass,转发请求至后端地址池,proxy_set_headerHost$host:将请求中的Host头部设置为客户端请求的主机名6,proxy_set_header X-Real-IP$remote_addr:将请求中的X-Real-IP头部设置为客户端的真实IP地址。
(3)验证转发效果
[root@localhost ^]# curl 192.168.10.202
这是后端主机
2:配置nginx四层代理
SSH协议是基于TCP协议的,配置nginx的四层代理,实现代理ssh请求至后端服务器,用以登录内网服务器场
(1)配置四层代理
192.168.10.202上操作:
[root@localhost~]#vi /usr/local/nginx/conf/nginx.conf
stream {
upstream ssh cluster { #定义后端地址池
server 192.168.10.201:22; #设置后端地址和服务端口}
server {
listen 2222;
proxy_pass ssh_cluster;
proxy_connect_timeout 5s; 连接超时时间
proxy_timeout lh; 长连接保持时间
[root@localhost]#nginx -t
[root@localhost^]#nginx -s reload
[root@localhost~]#ss -nlpt | grep 2222
LISTEN O 511 0.0.0.0:2222 0.0.0.0:*
users:(("nginx",pid=8404, fd=6), ("nginx",pid=8403, fd=6))
(2)验证四层代理
[root@localhost ^]# ssh root@192.168.10.202 -p2222
[root@localhost ^]#ifconfig
ens33: flags=4163<UP, BROADCAST, RUNNING, MULTICAST> mtu 1500
inet 192.168.10.201 netmask 255.255.255.0 broadcast192.168.10.255
inet6 fe80::20c:29ff:fe9f:del5 prefixlen 64 sccopeid0x20<link>
ether 00:0c:29:9f:de:15 txqueuelen 1000 (Ethernet)
RX packets 389822 bytes 511828164 (488.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 104614 bytes 8588675 (8.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
通过以上操作验证发现,通过202的2222端口登陆后,实际上是登录到201服务器上
三:Nginx缓存
1:缓存功能的核心原理和缓存类型
缓存类型 作用场景
代理缓存 反向代理模式下缓存后端服务器(如Tomcat、Apache)的响应内容。
FastCGI缓存 缓存PHP/Python等通过FastCGI协议处理的 动态内容 (需配FastCGI缓存合PHP-FPM使用)。uWSGI/SCGI 缓存 类似FastCGI,用于其他后端协议。
静态资源缓存 通过expires 指令设置客户端浏览器缓存(非服务端缓存)
代理缓存:
代理缓存原理:
第一步:客户端第一次向Nginx请求数据A;
第二步:当Nginx发现缓存中没有数据A时,会向服务端请求数据A;
第三步:服务端接收到Nginx发来的请求,则返回数据A到Nginx,并且缓存在Nginx;
第四步:Nginx返回数据A给客户端应用;
第五步:客户端第二次向Nginx请求数据A;
第六步:当Nginx发现缓存中存在数据A时,则不会请求服务端;
第七步:Nginx把缓存中的数据A返回给客户端应用。
2:代理缓存功能设置
(1)反向代理配置
[root@localhost ^]#/usr/local/nginx/conf/nginx.conf
http {
upstream backend { #后端地址池设置
server 192.168.10.201:80; #后端主机设置}
server {
listen 80;
server_name example.com;
location / {
proxy_passhttp://backend; #动态请求转发
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;}
location /static/ {
root/data/www; #静态资源直接响应expires 30d; #客户端缓存30天
}
}
}
[root@localhost#nginx -t
[root@localhost#nginx -s reload
(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=lg_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:定义缓存目录的层级结构,levels=N:M,表示缓存文件路径的层级深度,
>keys_zone=my_cache:10m:定义共享内存区域,用于存储缓存键(key)和元数据(如过期时间),10m:共享内存区大小(通常每1MB可存储约8000个键
>inactive=60m:定义缓存内容的闲置有效期。60分钟内未被访问,将被自动删除
>max_size=lg:定义缓存目录的最大磁盘空间。当缓存量i达到1GB时,Nginx启动LRU(最近最少使用)算法清理旧缓存。
>use_temp_path=off:控制临时文件的存储位置,推荐值:off(减少磁盘操作,提升性能)
(3)验证缓存功能
[root@localhost~]# curl -I 192.168.10.202
HTTP/1.1 200 OK
Server: nginx/1.26.3
Date: Tue, 04 Mar 2025 12:45:44 GMT
Content-Type: text/html
Content-Length: 19
Connection: keep-alive
Last-Modified: Mon, 03 Mar 2025 12:39:32 GMT
ETag: "67c5a304-13"
X-Cache-Status: MISS #MISS表示没有命中缓存
Accept-Ranges: bytes
[root@localhost ^]# curl -I 192.168.10.202
HTTP/1.1 200 OK
Server: nginx/1.26.3
Date: Tue, 04 Mar 2025 12:45:50 GMT
Content-Type: text/html
Content-Length: 19
Connection: keep-alive
Last-Modified: Mon, 03 Mar 2025 12:39:32 GMT
ETag: "67c5a304-13"X-Cache-Status:HIT #再次请求发现已经命中,说明数据已经被缓存
Accept-Ranges: bytes
[root@localhost ^]#ls /data/nginx/cache
查看缓存目录发现已缓存数据
四:Nginx rewrite和正则
1:nginx正则
常用的正则表达式元字符:
字符 | 描述 |
^ | 匹配输入字符串的起始位置。 |
$ | 匹配输入字符串的结束位置。 |
* | 匹配前面的字符零次或多次。 |
+ | 匹配前面的字符一次或多次。 |
? | 匹配前面的字符零次或一次。 |
. | 匹配初“\n”之外的任何单个字符。 |
\ | 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用 |
\d | 匹配纯数字 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
[c] | 匹配单个字符c |
[a-z] | 匹配a-z小写字母的任意一个 |
[a-zA-Z] | 匹配a-z小写字母或A-Z大写字母的任意一个 |
2:nginx location
(1)location 的语法:
模式 | 说明 |
location/uri 普通前缀匹配 | 匹配已指定路径开头的URI |
location = / 精确匹配 | 仅匹配完全相同的URI(优先级最高)。 |
location ~ 正则匹配 | 区分大小写的正则表达式匹配。 |
location ~* 正则匹配 | 不区分大小写的正则表达式匹配。 |
location ^ ~ 精确前缀匹配 | 匹配前缀路径后,不再检查正则匹配(优先级高于正则 |
location / 通用匹配 | 认方式,优先级最低,其他方式匹配不到时匹配 |
location 的优先级规则:
精确匹配>精确前缀匹配>正则匹配(~和~*同时存在时,文件中物理位置靠上的优先)>普通前缀匹配>通用匹配。
(2)location 验证
[root@localhost ^]# vim /usr/local/nginx/conf/nginx.coonf
location / {
return200"通用匹配":#其他方式匹配不到时匹配}
location /abc {
return200"普通前缀匹配";#uri必须是/abc开头(和精确前级四
配功能类似,但是优先级要低很多}
location ~ /test/abcdef {
return200"区分大小写正则";#uri中必须包含/abc}
location ~ * /test/abc {
return 200"不区分大小写正则";#uri中必须包含/abc或/ABC
location ^~ /abcdef {
return 200"精确前缀匹配";#uri必须是/abc开头
location = /abc {
return 200"精确匹配";#uri必须等于/abc
[root@localhost ^]# nginx -s reload
[root@localhost ^]# curl 192.168.10.202/abc
精确匹配
每次请求192.168.10.202/abc后,按优先级顺序依次注释配置了文件中的location,会发现每次的响应内容发生变更了。PS:使用正则模式时,URI部分可以使用正则表达式
3:Rewrite
Rewrite语法
rewrite <regex><replacement>[flag];
regex:正则匹配URL字符串(只能对域名后边的除去传递的参数外的字符串起作用,例如http://www.kgc.com/index.php?id=l只对/inddex.php重写)replacement:重写跳转后的地址
flag类型:
last:重写后的URI会重新触发location匹配,并执行新匹配到的location块中的指令,是默认类型
break:重写后的URI不会重新匹配location,直接在当前 location中处理,且后续的指令不再执行
redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url(因为是临时)
permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url。
在实际工作的应用中,Nginx跳转需求有三种方式可实现。i可以直接用rewrite进行匹配跳转,也可以使用 if匹配全局变量后跳转。另外,还可以使用location匹配再跳转。所以rewrite只能放在server{}、if{}、location{}
配置段中
1.server{} 块中的 rewrite
执行顺序:在请求进入server块后、匹配location前执行。
作用域:影响该server块下所有请求(全局生效)。
2.location{}块中的rewrite
执行顺序:在请求匹配到该location后执行。
作用域:仅对该location匹配的请求生效(局部生效)。
3.if{}块中的rewrite
执行顺序:在满足if条件时触发。
作用域:依赖if表达式所在的上下文(如在server中或location中)。