Nginx反向代理B

http协议反向代理

反向代理配置参数

bash 复制代码
proxy_pass; #用来设置将客户端请求转发给的后端服务器的主机
#可以是主机名(将转发至后端服务做为主机头首部)、IP地址:端口的方式
#也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支持
#示例:
location /web {
index index.html;
proxy_pass http://172.25.254.30:8080; #8080后面无uri,即无 / 符号,
#需要将location后面url 附加到proxy_pass指定的url后面
#此行为类似于root
#proxy_pass指定的uri不带斜线将访问的/web
#等于访问后端服务器
proxy_pass http://172.25.254.40:8080/; #8080后面有uri,即有 / 符号
#相当于置换,即访问/web时实际返回proxy_pass后面uri内容
#此行为类似于alias
#proxy_pass指定的uri带斜线
#等于访问后端服务器的
#http://172.25.254.40:8080/index.html
#内容返回给客户端
} 
# http://nginx/web/index.html ==>http://1:8080
#重启Nginx测试访问效果:
#curl -L http://www.timinglee.org/web
#如果location定义其uri时使用了正则表达式模式(包括~,~*,但不包括^~),则proxy_pass之后必须不能使用uri
#即不能有/ ,用户请求时传递的uri将直接附加至后端服务器之后
server {
...
server_name HOSTNAME;
location ~|~* /uri/ {
proxy_pass http://host:port; #proxy_pass后面的url 不能加/
}
...
}
http://HOSTNAME/uri/ --> http://host/uri
proxy_hide_header field; #用于nginx作为反向代理的时候
#在返回给客户端http响应时
#隐藏后端服务器相应头部的信息
#可以设置在http,server或location块
#示例: 隐藏后端服务器ETag首部字段
location /web {
index index.html;
proxy_pass http://10.0.0.18:8080/;
proxy_hide_header ETag;
}
proxy_pass_header field; #透传
#默认nginx在响应报文中不传递后端服务器的首部字段Date, Server, X-Pad, X-Accel等参数
#如果要传递的话则要使用 proxy_pass_header field声明将后端服务器返回的值传递给客户端
#field 首部字段大小不敏感
#示例:透传后端服务器的Server和Date首部给客户端,同时不再响应报中显示前端服务器的Server字段
proxy_pass_header Server;
proxy_pass_header Date;
proxy_pass_request_body on | off;
#是否向后端服务器发送HTTP实体部分,可以设置在http,server或location块,默认即为开启
proxy_pass_request_headers on | off;
#是否将客户端的请求头部转发给后端服务器,可以设置在http,server或location块,默认即为开启
proxy_set_header;
#可更改或添加客户端的请求头部信息内容并转发至后端服务器,比如在后端服务器想要获取客户端的真实IP的时候,就要更改每一个报文的头部
#示例:
location ~ /web {
proxy_pass http://172.25.254.20:80;
proxy_hide_header ETag;
proxy_pass_header Server;
proxy_pass_request_body on;
proxy_pass_request_headers on;
proxy_set_header X-Forwarded-For $remote_addr;
}
[root@apache20 ~]# vim /etc/httpd/conf/httpd.conf
LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%
{User-Agent}i\"" combined
proxy_connect_timeout time;
#配置nginx服务器与后端服务器尝试建立连接的超时时间,默认为60秒
用法如下:proxy_connect_timeout 6s;
#60s为自定义nginx与后端服务器建立连接的超时时间,超时会返回客户端504响应码
proxy_read_timeout time;
#配置nginx服务器向后端服务器或服务器组发起read请求后,等待的超时时间,默认60s
proxy_send_timeout time;
#配置nginx项后端服务器或服务器组发起write请求后,等待的超时 时间,默认60s
proxy_http_version 1.0;
#用于设置nginx提供代理服务的HTTP协议的版本,默认http 1.0
proxy_ignore_client_abort off;
#当客户端网络中断请求时,nginx服务器中断其对后端服务器的请求。即如果此项设置为on开启,则服务器、
会忽略客户端中断并一直等着代理服务执行返回,如果设置为off,则客户端中断后Nginx也会中断客户端请求
并立即记录499日志,默认为off。

示例:反向代理单台web服务器

将用户对www.example.com的请求转发给后端服务器处理。

bash 复制代码
[root@centos8 ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80;
server_name www.example.org;
location / {
proxy_pass http://172.25.254.30;
}
}
#重启Nginx 并访问测试

示例:指定location实现反向代理

bash 复制代码
server {
listen 80;
server_name www.example.org;
location / {
proxy_pass http://172.25.254.30;
}
location ~ /static {
proxy_pass http://172.25.254.20:8080;
}
}

后端web服务器必须要有相对于的访问URL

bash 复制代码
[root@apache20 ~]# mkdir /var/www/html/static
[root@apache20 ~]# echo static 172.25.254.20 > /var/www/html/static/index.html
[root@apache30 ~]# echo 172.25.254.30 > /var/www/html/index.html

重启Nginx并访问测试

