Nginx代理(反向代理详解)

news2025/1/25 9:17:20

概述

正向代理:

  • 正向代理通常用于客户端需要访问外部网络资源,但出于安全或策略考虑,客户端无法直接访问这些资源。
  • 正向代理服务器位于客户端和目标服务器之间,客户端通过代理服务器发送请求,代理服务器再将请求转发给目标服务器,并将目标服务器的响应返回给客户端。
  • 正向代理的主要作用包括隐藏客户端的真实IP地址、提高访问的安全性、访问控制与过滤、缓存与加速、负载均衡与故障转移、合规性与审计、突破网络限制以及节约带宽等。

反向代理:

  • 反向代理则更多用于服务器集群的架构中。
  • 当客户端请求某个资源时,反向代理服务器会接受这个请求,并根据配置将请求转发给内部网络中的某个服务器(如Web服务器、应用服务器等)。
  • 内部服务器处理完请求后,将响应返回给反向代理服务器,再由反向代理服务器将响应返回给客户端。
  • 反向代理的主要作用包括负载均衡(将请求分发到多个服务器上,实现均衡负载)、缓存(缓存常用资源,减少服务器压力)、安全防护(如过滤恶意请求、进行身份验证等)以及SSL终端等。

 nginx反向代理的配置语法

Nginx反向代理模块的指令是由ngx_http_proxy_module模块进行解析,该模块在安装Nginx的时候已经自己加装到Nginx中了,接下来我们把反向代理中的常用指令一一介绍下:

proxy_pass 
proxy_set_header 
proxy_redirect

 proxy_pass

该指令用来设置被代理服务器地址,可以是主机名称、IP地址加端口号形式。

语法proxy_pass URL;
默认值  -
位置location

