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"可以控制客户端的行为,这里设置为不存储缓存。

注意事项

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

  • 缓存一致性:确保缓存中的数据是最新的,可以通过适当的缓存失效机制来实现。
  • 缓存污染:避免恶意请求导致缓存污染,需要对缓存键的设计进行仔细考虑。
  • 缓存容量:合理规划缓存的大小,避免占用过多内存资源。
相关推荐
向往风的男子27 分钟前
【devops】devops-gitlab之部署与日常使用
运维·gitlab·devops
KookeeyLena51 小时前
IP池对数据爬取工作的帮助
网络·网络协议·tcp/ip
Reuuse1 小时前
【HCIA-Datacom】华为VRP系统
服务器·网络·华为
我的运维人生1 小时前
利用Python与Ansible实现高效网络配置管理
网络·python·ansible·运维开发·技术共享
geekrabbit3 小时前
机器学习和深度学习的区别
运维·人工智能·深度学习·机器学习·浪浪云
楠神说软件测试3 小时前
接口自动化框架入门(requests+pytest)
运维·数据库·自动化
学习3人组4 小时前
克隆centos网卡uuid相同如何修改
linux·运维·centos
小ᶻᶻᶻᶻᶻ4 小时前
DevOps工程师的职业发展路径
运维·devops
ZhangTao_zata4 小时前
ubuntu安装wordpress(基于LNMP环境)
linux·运维·ubuntu
车载诊断技术5 小时前
电子电气架构——中央计算的软件定义汽车架构
网络·架构·汽车·soa·电子电器架构