bash 复制代码
[2024-07-25 17:09.35] ~
[Administrator.DESKTOP-P19CNDN] ➤ curl www.example.org/static/
static 172.25.254.20
[2024-07-25 17:09.39] ~
[Administrator.DESKTOP-P19CNDN] ➤ curl www.example.org
172.25.254.30

针对特定资源实现代理

动静分离结合反向代理是一种常见的网站优化技术,主要用于提高网站的响应速度和服务器性能。下面我将简要介绍这两个概念及其如何协同工作。

静动分离

静动分离是指将网站中的静态资源(如图片、CSS样式表、JavaScript文件等)与动态内容(如数据库查询结果、用户交互产生的数据等)分开处理的一种方法。这种分离可以带来以下好处:

  • 减轻服务器压力:静态资源可以直接从缓存或CDN(Content Delivery Network)中读取,减少了对后端服务器的直接请求。
  • 提高访问速度:静态资源通常被浏览器缓存,用户再次访问时可以更快加载页面。
  • 易于维护:静态资源通常不会频繁更新,可以独立部署和管理。

反向代理

反向代理位于客户端与服务器之间,用于接收客户端的请求,并根据一定的规则将请求转发给后端服务器。反向代理的主要作用包括:

  • 负载均衡:将请求分发到不同的服务器上,避免单点过载。
  • 安全性:隐藏后端服务器的真实IP地址,提供一层安全防护。
  • 缓存功能:对于一些频繁访问的内容,反向代理可以进行缓存,减少后端服务器的压力。

结合使用

当动静分离与反向代理结合使用时,反向代理服务器可以根据URL路径或其他规则判断请求是针对静态资源还是动态内容,并分别进行处理:

  • 对于静态资源的请求,反向代理可以直接返回缓存中的内容,或者从专门存放静态资源的服务器获取。
  • 对于动态内容的请求,则转发给后端的应用服务器进行处理。

通过这种方式,可以有效地提升用户体验,同时减轻应用服务器的压力,提高系统的整体性能。

示例配置

例如,在Nginx中配置反向代理进行静动分离可能如下所示:

nginx 复制代码
server {
    listen 80;
    server_name www.example.com;

    location /static/ {
        alias /path/to/static/files/;
    }

    location / {
        proxy_pass http://backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

在这个例子中,所有以/static/开头的请求会被直接指向静态文件目录,而其他请求则会被代理到后端服务器。

反向代理缓存

在反向代理中,缓存功能是一个非常重要的特性,它可以显著提高网站的性能和响应速度。反向代理服务器作为客户端与后端服务器之间的中介,可以在接收到客户端请求时缓存响应结果,从而减少对后端服务器的直接请求次数。下面是关于反向代理缓存功能的一些关键点:

缓存的基本原理

  1. 缓存存储:反向代理服务器会将从后端服务器获取的数据存储在本地缓存中。
  2. 命中检查:当客户端发起新的请求时,反向代理首先检查缓存中是否存在相同请求的结果。
  3. 缓存命中:如果存在,则直接从缓存中返回结果,而不需要再次请求后端服务器。
  4. 缓存未命中:如果缓存中没有相应的结果,则向后端服务器发起请求,并将新获取的数据存入缓存。

缓存的优势

  • 减少带宽消耗:通过缓存重复的数据,减少了不必要的数据传输。
  • 降低后端服务器负载:缓存减少了对后端服务器的直接请求,有助于分散负载。
  • 提高响应速度:缓存中的数据可以快速返回给客户端,提高了用户体验。
  • 容错性:即使后端服务出现故障,反向代理也可以尝试从缓存中返回数据,保持一定程度的服务可用性。

缓存策略

反向代理中的缓存策略可以很灵活,可以根据HTTP响应头中的Cache-ControlExpires等字段来决定缓存的有效期。例如,如果响应头中包含Cache-Control: max-age=3600,那么这条记录将在缓存中保留一个小时。

实现示例

以Nginx为例,下面是一个简单的缓存配置示例:

nginx 复制代码
http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
    proxy_cache_key "$scheme$request_method$host$request_uri";

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend_server;
            proxy_cache my_cache;
            proxy_cache_valid 200 60m;
            proxy_cache_valid 404 1m;
            add_header Cache-Control "private, no-store";
        }
    }
}

在这个示例中:

  • proxy_cache_path定义了缓存的存储位置以及缓存区的大小和生存周期。
  • proxy_cache_key指定了用于缓存键的生成规则。
  • proxy_cache_valid设置了不同状态码下的缓存有效期。
  • add_header Cache-Control "private, no-store"可以控制客户端的行为,这里设置为不存储缓存。

注意事项

虽然缓存能带来很多好处,但也需要注意以下几点:

  • 缓存一致性:确保缓存中的数据是最新的,可以通过适当的缓存失效机制来实现。
  • 缓存污染:避免恶意请求导致缓存污染,需要对缓存键的设计进行仔细考虑。
  • 缓存容量:合理规划缓存的大小,避免占用过多内存资源。
相关推荐
SelectDB10 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220702 天前
如何搭建本地yum源(上)
运维
ping某4 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树885 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠5 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质5 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工5 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
网络研究院6 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展
酣大智6 天前
ARP代理--工作原理
运维·网络·arp·arp代理