Nginx反向代理B

news2024/12/24 9:18:35

http协议反向代理

反向代理配置参数

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的请求转发给后端服务器处理。

[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实现反向代理

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

[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并访问测试

[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中配置反向代理进行静动分离可能如下所示:

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为例,下面是一个简单的缓存配置示例:

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

注意事项

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

  • 缓存一致性:确保缓存中的数据是最新的,可以通过适当的缓存失效机制来实现。
  • 缓存污染:避免恶意请求导致缓存污染,需要对缓存键的设计进行仔细考虑。
  • 缓存容量:合理规划缓存的大小,避免占用过多内存资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2079528.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机械学习—零基础学习日志(如何理解概率论9)

大数定律与中心定律 来看一道习题: 这个题目看看,应该是什么呢~下一章来看看解析~ 《概率论与数理统计期末不挂科|考研零基础入门4小时完整版(王志超)》学习笔记 王志超老师 (UP主)

构造,CF 1290B - Irreducible Anagrams

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1290B - Irreducible Anagrams 二、解题报告 1、思路分析 首先根据样例特…

系统编程-消息队列

消息队列 目录 消息队列 引入 一、消息队列的特点 二、使用指令查看消息队列 三、使用消息队列进行通信的步骤 1、获取键值 2、创建或获取消息队列 id 3、使用消息队列进行数据的传输 4、msgrcv -- 从消息队列中读取数据 5、消息队列的多种操作函数 引入 -- 进程间…

一、undo log、Buffer Pool、WAL、redo log

目录 1、undo log2、Buffer Pool3、WAL4、redo log5、总结6、问题 1、undo log undo log日志是一种用于撤销回退的逻辑日志,在事务未提交前会记录相反的操作到undo log,当事务回滚,使用undo log 进行回滚,保证了事务的原子性。MV…

Golang 深入理解 GC

垃圾是指程序向堆栈申请的内存空间,随着程序的运行已经不再使用这些内存空间,这时如果不释放他们就会造成垃圾也就是内存泄漏。 垃圾回收 (Garbage Collection,GC) 是编程语言中提供的自动的内存管理机制,自动释放不需要的内存对象…

【Qt】Qt系统 | Qt事件 | 定时器

文章目录 定时器QTimerEventQTimer获取系统日期及时间 定时器 Qt 中在进行窗口程序的处理过程中,经常要周期性的执行某些动作,或者制作一些动画效果,使用定时器可以实现这些需求。 定时器,会在间隔一定时间后,执行某一…

八岁编程小天才:45分钟挑战AI极限,聊天机器人一鸣惊人

一位8岁的小女孩,用短短45分钟就搭建出了一个聊天机器人,吸引了180万人的在线围观。 Cursor,这款被Cloudflare副总裁家8岁女儿青睐的AI代码编辑器,成为全网热议的焦点。 甚至许多网友出来发话力挺。 AI编程,从复杂到简…

swagger,Knife4j和Yapi

目录 swagger swagger的作用 swagger的使用 一.导入依赖 二.创建swagger配置类,交给SpringIoC容器管理 三.使用swagger依赖的注解来给接口层(controller)的各种方法进行注释 Api ApiOperation ApiImplicitParam ApiModel ApiModelProperty 四:…

【layUI】点击导出按钮,导出excel文件

要实现的功能如下&#xff1a;根据执行状态判断是否可以导出。如果可以导出&#xff0c;点击导出&#xff0c;在浏览器里下载对应的文件。 代码实现 html里&#xff1a; <table class"layui-hide" id"studentTable" lay-filter"studentTable&…

vue2表单校验:添加自定义el-form表单校验规则

前言 在vue2表单校验&#xff1a;el-form表单绑定数组并使用rules进行校验_vue2 rules校验-CSDN博客中&#xff0c;使用form原生的rules对表单中每个控件的必填、格式等做了校验。但是保存时&#xff0c;除了验证每一个控件的输入合乎要求外&#xff0c;还需要验证控件之间的数…

八、DMA直接存储器存取

1、DMA简介 DMA是一个数据转运小助手&#xff0c;用来协助CPU完成转运的工作 2、存储器映像 计算机系统的5大组成部分&#xff1a;运算器、控制器、存储器、输入设备、输出设备 运算器和控制器&#xff0c;合称CPU 计算机的核心关键部分是CPU和存储器 存储器涉及&#xff…

带你深入浅出新面经:十五、十大排序之堆排序

此为面经第十五谈&#xff01;关注我&#xff0c;每日带你深入浅出一个新面经。 我们要了解面经要如何“说”&#xff01; 很重要&#xff01;很重要&#xff01;很重要&#xff01; 我们通常采取总-分-总方式来阐述&#xff01;&#xff08;有些知识点&#xff0c;你可以去…

Linux--find命令-搜索

find 命令 用来在指定目录下查找文件 如果使用该命令时&#xff0c;不设置任何参数&#xff0c;则find命令将在当前目录下查找子目录与文件&#xff0c;并且将查找到的子目录和文件全部进行显示 find <指定目录> <指定条件> <指定动作> 默认是搜索当前目录…

C语言:编程世界的基石

在计算机科学的世界里&#xff0c;C语言就像一座坚固的桥梁&#xff0c;连接着硬件和软件的两端。自从20世纪70年代诞生以来&#xff0c;C语言以其简洁、高效和强大的特性&#xff0c;成为了编程领域的经典之作。本文将探讨C语言在不同工作领域中的应用&#xff0c;以及它为何能…

opensatck上windows云主机上java服务的端口调用问题处理

文章目录 前言一、思路二、解决步骤1.将安全组规则全部放开2.云主机内部防火墙关闭3.尝试telnet4.查看代码&#xff0c;修改IP配置 总结 前言 opensatck上windows云主机上java服务的端口调用问题处理。同事在window10的云主机中用idea起了调试中的服务&#xff0c;端口在8000&…

鸿蒙操作系统为前端开发者带来下一个风口

在科技飞速发展的当下&#xff0c;前端开发领域也在不断寻求新的突破和机遇。而鸿蒙操作系统的崛起&#xff0c;无疑为前端开发者带来了下一个令人瞩目的风口。 一、鸿蒙系统的独特优势 1. 分布式架构 鸿蒙系统的分布式架构打破了传统设备之间的界限&#xff0c;使得不同设备可…

了解如何使用 Google 的 Gemini-1.5-pro 最新模型开发用于卡路里计算的生成式 AI 应用

欢迎来到雲闪世界。 例如&#xff0c;你有没有想过&#xff0c;当你吃晚餐时&#xff0c;你摄入了多少卡路里&#xff1f;我经常这样做。如果你能简单地通过应用程序发送一张你的盘子照片&#xff0c;并在你决定要吃多少之前得到卡路里总量的估计值&#xff0c;那不是很棒吗&am…

springboot依赖之JDBC(二)

要在 IntelliJ IDEA 中创建一个 Spring Boot 项目并实现基于 JdbcTemplate 的增删改查功能&#xff0c;以下是一个详细的步骤和代码示例。这个例子使用一个简单的用户信息表&#xff08;users&#xff09;&#xff0c;并展示如何使用 JdbcTemplate 的各种方法进行操作。 前文有…

【Linux —— 生产者消费者模型】

Linux —— 生产者消费者模型 生产者消费者模型概述生产者消费者模型特点生产者消费者模型优点基于BlockingQueue的生产者消费者模型 生产者消费者模型概述 生产者消费者模型是一种并发编程模型,用于解决多线程或多进程间的数据共享和同步问题。在这个模型中,有两种角色:生产者…

Python 3.11 从入门到实战1(环境准备)

本篇文章是python3.11的学习开篇&#xff0c;我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;获得python基础学习与实例、实践相结合&#xff0c;使我们完全掌握python。并做到独立完成项目开发的能力。 今天的谈论的比较简单&#xff0c;也是后续学习的基础。pyt…