一、代理服务与反向代理

什么是代理服务

  • 代理-代理办理(代理理财、代理收货、代理购物等等)。

一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术。关于正向代理的概念如下:

正向代理(forward)是一个位于客户端【用户A】和原始服务器(origin server)【服务器B】之间的服务器【代理服务器Z】,为了从原始服务器取得内容,用户 A 向代理服务器 Z 发送一个请求并指定目标(服务器B),然后代理服务器 Z 向服务器 B 转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

HTTP请求没有代理服务的模型图

HTTP请求具有代理服务的模型图

代理分类

  • 正向代理

  • 反向代理

正向代理

  • 当局域网不能上网时,可以在浏览器设置正向代理满足上网要求

  • 当我们想通过翻墙访问国外网站查询资料,可以在浏览器设置正向代理

  • 当服务器只允许某个端的IP访问(比如googe),所以我们需要请求运行访问的那个客户端,在让其帮我们转发请求

正向代理模型图

反向代理

  • 服务端有很多工程模块的时候,需要通过Nginx代理实现流量的分发

反向代理模型图

反向代理模型图解释:

  • 客户端需要自己去请求DNS获取服务端地址;

  • 代理是为服务端服务的;

  • 红色虚线表示防火墙;

  • 配置在服务端,分发客户端请求到不同的服务端

  • 主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息

代理区别

区别在于代理的对象不一样 正向代理代理的对象是客户端 反向代理代理的对象是服务端

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

二、代理模式和模块介绍

常见的Nginx作为反向代理支持的协议

反向代理模式与Nginx代理模块

常见的Nginx作为正向代理支持的协议

注意:

  • 不能支持使用HTTPS协议

  • Nginx使用HTTP协议作为正向代理的协议

  • Nginx使用正向代理范围比较窄

三、nginx 反向代理

代理服务proxy_pass配置语法

  • Syntax: proxy_pass URL;

  • Default: —

  • Context: location, if in location, limit_except

URL 可以是

http://localhost:8000/uri/
https://192.168.1.1:8000/uri/
http://unix:/tmp/backend.socket:/uri/;(socket)

  

反向代理场景需求

1、统一访问入口,作为堡垒机,多套业务系统需使用同一个ip或者域名进行访问,以不同后缀进行区分,需要一台NGINX服务器做统一的访问入口。使用反向代理功能,将所有NGINX服务器作为外网或内网用户统一的访问入口,然后根据设置的localtion规则匹配不同的后缀转发至不同的业务服务器。

2、业务服务器不能直接被外部网络访问,即不能直接映射外网ip,需要一台代理服务器,而代理服务器能被外部网络访问同时又和业务服务器网络联通。使用反向代理功能,将NGINX服务器映射外网ip,业务服务器无需映射外网ip,外网用户访问时首先访问NGINX服务器,然后再由NGINX服务器访问业务服务器资源后转发给用户,目前主流推荐采用此方案,这样既满足了业务需外网访问的需求,又满足业务服务器的安全。

3、作为缓存服务器,负载均衡,通过反向代理服务器来优化网站的负载,使用反向代理和负载均衡2个功能,根据配置的url后缀规则转发至upstream中各服务器列表,默认按轮询策略,同时还支持权重和ip_hash ,有redis缓存登录seesion的方案中推荐使用轮询策略,否则使用ip_hash策略实现同一ip的用户请求固定至后端同一台服务器。

反向代理原理

• 1) 客户端通过浏览器发起请求到代理服务器

• 2)代理服务器 接受请求

• 3) 代理服务器 发起请求到 业务服务器

• 4)业务服务器接受请求

• 5)业务服务器 处理理请求

• 6) 业务服务器 响应请求到代理服务器

• 7)代理服务器 响应请求到客户端

• 8)客户端通过浏览器渲染请求并展示给用户

反向代理模拟

需求:假设有两个服务一个对外暴露,一个不对外暴露只能内部访问,对外暴露的端口是80,在内部访问的端口是8080,通过访问对外暴露的80服务来访问8080服务

创建HTML静态资源文件

[root@localhost nginx]# mkdir htmladmin htmlservice
[root@localhost nginx]# echo htmladmin >htmladmin/index.html

  

配置虚拟主机

修改 /usr/local/nginx 目录下的 nginx.conf 配置文件:

只有内部才能访问的8080服务

...
http{
...

# 配置虚拟主机 192.168.199.228
server {
listen 8080;
server_name 127.0.0.1;
location / {
allow 127.0.0.1;
allow 192.168.199.228;
deny all;
root /usr/local/nginx/htmladmin;
index index.html index.htm;
}

} }

  

