当前位置: 首页 > news >正文

六、Nginx-正向代理和反向代理

目录

一、正向代理

1、参数详解

 2、常用变量详解

3、配置示例

二、反向代理

三、 Nginx的安全控制

1、如何使用SSL对流量进行加密

2、nginx添加SSL的支持

3、 Nginx的SSL相关指令

(1)ssl

(2)ssl_certificate

(3)ssl_certificate_key

(4)ssl_session_cache

(5)ssl_session_timeout

(6)ssl_ciphers

(7)ssl_prefer_server_ciphers

(8)生成证书

四、 反向代理系统优化

1、proxy_buffering

2、proxy_buffers

3、proxy_buffer_size

4、proxy_busy_buffers_size

5、proxy_temp_path

6、proxy_temp_file_write_size


一、正向代理

        正向代理,意思是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。

        假设 我们想要访问国外的网站,此时你会发现国外的网站我们通过浏览器是无法访问的,这时大家可能都会用一个操作翻墙进行访问,翻墙的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们!这就称为正向代理。

        正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。

总结:正向代理就是代理客户端,客户端与代理服务器处在同一LAN(局域网)中。

1、参数详解

listen指令:#用于指定Nginx监听的端口和地址。#示例:listen 8080; 表示Nginx监听在8080端口上。
resolver指令:#用于指定DNS解析器的地址。#示例:resolver 8.8.8.8 valid=300s; 表示使用Google的公共DNS服务器进行域名解析,并设置解析结果的有效期为300秒。
proxy_pass指令:#用于指定请求应该被转发到的目标地址。#示例:proxy_pass http://backend_server; 表示将请求转发到名为backend_server的上游服务器。
proxy_set_header指令:#用于修改转发给上游服务器的请求头。#示例:proxy_set_header Host $host; 表示将原始请求的Host头转发给上游服务器。
proxy_cache指令:#用于启用缓存功能,缓存上游服务器的响应。#示例:proxy_cache path/to/cache; 表示启用缓存,并将缓存文件存储在path/to/cache目录下。
proxy_cache_valid指令:#用于为不同的响应状态码设置不同的缓存有效期。#示例:proxy_cache_valid 200 304 12h; 表示对于状态码为200和304的响应,缓存有效期为12小时。
proxy_connect_timeout指令:#用于设置与上游服务器建立连接的超时时间。#示例:proxy_connect_timeout 60s; 表示建立连接的超时时间为60秒。
proxy_read_timeout指令:#用于设置从上游服务器读取响应的超时时间。#示例:proxy_read_timeout 60s; 表示读取响应的超时时间为60秒。
proxy_send_timeout指令:#用于设置向上游服务器发送请求的超时时间。#示例:proxy_send_timeout 60s; 表示发送请求的超时时间为60秒。
client_max_body_size指令:#用于设置客户端请求体的最大允许大小。#示例:client_max_body_size 10m; 表示客户端请求体的最大允许大小为10MB。------    
Proxy Buffer相关指令
1. proxy_buffering
#该指令用来开启或者关闭代理服务器的缓冲区
#语法:proxy_buffering on|off;
#默认值:proxy_buffering on;
#位置:http、server、location
2、proxy_buffers
#该指令用来指定单个连接从代理服务器读取响应的缓存区的个数和大小。
#语法:proxy_buffers number size;
#    number:缓冲区的个数
#    size:每个缓冲区的大小,缓冲区的总大小就是number*size
#默认值:proxy_buffers 8 4k | 8K;(与系统平台有关)
#位置:http、server、location
3、proxy_buffer_size
#该指令用来设置从被代理服务器获取的第一部分响应数据的大小。保持与proxy_buffers中的size一致即可,当然也可以更小。
4、proxy_busy_buffers_size
#高负荷下缓冲大小(proxy_buffers*2)
5、proxy_temp_path
#当缓冲区存满后,仍未被Nginx服务器完全接受,响应数据就会被临时存放在磁盘文件上,该指令设置文件路径
#默认值:proxy_temp_path proxy_temp;
6、 proxy_temp_file_write_size
#设定缓存文件夹大小,大于这个值,将从upstream服务器传示例:
proxy_buffering on;
proxy_buffer_size 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

 2、常用变量详解