URL:为要设置的被代理服务器地址,包含传输协议( http , https:// )、主机名称或IP地址加端口号、URI等要素。

示例:

proxy_pass http://www.baidu.com; 
location /server{} 
  proxy_pass http://192.168.200.146; http://192.168.200.146/server/index.html 
  proxy_pass http://192.168.200.146/; http://192.168.200.146/index.html

编写proxy_pass的时候,后面是否需要加“/”?

示例:

server { 
  listen 80; 
  server_name localhost; 
  location /{ 
    #proxy_pass http://192.168.200.146; 
    proxy_pass http://192.168.200.146/; 
  } 
}

当客户端访问 http://localhost/index.html,效果是一样的

server{
  listen 80;
  server_name localhost;
  location /server{
    #proxy_pass http://192.168.200.146;
    proxy_pass http://192.168.200.146/;
  }
}

当客户端访问 http://localhost/server/index.html这个时候,第一个proxy_pass就变成了http://localhost/server/index.html
第二个proxy_pass就变成了http://localhost/index.html效果就不一样了

proxy_set_header

该指令可以更改Nginx服务器接收到的客户端请求的请求头信息,然后将新的请求头发送给代理的服务器
  

语法 proxy_set_header field value;
默认值proxy_set_header Host $proxy_host;

proxy_set_header Connection close;

位置    http、server、location

需要注意的是,如果想要看到结果,必须在被代理的服务器上来获取添加的头信息
被代理服务器: [192.168.38.153]

server {
  listen 8080; 
  server_name localhost; 
  default_type text/plain; 
  return 200 $http_username; 
}

 代理服务器: [192.168.38.159]

server {
  listen 8080; 
  server_name localhost; 
  location /server { 
    proxy_pass http://192.168.38.153:8080/; 
    proxy_set_header username TOM; 
  } 
}

proxy_redirect

该指令是用来重置头信息中的"Location"和"Refresh"的值。

语法    proxy_redirect redirct replacement;
proxy_redirect default;
proxy_redirect off;
默认值    proxy_redirct default;
位置http、server、location

 

示例:

服务端[192.168.38.159]

server { 
  listen 8081; 
  server_name localhost; 
  if (!-f $request_filename){ 
    return 302 http://192.168.200.146; 
  } 
}

代理服务端[192.168.38.153]

server { 
  listen 8081; 
  server_name localhost; 
  location / { 
    proxy_pass http://192.168.200.146:8081/; 
    proxy_redirect http://192.168.200.146 http://192.168.200.133;  
  } 
}

 该指令的几组选项
proxy_redirect redirect replacement;

redirect:目标,Location的值 
replacement:要替换的值

proxy_redirect default;

default; 
将location块的uri变量作为replacement, 将proxy_pass变量作为redirect进行替换

proxy_redirect off

关闭proxy_redirect的功能

 

服务器1,2,3存在两种情况

第一种情况: 三台服务器的内容不一样。 
第二种情况: 三台服务器的内容是一样。

1. 如果服务器1、服务器2和服务器3的内容不一样,那我们可以根据用户请求来分发到不同的服务器。

代理服务器
server {
  listen 8082; 
  server_name localhost; 
  location /server1 { 
    proxy_pass http://192.168.200.146:9001/; 
  }
  location /server2 { 
    proxy_pass http://192.168.200.146:9002/; 
  }
  location /server3 { 
    proxy_pass http://192.168.200.146:9003/; 
  } 
}
服务端
server1
server {
  listen 9001;
  server_name localhost;
  default_type text/html;
  return 200 '<h1>192.168.200.146:9001</h1>'
}
server2
server {
  listen 9002;
  server_name localhost;
  default_type text/html;
  return 200 '<h1>192.168.200.146:9002</h1>'
}
server3
server {
  listen 9003;
  server_name localhost;
  default_type text/html;
  return 200 '<h1>192.168.200.146:9003</h1>'
}

 nginx的安全控制

关于web服务器的安全是比较大的一个话题,里面所涉及的内容很多,Nginx反向代理是如何来提升web服务器的安全呢

 1、安全隔离

通过代理分开了客户端到应用程序服务器端的连接,实现了安全措施。在反向代理之前设置防火墙,仅留一个入口供代理服务器访问。

如何使用SSL对流量进行加密
翻译成大家能熟悉的说法就是将我们常用的http请求转变成https请求,那么这两个之间的区别简单的来说两个都是HTTP协议,只不过https是身披SSL外壳的http.
HTTPS是一种通过计算机网络进行安全通信的传输协议。它经由HTTP进行通信,利用SSL/TLS建立全通信,加密数据包,确保数据的安全性。
SSL(Secure Sockets Layer)安全套接层
TLS(Transport Layer Security)传输层安全
上述这两个是为网络通信提供安全及数据完整性的一种安全协议,TLS和
SSL在传输层和应用层对网络连接进行加密。
总结来说为什么要使用https:

http协议是明文传输数据,存在安全问题,而https是加密传输,相当于 http+ssl,并且可以防止流量劫持。 

Nginx要想使用SSL,需要满足一个条件即需要添加一个模块--with-http_ssl_module ,而该模块在编译的过程中又需要OpenSSL的支持 

nginx添加SSL的支持 

完成 --with-http_ssl_module模块的增量添加 

》将原有/usr/local/nginx/sbin/nginx进行备份 
》拷贝nginx之前的配置信息 
》在nginx的安装源码进行配置指定对应模块 ./configure --with-http_ssl_module 
》通过make模板进行编译 
》将objs下面的nginx移动到/usr/local/nginx/sbin下 
》在源码目录下执行 make upgrade进行升级,这个可以实现不停机添 加新模块的功能

Nginx的SSL相关指令 

因为刚才我们介绍过该模块的指令都是通过ngx_http_ssl_module模块来解析的。
》ssl:该指令用来在指定的服务器开启HTTPS,可以使用 listen 443 ssl,后面这种方式更通用些。

语法   ssl on | off
默认值 ssl off
位置 http、server 
server{ 
  listen 443 ssl; 
}

》ssl_certificate:为当前这个虚拟主机指定一个带有PEM格式证书的证书。

语法ssl_certificate file;
默认值 -
位置http、server

》ssl_certificate_key:该指令用来指定PEM secret key文件的路径

语法ssl_certificate_key file;
默认值 -
位置

 http、server

 》ssl_session_cache:该指令用来配置用于SSL会话的缓存

语法    ssl_sesion_cache off|none|[builtin[:size]] [shared:name:size];
默认值    ssl_session_cache none;
位置http、server

 

off:禁用会话缓存,客户端不得重复使用会话
none:禁止使用会话缓存,客户端可以重复使用,但是并没有在缓存中存储会话参数
builtin:内置OpenSSL缓存,仅在一个工作进程中使用。
shared:所有工作进程之间共享缓存,缓存的相关信息用name和size来指定
》ssl_session_timeout:开启SSL会话功能后,设置客户端能够反复使用储存在缓存中的会话参数时间。

语法 ssl_session_timeout time;
默认值ssl_session_timeout 5m;
位置   http、server

》ssl_ciphers:指出允许的密码,密码指定为OpenSSL支持的格式

语法ssl_ciphers ciphers;
默认值 ssl_ciphers HIGH:!aNULL:!MD5;
位置http、serve


可以使用openssl ciphers查看openssl支持的格式
》ssl_prefer_server_ciphers:该指令指定是否服务器密码优先客户端密码

语法 ssl_perfer_server_ciphers on|off;
默认值ssl_perfer_server_ciphers off;
位置 http、server

生成证书

方式一:使用阿里云/腾讯云等第三方服务进行购买。
方式二:使用openssl生成证书
先要确认当前系统是否有安装openssl

openssl  version 

安装下面的命令进行生成

mkdir /root/cert 
cd /root/cert 
openssl genrsa -des3 -out server.key 1024 
openssl req -new -key server.key -out server.csr 
cp server.key server.key.org 
openssl rsa -in server.key.org -out server.key 
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

 开启SSL实例

server { 
  listen 443 ssl; 
  server_name localhost; 
  ssl_certificate server.cert; 
  ssl_certificate_key server.key; 
  ssl_session_cache shared:SSL:1m; 
  ssl_session_timeout 5m; 
  ssl_ciphers HIGH:!aNULL:!MD5; 
  ssl_prefer_server_ciphers on; 
  location / { 
    root html; 
    index index.html index.htm; 
  }
}验证

反向代理系统调优

反向代理值Buffer和Cache

Buffffer翻译过来是"缓冲",Cache翻译过来是"缓存"。

总结:

相同点: 
          两种方式都是用来提供IO吞吐效率,都是用来提升Nginx代理的性能。 
不同点: 
          缓冲主要用来解决不同设备之间数据传递速度不一致导致的性能低的问 题,缓冲中的数据一旦此次操作完成后,就可以删除。 
          缓存主要是备份,将被代理服务器的数据缓存一份到代理服务器,这样的 话,客户端再次获取相同数据的时候,就只需要从代理服务器上获取,效 率较高,缓存中的数据可以重复使用,只有满足特定条件才会删除.

Proxy Buffer 相关指令

》proxy_buffering :该指令用来开启或者关闭代理服务器的缓冲区;

语法proxy_buffering on|off;
默认值proxy_buffering on;
位置http、server、location

》proxy_buffers:该指令用来指定单个连接从代理服务器读取响应的缓存区的个数和大小。
    
    

语法proxy_buffers number size;
默认值proxy_buffers 8 4k | 8k;(与系统平台有关)
位置

http、server、location

number:缓冲区的个数
size:每个缓冲区的大小,缓冲区的总大小就是number*size
》proxy_buffer_size:该指令用来设置从被代理服务器获取的第一部分响应数据的大小。保持与proxy_buffffers中的size一致即可,当然也可以更小。

语法proxy_buffer_size size;
默认值proxy_buffer_size  4k | 8k;(与系统平台有关)
位置 http、server、location

》proxy_busy_buffers_size:该指令用来限制同时处于BUSY状态的缓冲总大小

语法 proxy_buffer_size size;
默认值 proxy_buffer_size  4k | 8k;(与系统平台有关)
位置 http、server、location

》proxy_temp_path:当缓冲区存满后,仍未被Nginx服务器完全接受,响应数据就会被临时存放在磁盘文件上,该指令设置文件路径

语法proxy_temp_path path;
默认值proxy_temp_path proxy_temp;(与系统平台有关)
位置 http、server、location

注意path最多设置3层
》proxy_temp_fifile_write_size:该指令用来设置磁盘上缓冲文件的大小。

语法proxy_temp_fifile_write_size size;
默认值 proxy_temp_fifile_write_size 8K|16K;(与系统平台有关)
位置 http、server、location

通用网站的配置:

proxy_buffering on; 
proxy_buffer_size 4 32k; 
proxy_busy_buffers_size 64k; 
proxy_temp_file_write_size 64k;

根据项目的具体内容进行相应的调节。

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

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

相关文章

云原生应用程序简介

云原生应用程序简介 提示 该内容摘自电子书《为 Azure 构建云原生 .NET 应用程序》&#xff0c;可在**.NET Docs**上获取&#xff0c;也可以免费下载 PDF 并离线阅读。 另一天&#xff0c;在办公室研究“下一件大事”。 你的手机响了。这是友好的招聘人员打来的&#xff0c;他每…

备考2024年美国数学竞赛AMC10:吃透1250道历年真题和知识点(持续)

最近有家长问好真题网&#xff0c;有什么含金量比较高的初中生数学竞赛吗&#xff1f;美国数学竞赛AMC10是个不错的选择。根据近年的时间安排&#xff0c;距离2024年AMC10美国数学竞赛开赛预计还有2个多月的时间&#xff0c;实践证明&#xff0c;做真题&#xff0c;吃透真题和背…

[Python学习日记-2] Python的介绍与安装

[Python学习日记-2] Python的介绍与安装 Python的介绍和发展趋势 Python环境安装 开发你的第一个Python程序 Python的介绍和发展趋势 一、Python发展史 Python是一种高级编程语言&#xff0c;由Guido van Rossum&#xff08;龟叔&#xff0c;荷兰人&#xff09;于1989年圣诞…

Cursor搭配cmake实现C++程序的编译、运行和调试

Cursor搭配cmake实现C程序的编译、运行和调试 Cursor是一个开源的AI编程编辑器&#xff0c;开源地址https://github.com/getcursor/cursor &#xff0c;它其实是一个集成了Chat-GPT的VS Code。 关于VS Code和VS的对比可以参考这篇文章VS Code 和 Visual Studio 哪个更好&…

ASPCMS漏洞之文件上传漏洞

ASPCMS是由上⾕⽹络开发的全新内核的开源企业建站系统&#xff0c;能够胜任企业多种建站需求&#xff0c;并且 ⽀持模版⾃定义、⽀持扩展插件等等&#xff0c;能够在短时间内完成 企业建站。 步骤一&#xff1a;访问靶场 访问后台页面——登录后台——填写用户密码&#xff0…

混合密度网络Mixture Density Networks(MDN)

目录 简介1 介绍2 实现3 几个MDN的应用&#xff1a;参考 简介 平方和或交叉熵误差函数的最小化导致网络输出近似目标数据的条件平均值&#xff0c;以输入向量为条件。对于分类问题&#xff0c;只要选择合适的目标编码方案&#xff0c;这些平均值表示类隶属度的后验概率&#x…

记录一次单例模式乱用带来的危害。

项目场景&#xff1a; 我们在接受到短信网关下发的回执之后&#xff0c;需要将回执内容也下发给我们的下游服务。为了防止下游响应超时&#xff0c;我们需要将超时的信息存放到Redis中然后进行补发操作。 问题描述 在使用Redis进行数据存储的时候&#xff0c;报NPE问题。 原因…

Leetcode第136场双周赛题解(c++)

题外话 也是好久没有更新力扣比赛的题解了&#xff0c;前段时间也是比较忙&#xff08;说的好像现在不忙一样哈哈&#xff09;&#xff0c;像我等菜鸟&#xff0c;一般都是保二进三四不写的&#xff0c;笑死。 题目一.求出胜利玩家的数目 给你一个整数 n &#xff0c;表示在…

【C++ STL】vector

文章目录 vector1. vector的接口1.1 默认成员函数1.2 容量操作1.3 访问操作1.4 修改操作1.5 vector与常见的数据结构的对比 2. vector的模拟实现2.1 类的定义2.2 默认成员函数迭代器的分类 2.3 容量接口memcpy 浅拷贝问题内存增长机制reserve和resize的区别 2.4 修改接口迭代器…

ScreenAgent:基于LVLM的计算机控制智能体

ScreenAgent : A Vision Language Model-driven Computer Control Agent 论文链接: https://arxiv.org/abs/2402.07945https://arxiv.org/abs/2402.07945IJCAI 2024 1.概述 大型语言模型(LLM),诸如ChatGPT与GPT-4,在自然语言处理领域(涵盖生成、理解及对话等任务)展现出…

springBoot 3.X整合camunda

camunDa camunDa 是2013年从Activiti5 中分离出来的一个新的工作流引擎。Camunda 官方提供了 Camunda Platform、Camunda Modeler&#xff0c;其中 Camunda Platform 以 Camunda engine 为基础为用户提供可视化界面&#xff0c;Camunda Modeler 是流程文件建模平台&#xff0c…

python 的 tuple(元组) 是不是冗余设计?

有人问&#xff0c;python 的 tuple&#xff08;元组&#xff09; 是不是冗余设计&#xff1f;因为它和list&#xff08;列表&#xff09;很像。 先抛观点&#xff0c;tuple不是冗余设计&#xff0c;它最大的特点是不可变&#xff0c;在Python程序设计中非常重要。 tuple与li…

药店管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;药品分类管理&#xff0c;药品信息管理&#xff0c;留言板管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;药品信息&#xf…

VBA中类的解读及应用第十四讲:限制复选选择,程序运行过程及效果

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。 类&#xff0c;是非常抽象的&#xff0c;更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

【Vue3】组件通信之$parent

【Vue3】组件通信之$parent 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的…

利用Dockerfile文件执行docker build自动构建镜像

一、Dockerfile使用详解 1.1 Dockerfile介绍 DockerFile是一种被Docker程序解释执行的脚本&#xff0c;由一条条的命令组成的&#xff0c;每条命令对应linux下面的一条命令&#xff0c;Docker程序将这些DockerFile指令再翻译成真正的linux命令&#xff0c;其有自己的书写方式和…

读零信任网络:在不可信网络中构建安全系统08设备清单管理

1. 设备清单管理 1.1. 设备的认证和完整性检查是零信任安全至关重要的第一大步&#xff0c;但是仅仅验证设备是否属于企业是不够的 1.2. 设备清单管理涉及对设备及其属性进行编目管理 1.2.1. 将配置管理作为设备清单数据库 1.2.2. 维护/管理这些记录对客户端和服务器设备同样…

AI电销机器人的效果与作用

ai电销机器人的工作效率是非常高的&#xff0c;电销机器人一天的外呼量至少是3000左右&#xff0c;工作效率是人工的十倍还多&#xff0c;并且电销机器人没有负面情绪&#xff0c;一直都可以保持高昂的工作热情&#xff0c;非常简单方便。 并且ai电销机器人是越用越聪明的&…

刘润《关键跃升》读书笔记3

1&#xff09; 防御动⼒”发动机 ⽐如&#xff0c;恐惧。 转正考核、末位淘汰等&#xff0c;本质上都是在制造“危险”环境&#xff0c;从⽽激发员 ⼯全⼼投⼊。万⼀没转正&#xff0c;万⼀被淘汰&#xff0c;房贷怎么还&#xff0c;孩⼦怎么养&#xff1f; 你想想都害怕&am…

【Redis 进阶】哨兵 Sentinel(重点理解流程和原理)

Redis 的主从复制模式下&#xff0c;一旦主节点由于故障不能提供服务&#xff0c;需要人工进行主从切换&#xff0c;同时大量的客户端需要被通知切换到新的主节点上&#xff0c;对于上了一定规模的应用来说&#xff0c;这种方案是无法接受的&#xff0c;于是 Redis 从 2.8 开始…