重启nginx,验证下

[root@localhost nginx]# elinks http://192.168.199.228:8080 --dump
htmladmin

  

配置对外暴露的反向代理

...
http{
...

# 配置虚拟主机 192.168.199.228
server {
listen 8080;
server_name 127.0.0.1;
location / {
allow 127.0.0.1;
allow 192.168.199.228;
deny all;
root /usr/local/nginx/htmladmin;
index index.html index.htm;
}
} #配置对外暴露的反向代理
server {
listen 80;
location /{
proxy_pass http://127.0.0.1:8080;
}
}
​ }

  

 

重启nginx后验证效果

[root@localhost nginx]# elinks http://192.168.199.228 --dump
htmladmin

  

Nginx作为代理服务_代理配置语法补充

proxy-缓冲区

  • Syntax: proxy_buffering on | off;  

  • Default: proxy_buffering on;

  • Context: http, server, location

扩展:

proxy_buffer_size-设置缓冲区大小(内存页大小)

proxy_buffers-设置缓冲区数量和大小(内存页数量和大小)

proxy_busy_buffers_size-设置最大缓冲区大小

proxy-重定向

  • Syntax: proxy_redirect default; proxy_redirect off; proxy_redirect redirect replacement;

  • Default: proxy_redirect default;

  • Context: http, server, location

proxy-头信息

  • Syntax: proxy_set_header field value;

  • Default: proxy_set_header Host $proxy_host; proxy_set_header Connection close;

  • Context: http, server, location

扩展:

proxy_hide_header-设置隐藏头信息字段

proxy_set_body-设置请求体返回信息

proxy-超时

  • Syntax: proxy_connect_timeout time;

  • Default: proxy_connect_timeout 60s;

  • Context: http, server, location

扩展:

proxy_read_timeout-从代理服务器读取响应的超时时间

proxy_send_timeout-设置将请求传输到代理服务器的超时时间

代理配置及配置规范

代理通用配置

location / {
proxy_pass http://127.0.0.1:8080;
include proxy_params;
}

  

proxy_params

proxy_redirect default;

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr; proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60; proxy_buffer_size 32k;
proxy_buffering on;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;

  

代理配置详解: 

proxy_redirect default; 

  • 没有重定向就配置成默认,除非后端返回301情况下设置成具体重定向地址  

proxy_set_header Host $http_host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  • 设置字段重新定义或附加到传递给代理服务器的请求头,通过X-Forwarded-For获取用户真实IP

proxy_connect_timeout 30;

  • 设置代理连接超时时间

proxy_read_timeout 60;

  • 设置从代理服务器读取响应的超时时间

proxy_send_timeout 60;

  • 设置向代理服务器发送请求的超时时间

proxy_buffering on;

  • 设置启用或禁用来自代理服务器的响应缓冲

proxy_buffer_size 32k;

  • 设置用于读取从代理服务器接收的响应的第一部分的缓冲区的大小

proxy_buffers 4 128k

  • 设置用于从代理服务器读取响应的缓冲区的数量和大小,用于单个连接。

proxy_busy_buffers_size 256k;

  • 设置当启用来自代理服务器的响应缓冲时,限制可能忙于向响应客户端发送响应的缓冲区的总大小,而响应尚未完全读取。

proxy_max_temp_file_size 256k;

  • 设置当启用来自代理服务器的响应缓冲,并且整个响应不适合proxy_buffer_size和proxy_buffers指令设置的缓冲区时,响应的一部分可以保存到临时文件中。 该指令设置临时文件的最大大小。 一次写入临时文件的数据大小由proxy_temp_file_write_size指令设置。

    location / {
index index.jsp;
proxy_pass http://hello; #在这里设置一个代理,和upstream的名字一样
#以下是一些反向代理的配置可删除
proxy_redirect off;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数
proxy_connect_timeout 300; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 300; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 300; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
}

  

参考资料

[1]https://www.jianshu.com/p/d14c2e7e63d4

[2]https://www.cnblogs.com/crazymagic/p/11029137.html