$arg_NAME:
#这个变量用于获取 GET 请求中指定名称(NAME)的参数值。
#例如,如果请求是 /example?name=John,那么 $arg_name 的值就是 "John"。
$uri:
#此变量包含请求中的当前 URI(不带请求参数),参数位于 $args 中。它可能不同于浏览器传递的 $request_uri 的值,因为它可以通过内部重定向或使用 index 指令进行修改。$uri 不包含主机名。
$request_uri:
#这个变量包含完整的原始请求 URI(包括参数),即客户端在 HTTP 请求行中发送的 URI。
$host:
#包含了请求行中的主机名,以及可能的端口号。
$http_HEADER:
#这里的 HEADER 是指 HTTP 请求头中的字段名。使用这个变量可以获取到请求头中对应字段的值。例如,$http_user_agent 会获取到用户代理字符串。
$remote_addr:
#客户端的 IP 地址。
$document_root:
#当前请求在服务器上的根目录。
$server_name:
#请求到达的服务器名。
$server_port:
#请求到达的服务器的端口号。
$request_filename:
#当前请求的文件路径名,由 $document_root 和 $uri 组成。

3、配置示例

#正向代理转发http请求
server {               listen 80;    resolver 114.114.114.114;        server_name  localhost;  #正向代理转发http请求    location / {        proxy_pass                 http:$host$request_uri; #设定代理服务器的协议和地址       proxy_set_header           HOST $host;        proxy_buffers              256 4k;        proxy_max_temp_file_size   0k;        proxy_connect_timeout      30;        proxy_send_timeout         60;        proxy_read_timeout         60;        proxy_next_upstream error  timeout invalid_header http_502;}
}#正向代理转发https请求
server {     resolver 114.114.114.114;    #监听443端口,https默认端口443    listen 443;   #正向代理转发https请求   proxy_connect;   proxy_connect_allow            443 563;   proxy_connect_connect_timeout  10s;   proxy_connect_read_timeout     10s;   proxy_connect_send_timeout     10s;   location / {        proxy_pass http:$host;        proxy_set_header Host $host;   }
}检查配置是否正确
sbin/nginx -t
启动,验证

二、反向代理

        反向代理指的是位于客户端与服务端之间的代理服务器。与正向代理不同的是,客户端直接访问代理服务器,然后代理服务器向服务端转发请求并将服务端返回的资源返回给客户端。

        客户端对代理是无感知的,因为客户端不需要配置任何配置参数就可以访问,客户端只需要将请求发送到反向代理服务器,由反向代理服务器去请求目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目录服务器对外就是一个服务器,暴露的是代理代理服务器地址,隐藏了真实服务器IP地址。

        总结:反向代理就是代理服务端,服务端与代理服务器处在同一LAN(局域网)中。

        反向代理的主要作用是提供负载均衡和高可用性。

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

proxy_pass http://127.0.0.1:80;
#该指令用来设置被代理服务器地址,可以是主机名称、IP地址加端口号形式。
#位置:locationproxy_set_header 
#该指令可以更改Nginx服务器接收到的客户端请求的请求头信息,然后将新的请求头发送给被代理的服务器即目标服务器。
#默认值:proxy_set_header Host $proxy_host;proxy_set_header Connection close;proxy_redirect off;
#在使用Nginx做反向代理功能时,有时会出现重定向的url不是我们想要的url,这时候就可以使用proxy_redirect进行url重定向设置了。
#proxy_redirect功能比较强大,其作用是对发送给客户端的URL进行修改。
#默认:proxy_redirect default;
#配置块(使用的字段):http、server、location
#我们是关闭此项的。
proxy_set_header X-Real-IP $remote_addr;
#把源IP 【$remote_addr,建立HTTP连接header里面的信息】赋值给X-Real-IP;这样在代码中 $X-Real-IP来获取 源IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP(作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来,用 【,】隔开;代码中用 echo $x-forwarded-for |awk -F, '{print $1}' 来作为源IP)#以下是一些反向代理的配置,可选。# 这将帮助减少缓冲区溢出攻击的可能性#允许客户端请求的最大单文件字节数。外面的快设置之后这里不需要在设置了。client_max_body_size 10m;#缓冲区代理缓冲用户端请求的最大字节数,client_body_buffer_size 128k;
# 为客户端设置超时时间    
#nginx跟后端服务器连接超时时间(代理连接超时);#nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
proxy_connect_timeout 60;
#后端服务器数据回传时间(代理发送超时);#nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。
proxy_send_timeout 30;
#连接成功后,后端服务器响应时间(代理接收超时);#nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。
proxy_read_timeout 90;
#支持客户端的请求方法。post/get;
proxy_method get;
#客户端断网时,nginx服务器是否中断对被代理服务器的请求。默认为off。
proxy_ignore_client_abort on;
#存放http报文头的哈希表容量上限,默认为512个字符。
proxy_headers_hash_max_size 1024;
#nginx服务器申请存放http报文头的哈希表容量大小。(默认64)
proxy_headers_hash_bucket_size 128;
#反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
proxy_next_upstream timeout;

