目录
一:正向代理
1:编译安装 Nginx
(1)安装支持软件
(2)创建运行用户、组和日志目录
(3)编译安装 Nginx
(4)添加 Nginx 系统服务
2:配置正向代理
二:反向代理
1:配置nginx七层代理
2:配置nginx四层代理
三:Nginx 缓存
1:缓存功能的核心原理和缓存类型
2:代理缓存功能设置
四:Nginx rewrite和正则
一:正向代理
正向代理(Forward Proxy)是一种位于客户端和原始服务器之间的代理服务器,其主 要作用是将客户端的请求转发给目标服务器,并将响应返回给客户端 Nginx 的 正向代理 充当客户端的“中间人”,代表用户访问外部资源并隐藏真实 IP。 它是企业内网管控、安全审计与加速访问的核心工具。用于场景一般是:
- 内网访问控制:限制员工访问特定网站(如社交媒体)
- 匿名访问:通过代理服务器隐藏用户真实身份。
- 资源缓存加速:缓存公共资源(如软件包、镜像文件),减少外网带宽消耗。
1:编译安装 Nginx
(1)安装支持软件
Nginx 的配置及运行需要 pcre、zlib 等软件包的支持,因此应预先安装这些软件的开发包(devel),以便提供相应的库和头文件,确保 Nginx 的安装顺利完成。
[root@localhost ~]# dnf install -y gcc make pcre-devel zlib-devel openssl-devel
perl-ExtUtils-MakeMaker git wget tar
(2)创建运行用户、组和日志目录
Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确 地控制其访问权限,增加灵活性、降低安全风险。例如,创建一个名为 nginx 的用户,不 建 立宿主文件夹,也禁止登录到 Shell 环境。
[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 ~]# 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_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
[root@localhost nginx-1.26.3]# make && make install
参数类别 | 参数名称 | 说明 |
---|---|---|
用户/组 | user=nginx | 指定nginx运行用户 |
group=nginx | 指定nginx运行组 | |
HTTP模块 | with=http_ssl_module | 支持HTTPS协议 |
with=http_v2_module | 支持HTTP/2协议 | |
with=http_realip_module | 支持IP透传(获取客户端真实IP) | |
with=http_stub_status_module | 支持状态页面(用于监控nginx运行状态) | |
with=http_gzip_static_module | 支持静态文件压缩 | |
with=pcre | 支持正则表达式 | |
流模块 | with=stream | 支持TCP/UDP反向代理 |
with=stream_ssl_module | 支持TCP连接的SSL加密 | |
with=stream_realip_module | 支持TCP连接的IP透传 | |
第三方模块 | add=module=./ngx_http_proxy_connect_module | 支持HTTPS转发(默认nginx不支持,需添加此第三方模块) |
为了使 Nginx 服务器的运行更加方便,可以为主程序 nginx 创建链接文件,以便管 理员直接执行“nginx”命令就可以调用 Nginx 的主程序。
[root@localhost nginx-1.26.3]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
(4)添加 Nginx 系统服务
[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
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:配置正向代理
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
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://$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
验证正向代理:
Windows中验证,使用火狐浏览器,设置http和https代理即可:
二:反向代理
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 install httpd -y
[root@localhost ~]#echo "这是后端主机" >/var/www/html/index.html
[root@localhost ~]#systemctl start httpd
(3)配置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
(4)验证转发效果
[root@localhost ~]# curl 192.168.10.101
这是后端主机
2:配置nginx四层代理
(1)配置四层代理 (192.168.10.101上操作)
[root@localhost ~]#vi /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{ }中嵌套
[root@localhost ~]#nginx -t
[root@localhost ~]#nginx -s reload
[root@localhost ~]#ss -nlpt | grep 2222
LISTEN 0 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.101 -p2222
[root@localhost ~]#ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.102 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::20c:29ff:fe9f:de15 prefixlen 64 scopeid 0x20<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
三:Nginx 缓存
1:缓存功能的核心原理和缓存类型
缓存类型 | 作用场景 | 特点 |
---|---|---|
代理缓存 | 缓存反向代理的后端服务器(如 Tomcat、Apache)的响应内容。 | 需定义缓存路径、缓存键、有效期等;适合静态接口或变化较少的内容。 |
FastCGI 缓存 | 缓存通过 FastCGI 协议处理的动态内容(如 PHP/Python 配合 PHP-FPM)。 | 需与 FastCGI 服务配合使用;可加速动态页面响应。 |
uWSGI/SCGI 缓存 | 缓存通过 uWSGI 或 SCGI 协议处理的后端内容(如 Python Flask/Django)。 | 类似 FastCGI 缓存,但针对特定协议。 |
静态资源缓存 | 通过客户端浏览器缓存静态资源(如 JS/CSS/图片),减少服务端请求。 | 服务端不存储缓存,仅控制浏览器缓存行为;节省带宽但无法减少后端负载。 |
代理缓存原理:
第一步:客户端第一次向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.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
(2)设置缓存功能
- proxy_cache_path :定义缓存文件的存储路径
- levels=1:2 :定义缓存目录的层级结构,levels=N:M,表示缓存文件路径的层级深度,
- keys_zone=my_cache:10m :定义共享内存区域,用于存储缓存键(key)和元数据(如 过期时间),10m:共享内存区大小(通常每 1MB 可存储约 8000 个键) i
- nactive=60m :定义缓存内容的闲置有效期。60分钟 内未被访问,将被自动删除
- max_size=1g :定义缓存目录的最大磁盘空间。当缓存量达到 1GB 时,Nginx 启动 LRU (最近最少使用)算法清理旧缓存。
- use_temp_path=off :控制临时文件的存储位置,推荐值:off(减少磁盘操作,提升性 能)
(3)验证缓存功能
[root@localhost ~]# curl -I 192.168.10.101
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
四:Nginx rewrite和正则
Rewrite的应用场景
- 路径美化:将/product/123 转换为 /index.php?id=123
- 旧链接迁移:将过期URL永久重定向(301)到新地址
- 强制HTTPS/域名统一:自动跳转http://到https://,或合并www与非www域名
- 动态路由:适配单页应用(SPA)、RESTful API路由
- 灰度发布:按规则将部分流量导向新版本服务
语法格式 | 说明 | 示例 |
---|---|---|
rewrite regex replacement [flag]; | 将匹配 regex 的URL重写为 replacement | rewrite ^/old/(.*)$ /new/$1 permanent; |
flag 可选值 | ||
last | 重写后重新发起新请求(再次匹配location) | rewrite ^/path /newpath last; |
break | 重写后不再匹配其他规则,直接处理请求 | rewrite ^/path /newpath break; |
redirect | 返回302临时重定向(浏览器地址栏变) | rewrite ^/oldurl /newurl redirect; |
permanent | 返回301永久重定向(浏览器地址栏变) | rewrite ^/old /new permanent; |
正则符号 | 说明 | Nginx示例 |
---|---|---|
^ | 匹配字符串开头 | ^/path 匹配以 /path 开头的URL |
$ | 匹配字符串结尾 | \.html$ 匹配以 .html 结尾的URL |
.* | 匹配任意字符(除换行外) | ^/old/(.*)$ 匹配 /old/ 后的任意内容 |
\d | 匹配数字 | ^/item/(\d+)$ 匹配如 /item/123 |
[abc] | 匹配括号内任意字符 | ^/[abc]/ 匹配 /a/ 、/b/ 或 /c/ |
[^abc] | 不匹配括号内字符 | ^/[^abc]/ 排除 /a/ 、/b/ 、/c/ |
(pattern) | 捕获分组,用于后续引用 | ^/user/(\w+)$ 捕获用户名 |
\w | 匹配字母、数字、下划线 | ^/user/(\w+)$ 匹配用户名 |
\s | 匹配空白字符(空格、制表符等) | 较少在URL中使用 |
+ | 前一个字符1次或多次 | \d+ 匹配1个或多个数字 |
? | 前一个字符0次或1次 | ^/page/? 匹配 /page 或 /page/ |
{n,m} | 前一个字符n到m次 | \d{2,4} 匹配2~4位数字 |