nginx之旅(第三篇):代理、正向代理、反向代理、代理的原理、nginx反向代理场景、nginx反向代理配置、nginx反向代理语法的更多相关文章

  1. nginx之旅(第一篇):nginx下载安装、nginx启动与关闭、nginx配置文件详解、nginx默认网站

    一.nginx下载安装 版本nginx 1.15.5 系统环境centos7.5(本机ip192.168.199.228) 关闭selinux 和防火墙firewall 1.下载 wget http: ...

  2. Mybatis之旅第三篇-SqlMapConfig.xml全局配置文件解析

    一.前言 刚换工作,为了更快的学习框架和了解业务,基本每天都会加班,导致隔了几天没有进行总结,心里总觉得不安,工作年限越长越感到学习的重要性,坚持下去!!! 经过前两篇的总结,已经基本掌握了mybat ...

  3. Spring之旅第三篇-Spring配置详解

    上一篇学习了IOC的概念并初步分析了实现原理,这篇主要学习Spring的配置,话不多说,让我们开始! 一.Bean元素配置 1.1 基本配置 看一个最基本的bean配置 <bean name=& ...

  4. SpringBoot之旅第三篇-日志

    一.前言 日志对于一个系统的重要性不言而喻,日志能帮我们快速定位线上问题,市场上存在非常多的日志框架,比较常见的有 JUL,JCL,Log4j,Log4j2,Logback.SLF4j.jboss-l ...

  5. linux下配置nginx反向代理例子

    官方说明: 例子: 虚拟机ip:192.168.85.3,物理机VMware Network Adapter VMnet8  ip:192.168.85.1 1,准备tomcat 准备一tomcat, ...

  6. centos下配置nginx支持php

    添加nginx 默认主页index.php vim .../etc/nginx/conf.d/default.conf location / { root   /usr/share/nginx/htm ...

  7. nginx入门与实战 安装 启动 配置nginx Nginx状态信息(status)配置 正向代理 反向代理 nginx语法之location详解

    nginx入门与实战 网站服务 想必我们大多数人都是通过访问网站而开始接触互联网的吧.我们平时访问的网站服务 就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务. Web ...

  8. CentOS 7.X下 -- 配置nginx正向代理支持https

    环境说明: 本次测试使用的操作系统为:CentOS 7.2 x86 64位 最小化安装的操作系统,系统基础优化请参考:https://www.cnblogs.com/hei-ma/p/9506623. ...

  9. 第三篇 SQL Server代理警报和操作员

    本篇文章是SQL Server代理系列的第三篇,详细内容请参考原文. 正如这一系列的上一篇所述,SQL Server代理作业是由一系列的作业步骤组成,每个步骤由一个独立的类型去执行,除了步骤中执行的工 ...

随机推荐

  1. mybatis框架之多参数入参--传入Map集合

    需求:查询出指定性别和用户角色列表下的用户列表信息 实际上:mybatis在入参的时候,都是将参数封装成为map集合进行入参的,不管你是单参数入参,还是多参数入参,都是可以封装成map集合的,这是无可 ...

  2. NOIP 2012 Vigenère 密码

    洛谷 P1079 Vigenère 密码 https://www.luogu.org/problemnew/show/P1079 JDOJ 1779: [NOIP2012]Vigenèr密码 D1 T ...

  3. [LeetCode] 300. Longest Increasing Subsequence 最长递增子序列

    Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Inp ...

  4. [LeetCode] 19. Remove Nth Node From End of List 移除链表倒数第N个节点

    Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...

  5. java web开发入门六(spring mvc)基于intellig idea

    spring mvc ssm=spring mvc+spring +mybatis spring mvc工作流程 1A)客户端发出http请求,只要请求形式符合web.xml文件中配置的*.actio ...

  6. Failed to start LSB: Bring up/down networking 另外一个偏方

    之前网卡启动不了,会是配置不对,或者是移动了虚拟机导致hwaddr发生了变化. 但是今天没改动什么,突然用不了,一直报错Failed to start LSB: Bring up/down .... ...

  7. Linux record

    1.设置ubuntu密码刚安装好的ubuntu系统,没有root密码,需要用户去手动设置的. sudo passwd root 输入2次密码即可. 2. Linux下is not in the sud ...

  8. Unity Shader 广告牌效果

    广告牌效果指的是,一个二维平面的法线方向始终与视线(摄像机的观察方向)相同.广泛运用于渲染烟雾,云朵,闪光等. 它的本质在于构建旋转矩阵,此时我们可以选择三个基向量来构建此矩阵. 指向→的方向(X轴) ...

  9. centos7上配置mysql8的主从复制

    注意:1.主库:10.1.131.75,从库:10.1.131.762.server-id必须是纯数字,并且主从两个server-id在局域网内要唯一. [主节点]vi /etc/my.cnf[mys ...

  10. Flink之state processor api原理

    无论您是在生产环境中运行Apache Flink or还是在过去将Flink评估为计算框架,您都可能会问自己一个问题:如何在Flink保存点中访问,写入或更新状态?不再询问!Apache Flink ...