示例: 

#反向代理转发请求
server {listen       80;    #监听端口server_name  locahost;                                              error_page 404  /404.html;error_page 403  /403.html;location /AsynSlProj/webService{proxy_headers_hash_max_size 512;    #设置头部哈希表的最大值proxy_headers_hash_bucket_size 128;    #设置头部哈希表大小proxy_redirect off;    #关闭代理重定向proxy_set_header Host $host:$server_port;    #将代理服务WSDL地址转换为代理服务器本机地址proxy_set_headerX-Real-IP $remote_addr;proxy_set_headerX-Forwarded-For $proxy_add_x_forwarded_for;client_max_body_size 50m;    #允许客户端请求的最大单文件字节数client_body_buffer_size 256k;    #缓冲区代理缓冲用户端请求的最大字节数proxy_connect_timeout 10;    #nginx跟后端服务器连接超时时间proxy_read_timeout 600;    #连接成功后,后端服务器响应时间proxy_send_timeout 600;    #后端服务器数据回传时间proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;proxy_pass http://127.0.0.1:80;index  index.html index.htm index.jsp;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}
}

三、 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的支持

2、nginx添加SSL的支持

        nginx添加支持 的模块在此不做详解

3、 Nginx的SSL相关指令

(1)ssl

该指令用来在指定的服务器开启HTTPS,可以使用 listen 443 ssl,后面这种方式更通用些。

语法

ssl on | off;

默认值

ssl off;

位置

http、server

server{listen 443 ssl;server_name locahost;#或者ssl on;
}

(2)ssl_certificate

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

语法

ssl_certificate file;

默认值

位置

http、server

(3)ssl_certificate_key

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

语法

ssl_ceritificate_key file;

默认值

位置

http、server

server {ssl on;ssl_certificate  /usr/local/nginx/cert/server.crt;ssl_certificate_key /usr/local/nginx/cert/server.key;
}

(4)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来指定

(5)ssl_session_timeout

开启SSL会话功能后,设置客户端能够反复使用储存在缓存中的会话参数时间。

语法

ssl_session_timeout time;

默认值

ssl_session_timeout 5m;

位置

http、server

(6)ssl_ciphers

指出允许的密码,密码指定为OpenSSL支持的格式.可以使用openssl ciphers查看openssl支持的格式。

语法

ssl_ciphers ciphers;

默认值

ssl_ciphers HIGH:!aNULL:!MD5;

位置

http、server

(7)ssl_prefer_server_ciphers

该指令指定是否服务器密码优先客户端密码

语法

ssl_perfer_server_ciphers on|off;

默认值

ssl_perfer_server_ciphers off;

位置

http、server

(8)生成证书

在此使用openssl生成证书。步骤是创建一个私钥和一个自签名证书,然后将它们配置到 Nginx 中

