目录
正向代理(Forward Proxy)是一种位于客户端和原始服务器之间的代理服
务器,其主要作用是将客户端的请求转发给目标服务器,并将响应返回给客户端
Nginx的正向代理充当客户端的"中间人",代表用户'访问外部资源并隐藏
真实IP。它是企业内网管控、安全审计与加速访问的核心工具。用于场景一般
是
内网访问控制:限制员工访问特定网站(如社交媒体)
匿名访问:通过代理服务器隐藏用户真实身份。
资源缓存加速:缓存公共资源(如软件包、镜像文件),减少外网带宽消耗
安装支持软件
Nginx的配置及运行需要pcre、zlib等软件包的支持,因此应预先安装这些软
件的开发包(devel),以便提供相应的库和头文件,确保Nginx的安装顺利完成
[root@localhost ^]# dnf install -y gcc make pcre-deveel zlib-devel
openssl-devel perl-ExtUtils-MakeMaker git wget tar
创建运行用户,组和日志目录
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
编译安装Nginx
tar zxf nginx-1.26.3_http_proxy.tar.gz
cd 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
make && make install
参数说明
--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创建软连接
[root@localhost nginx-1.26.3]# 1n -s /usr/local/nginx/sbin/nginx
/usr/local/sbin/
添加nginx系统服务
为了使Nginx服务的启动、停止、重载等操作更加方信更,可以编写Nginx服
务脚本,并使用chkconfig和systemctl工具来进行管理
[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
[Instal1]
WantedBy=multi-user.target
[root@localhost ^]# systemctl daemon-reload
[root@localhost ^]# systemctl start nginx
[root@localhost ^]# systemctl enable nginx
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 检测配置文件是否有误
systemctl restart nginx 重启nginx服务
Nginx的七层(应用层)反向代理基于HTTP/HTTPS协议,深度解析应用层内容
(如URL、Header、Cookie),将客户端请求精准转发至后端服务器。作为企业
级架构的"智能调度器",它实现了负载均衡、安全隔离上与性能优化的核心能力
应用场景一般是:
1.负载均衡:将流量分发至多台后端服务器,避免单点故障。
2.动静分离:静态资源(图片、CSS/JS)由Nginx直接响应立,动态请求(PHP
API)转发至Apache/Tomcat。
3.SSL终端:统一处理HTTPS加密/解密,降低后端服务器计算压力。
4.灰度发布:根据请求特征(如IP、Header)将部分流量导向新版本服务。
Nginx的四层(网络层)反向代理基于TCP/UDP协议,直接转发原始数据流,
不解析应用层内容。它专为高性能、低延迟的传输层场景设计,是数据库、游戏
服务器等非HTTP服务的理想选择。应用场景一般是:
1.数据库代理:对外暴露统一端口,内部转发至MySQL、Redis集群。
2.游戏服务器:代理UDP协议,实现实时数据包负载均衡。
3.SSH跳板机:通过端口映射安全访问内网服务器。
4.高可用服务:TCP服务(如MQTT)的主备切换与健康检查。
反向代理,指的是浏览器/客户端并不知道自己要访问具体哪台目标服务器,
只知道去访问代理服务器,代理服务器再通过反向代理+负载均衡实现请求分
发到应用服务器的一种代理服务。
反向代理服务的特点是代理服务器代理的对象是应用服务器,也就是对于
浏览器/客户端来说应用服务器是隐藏的。
vim /usr/local/nginx/conf/nginx.conf
upstream myhttp {
server 192.168.10.103:80;
server 192.168.10.104:80;
}
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 检查配置文件是否有误
systemctl restart nginx 重启nginx服务
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 检查配置文件是否有误
systemctl restart nginx 重启nginx服务
Nginx 缓存是 Nginx 服务器提供的一项重要功能,用于存储经常访问的静态资源和部分动态内容,以提高网站的性能和响应速度。以下是对 Nginx 缓存的详细介绍
缓存原理
Nginx 缓存基于内存或磁盘存储,当客户端请求资源时,Nginx 首先检查缓存中是否存在该资源的副本。如果存在,并且缓存的资源未过期或未被 invalidate,Nginx 直接将缓存的内容返回给客户端,而无需向后端服务器再次请求,从而大大减少了响应时间和服务器负载。
缓存类型
浏览器缓存:通过设置合适的Cache - Control
、Expires
等响应头字段,告诉浏览器哪些资源可以缓存以及缓存的时长。浏览器会根据这些指令在本地缓存资源,下次访问相同内容时直接从本地加载,减少对服务器的请求。
服务器端缓存:Nginx 可以在服务器端设置缓存,缓存的内容可以是静态文件,如 HTML、CSS、JavaScript、图片等,也可以是经过后端服务器处理后生成的动态内容。
缓存配置
在 Nginx 配置文件中,通过http
块中的proxy_cache_path
指令来设置缓存区域的路径、大小、缓存级别等参数。例如:
http {
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;
server {
listen 80;
server_name example.com;
location / {
proxy_cache my_cache;
proxy_cache_valid 200 302 60m;
proxy_cache_valid 404 10m;
proxy_pass http://backend_server;
}
}
}
上述配置中,proxy_cache_path
指定了缓存的路径为/data/nginx/cache
,定义了一个名为my_cache
的缓存区域,使用 10M 内存来存储缓存键值对,缓存文件最大占用 10G 空间,60 分钟内未被访问的缓存将被删除。proxy_cache
指令应用了这个缓存区域,proxy_cache_valid
指令分别设置了不同状态码的缓存有效时间
缓存更新策略
基于时间的过期策略:根据设置的缓存时间,当缓存的资源超过了指定的有效时间,Nginx 会认为该缓存已过期,下次请求时会向后端服务器重新获取最新的资源,并更新缓存。基于文件变化的更新:对于静态文件缓存,可以通过监控文件的修改时间来判断是否需要更新缓存。当文件发生变化时,Nginx 会自动更新缓存中的对应内容。手动清除缓存:可以通过 Nginx 的命令行工具或第三方模块来手动清除指定的缓存内容。例如,使用nginx -s reload
命令重新加载配置文件,或者使用一些专门的缓存管理工具来删除特定的缓存键值对。
缓存的优点
提高性能:避免了重复请求后端服务器,减少了数据传输和处理时间,大大提高了网站的响应速度,改善了用户体验。
减轻服务器负载:减少了后端服务器的请求压力,使得服务器能够处理更多的并发请求,提高了服务器的整体性能和稳定性。
节省带宽:由于缓存的资源可以直接从 Nginx 服务器返回给客户端,减少了对后端服务器的带宽占用,尤其对于静态资源较多的网站,可以显著节省带宽成本。
缓存的局限性
缓存空间限制:内存或磁盘空间是有限的,当缓存内容过多时,可能会导致缓存溢出,需要根据实际情况合理设置缓存大小和更新策略。数据一致性问题:如果后端服务器的数据发生了变化,而缓存中的数据没有及时更新,可能会导致客户端获取到过期或不一致的信息。需要采取合适的缓存更新策略来尽量减少数据不一致的情况。动态内容缓存难度较大:对于一些动态生成的内容,如根据用户身份、实时数据等生成的页面,缓存起来相对复杂,需要仔细考虑缓存的粒度和更新时机,以确保缓存的有效性和数据的准确性。
在云计算与分布式架构的时代,Nginx凭借其高性能、高并发处理能力以及
模块化设计,已成为现代Web服务的核心组件之一。它不仅是负载均衡、反向代
理的首选工具,更是实现流量调度、安全防护和动态路由的关键枢纽。而在这其
中,Rewrite模块作为Nginx的"规则引擎",扮演着至关重要的角色--它赋予
开发者精准控制URL的能力,让请求的流转不再受限于物理路径,而是通过逻辑
规则灵活适配业务需求。
Rwerite应用场景
网站迁移与地址变更
当网站的页面结构或目录发生变化时,为了避免旧的 URL 失效,可以使用rewrite
将旧的 URL 重定向到新的 URL。例如,将旧的文章链接/article/old-article.html
重定向到新的链接/new-articles/2025/05/old-article.html
,以保证用户通过旧链接仍能访问到正确的内容,同时也有利于搜索引擎优化(SEO),避免页面权重的丢失。
隐藏真实目录结构 为了增强网站的安全性和维护性,可以通过rewrite
隐藏服务器上真实的目录结构。例如,实际的文件存储在/var/www/html/app
目录下,但希望用户通过/app
访问,就可以使用rewrite
规则将/app
的请求重写为对/var/www/html/app
的内部请求,这样可以防止用户直接访问到服务器上的敏感目录结构,降低潜在的安全风险。
实现伪静态化 对于动态网站,为了提高搜索引擎的收录和用户体验,可以使用rewrite
将动态 URL 转换为静态 URL。例如,将/index.php?id=123
重写为/article/123.html
,这样的静态 URL 更易于搜索引擎抓取和理解,有助于提高网站在搜索结果中的排名。
根据用户代理进行重定向 根据不同的用户代理(User - Agent),即访问网站的设备或浏览器类型,将用户重定向到不同的页面或版本。例如,检测到用户使用的是移动设备,可以将其重定向到专门的移动版网站,提供更好的移动端浏览体验。
访问权限控制与特殊页面重定向
可以利用rewrite
结合if
条件判断来实现访问权限控制。例如,对于未登录用户访问需要权限的页面,将其重定向到登录页面;或者根据用户的 IP 地址、来源等条件,将特定用户或地区的访问重定向到特殊的提示页面
规范 URL 格式 确保网站的 URL 具有统一的格式和规范。例如,将所有以http://
开头的 URL 重写为https://
,以强制使用安全的 HTTPS 连接;或者统一去除 URL 中的多余斜杠、空格等不规范字符,使网站的 URL 更加简洁和规范,有利于提高网站的整体质量和用户体验。
一些常见的正则表达式元字符
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或多次。如"ol"能匹配"o"及"ol"、""을" |
+ | 匹配前面的字符一次或多次。如"ol+"能匹配"ol"及"oll"、"oll",但不能匹配"o" |
' | "匹配除"n"之外的任何单个字符,若要匹配包括"n"在内的任意字符,请使用诸如【.Vn之类的模式 |
\ | 将后面接着的字符标记为一个特殊字符或-一个原义字符或一个向后引用。如"In"匹配个换行符,而"IS"则匹配"S" |
\b | 匹配纯数字 |
{n} | 重复n次 |
{n,} | 重复n次或多次 |
[c] | 匹配单个字符c |
[a-z] | 匹配a-z小写字母的任意一个 |
[a-zA-Z] | 匹配a-z小写字母或A-Z大写字母的任意一个 |
? | 匹配前面的字符零次或一次,例如"do(es)?"能匹配"do"或者"does","?"等效于"{0,1}" |
字符 | 描述 |
rewrite
指令的基本语法如下
rewrite regex replacement [flag];
regex是一个正则表达式,用于匹配当前的 URL。
replacement 是替换后的 URL
flag 是可选参数,用于指定重写的标志,常见的标志有
last 停止当前location
块中的后续rewrite
指令,并重新发起一个新的请求
break 停止当前location
块中的后续rewrite
指令,不再发起新的请求
redirect 返回 302 临时重定向
permanent 返回 301 永久重定向
将所有以/old
开头的 URL 重写为/new
开头的 URL,并返回 301 永久重定向
server {
listen 80;
server_name example.com;
location / {
rewrite ^/old(.*)$ /new$1 permanent;
}
}
在这个例子中,^/old(.*)$
是一个正则表达式,^
表示字符串的开始,/old
是固定的匹配内容,(.*)
表示捕获任意数量的任意字符,$
表示字符串的结束。/new$1
是替换后的 URL,$1
表示捕获到的内容
使用last
标志
server {
listen 80;
server_name example.com;
location / {
rewrite ^/blog/(.*)$ /article/$1 last;
# 其他配置
}
location /article/ {
# 处理 /article/ 开头的URL
}
}
在这个例子中,当请求的 URL 以/blog/
开头时,会将其重写为/article/
开头的 URL,并使用last
标志停止当前location
块中的后续rewrite
指令,然后重新发起一个新的请求,由location /article/
块来处理
使用break
标志
server {
listen 80;
server_name example.com;
location / {
rewrite ^/static/(.*)$ /files/$1 break;
# 其他配置
}
}
在这个例子中,当请求的 URL 以/static/
开头时,会将其重写为/files/
开头的 URL,并使用break
标志停止当前location
块中的后续rewrite
指令,不再发起新的请求
注意事项
1.正则表达式的性能可能会受到影响,尤其是在高并发的情况下。因此,尽量避免使用过于复杂的正则表达式
2.rewrite
指令的执行顺序很重要,不同的顺序可能会导致不同的结果
3.在使用last
和break
标志时,要清楚它们的区别,避免出现意外的重写行为