创建证书存放目录
mkdir  /usr/local/nginx/cert
cd /use/local/nginx/cert
1、生成服务器私钥,这个命令生成了一个 1024 位的 RSA 私钥,并且用 DES3 对其进行了加密保护。在执行此命令时,会提示您输入一个密码短语来保护私钥。
openssl genrsa -des3 -out server.key 1024
2. 根据服务器私钥文件生成证书请求文件,这个文件中会包含申请人的一些信息,所以执行下面这行命令过程中需要用户在命令行输入一些用户信息,随便填写,一路回车即可。
openssl req -new -key server.key -out server.csr
3、为了不需要在每次重启nginx的时候都输入密码
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
4、用第一步的私钥和第二步的请求文件生成证书
openssl x509 -req -in server.csr -signkey server.key -days 3650 -out server.crt 

四、 反向代理系统优化

反向代理值Buffer和Cache

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

总结下:

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

Proxy Buffer相关指令

1、proxy_buffering

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

语法

proxy_buffering on|off;

默认值

proxy_buffering on;

位置

http、server、location

2、proxy_buffers

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

语法

proxy_buffers number size;

默认值

proxy_buffers 8 4k | 8K;(与系统平台有关)

位置

http、server、location

number:缓冲区的个数

size:每个缓冲区的大小,缓冲区的总大小就是number*size

3、proxy_buffer_size

该指令用来设置从被代理服务器获取的第一部分响应数据的大小。保持与proxy_buffers中的size一致即可,当然也可以更小。

语法

proxy_buffer_size size;

默认值

proxy_buffer_size 4k | 8k;(与系统平台有关)

位置

http、server、location

4、proxy_busy_buffers_size

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

语法

proxy_busy_buffers_size size;

默认值

proxy_busy_buffers_size 8k|16K;

位置

http、server、location

5、proxy_temp_path

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

语法

proxy_temp_path path;

默认值

proxy_temp_path proxy_temp;

位置

http、server、location

6、proxy_temp_file_write_size

该指令用来设置磁盘上缓冲文件的大小。

语法

proxy_temp_file_write_size size;

默认值

proxy_temp_file_write_size 8K|16K;

位置

http、server、location

通用网站的配置:

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

相关文章:

  • 吴恩达2022机器学习专项课程C2W3:2.26 机器学习发展历程
  • 最佳websocket封装
  • java8 List的Stream流操作 (实用篇 三)
  • 【Effective Web】常见的css布局方式--三栏布局
  • 网络安全:SQL注入防范
  • 在 React 中使用 ArcGIS JavaScript SDK 构建地图应用
  • STM32高级控制定时器(STM32F103):PWM输出模式
  • 数据赋能(122)——体系:数据清洗——技术方法、主要工具
  • AWS 批量添加安全组
  • Hi3861 OpenHarmony嵌入式应用入门--点灯
  • 图像识别技术在虚拟现实与增强现实中的应用
  • 数实融合创新发展 隆道分享企业级AI应用
  • C语言:文件操作
  • 保姆级pycharm远程连接linux服务器
  • QT——MySQL数据库联用
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • @jsonView过滤属性
  • [译] React v16.8: 含有Hooks的版本
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 07.Android之多媒体问题
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • C++11: atomic 头文件
  • CSS 三角实现
  • echarts花样作死的坑
  • gops —— Go 程序诊断分析工具
  • IDEA常用插件整理
  • java8-模拟hadoop
  • javascript从右向左截取指定位数字符的3种方法
  • Java读取Properties文件的六种方法
  • leetcode46 Permutation 排列组合
  • LintCode 31. partitionArray 数组划分
  • react 代码优化(一) ——事件处理
  • supervisor 永不挂掉的进程 安装以及使用
  • 大快搜索数据爬虫技术实例安装教学篇
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 构建工具 - 收藏集 - 掘金
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 区块链共识机制优缺点对比都是什么
  • 深度解析利用ES6进行Promise封装总结
  • 实现菜单下拉伸展折叠效果demo
  • 算法-插入排序
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • ionic异常记录
  • Java总结 - String - 这篇请使劲喷我
  • ​Python 3 新特性:类型注解
  • ​油烟净化器电源安全,保障健康餐饮生活
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #pragam once 和 #ifndef 预编译头
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • %check_box% in rails :coditions={:has_many , :through}
  • (2)Java 简介
  • (20)docke容器
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释