正/反向代理, 和nginx

正/反向代理, 和nginx反向代理

正向代理和反向代理

反向代理

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。

特点:

  1. 反向代理服务器位于用户和目标服务器之间.

  2. 反向代理服务器就相当于目标服务器.(用户以为代理服务器就是真实服务器)

  3. 用户通过反向代理服务器获取资源 而不是直接访问真实服务器.

  4. 用户不清楚真实的服务器到底是谁.

  5. 反向代理是服务器端代理.保护真实服务器信息.

反向代理特征: 用户不清楚真实目标服务器是谁.

正向代理

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

特点:

  1. 代理服务器位于用户和服务器之间
  2. 用户发起请求之前已经清楚的知道谁的目标服务器.
  3. 用户通过代理服务器到指定的目标服务器获取资源.
  4. 正向代理保护的是客户端信息,是客户端代理

(正/反)向代理总结

  1. 正向代理是客户端代理,用户清楚的知道访问的服务器是谁. 保护了客户端信息
  2. 反向代理是服务器端代理.用户不清楚访问的真实服务到底是谁. 保护了服务端信息\

nginx (反向代理)

nginx介绍

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好

特点: 占有内存少 不超过2M ,并发能力强 3-5万次/秒

下载地址: [点击跳转下载页面] 下载完成后解压即可使用. 注意:Nginx安装目录 不要装到C盘,并且路径不要有中文 空格 及系统目录.

官方文档: http://nginx.org/en/docs/

启动和关闭

解压完毕后, 双击 nginx.exe 即可启动, 注意: 点击之后可能会出现一个窗口一闪而过, 说明启动成功了

启动成功后, 在浏览器输入 localhost:80localhost 看到Welcome to nginx 页面说明启动成功了

nginx默认使用的是80端口, 如果端口被占用, 可以百度解决

检查启动后进行:

打开任务管理器 -> 消息信息 输入n即可看到以n开头的两个进程

守护进程是为了防止主进程意外关闭, 所以我们要先关闭守护进程, 才能关闭主进程.

主进一般是占用内存较大的那个进程

nginx命令

命令执行位置: 执行命令时需要在nginx的根目录中执行.

然后在目录打开cmd窗口执行命令

  1. 启动命令 start nginx
  2. 重启命令 nginx -s reload
  3. 关闭命令 nginx -s stop

nginx的配置解析

配置文件问nginx根目录下的 conf/nginx.config文件

配置文件中 http 下 server的配置如下

http {
	#http协议内,可以有多个服务 每个服务就是一个server
    server {
    	# 监听用户访问的端口   默认是80端口
        listen       80;   
        # server_name 服务名称  浏览器的访问域名
        server_name  localhost;
		#配置反向代理的实现  / 拦截所有的用户请求
        location / {
        	# root代表关键字   代表反向代理的目录
            root   html; # html目录
            # 如果需要代理url(域名)和端口, 可使用proxy_pass关键字进行配置, 如下
            # proxy_pass http://localhost:8091;
            # index 代表默认的访问页面
            index  index.html index.htm;
        }
    }
}

nginx图片服务器

分析

例如: 图片在本地 D:\images\2020\08\07\a.jpg (windows下的路径)

我们现在需要将这个图片的url地址发送给客户端

例如url为: http://image.aaron.com/8080/08/07/a.jpg, 我们要用此url来把图片转为客户端可访问的图片地址

所以我们把D:\images\根目录 转为 http://image.aaron.com虚拟路径即可

配置nginx

# 配置图片服务器
server {
    listen 80;
    server_name image.aarom.com; # 指定域名

    ##通过网址转向指定的目录  注意/的写法
    location / {
    	root D:/images; # 指定图片根路径
    }
}

记得配置完nginx后重启nginx...

配置HOST

如果是线上部署, 可忽略此步骤, 只需要做好域名映射即可

开发环境下, 我们可以配置域名, 用指定的http://image.aaron.com/***来访问我们的资源

windows下hosts文件目录为: C:\Windows\System32\drivers\etc下的hosts文件(有的系统可能是大写的文件名)

修改host文件后, 我们在浏览器中输入http://image.aaron.com/2020/08/07/a.jpg 即可在浏览器中看到图片

nginx域名代理

分析

例如我们需要使用http://manager.jt.com来访问localhost:8091的服务器(也可以是其他的服务器IP和端口)

前提是此域名在hosts文件中进行了配置127.0.0.1 manager.jt.com

配置nginx

# 商品管理服务器  监听的是用户 manager.jt.com:80  映射的是url地址
server {
    listen   80;
    server_name  manager.jt.com;

    #进行反向代理
    location / {
        #映射的url请求网址. 请求地址也可以是其他的IP和端口
        proxy_pass   http://localhost:8091;
    }  
}

配置好后, 我们在浏览器输入 http://manager.jt.com 实际上访问的就是localhost:8091

Nginx属性-负载均衡(案例)

原理图

负载均衡服务器是为了防止分布式中, 减轻单个服务器的压力

编写controller

为了方便, 我们在当前电脑启动三个不同端口的服务器, 使用/getPort请求来返回服务器的端口到网页上

获取端口的请求代码如下:

@RestController
public class PortController {
    @RequestMapping("/getPort")
    public String getPort(HttpServletRequest request) {
        int localPort = request.getLocalPort(); // 这里不能使用getServerPort()
        return localPort + "";
    }
    // 除了上面这种方式, 我们也可以读取yml配置文件中的端口配置来获取端口号
}

好的, 我们现在打包三次, 端口号分别为8081, 8082, 8083

打包之后 我们使用java -jar ***.war/jar 来启动着三个服务器, 注意, 启动后不要关闭窗口

配置nginx-轮询策略

轮询策略说的是集群中的所有服务器轮流处理请求

nginx配置如下:

server {
    listen   80;
    server_name  manager.jt.com;

    #进行反向代理
    location / {
        # 映射的url请求网址.
        # proxy_pass http://localhost:8091; # 只配置一个, 不用这种配置方式
        proxy_pass  http://jtWindows; # 这里会把下面jtWindows中的配置拼接到这里
    }  
}

#配置集群  1.默认方式   轮询策略
upstream jtWindows {
    server localhost:8081;
    server localhost:8082;
    server localhost:8083;
}

现在我们在浏览器输入http://manager.jt.com/getPort 然后我们多刷新几次

我们会发现浏览器8081, 8082, 8083轮流输出, 这就是轮训策略

配置nginx-权重策略

如果服务器的性能不一样, 有的性能高, 有的性能低, 可以使用这种策略: 性能越高的服务器,则承担的压力也就越高.

只需要使用weight关键字, 指定概率的值即可

nginx配置如下

server {
    listen   80;
    server_name  manager.jt.com;

    #进行反向代理
    location / {
        # 映射的url请求网址.
        # proxy_pass http://localhost:8091; # 只配置一个, 不用这种配置方式
        proxy_pass  http://jtWindows; # 这里会把下面jtWindows中的配置拼接到这里
    }  
}

upstream jtWindows {
    server localhost:8081  weight=6; # 概率为6/10
    server localhost:8082  weight=3; # 概率为3/10
    server localhost:8083  weight=1; # 概率为1/10
}

ip_hash策略

为了让同一个用户只对同一个服务器发送请求. 即将用户与服务器进行绑定. 以后用户只能访问该服务器.

算法分析: ip_hash会把用户的IP和端口进行计算, 计算出来的hash值对服务器总数取余数. 如果余数为0, 则访问第一台服务器, 如果余数为1, 则访问第二胎服务器, 以此类推...

nginx配置

server {
    listen   80;
    server_name  manager.jt.com;

    #进行反向代理
    location / {
        # 映射的url请求网址.
        # proxy_pass http://localhost:8091; # 只配置一个, 不用这种配置方式
        proxy_pass  http://jtWindows; # 这里会把下面jtWindows中的配置拼接到这里
    }  
}

upstream jtWindows {
    ip_hash; # ip_hash 策略, 每个用户只绑定一个服务器
    server localhost:8081;
    server localhost:8082;
    server localhost:8083;
}

配置好后重启nginx, 我们来访问http://manager.jt.com/getPort, 发现不管刷新多少次, 页面只返回同一个端口号, 这就是ip_hash策略

ip_hash策略的缺点

  1. 用户与服务器进行绑定,当服务器宕机时则可能影响用户的使用.
  2. 由于访问是通过算数计算的结果,可能导致严重的负载不均的现象

Nginx 高级属性

down属性

说明:nginx在不做任何的配置时,无法感知服务器是否正常运行.所有会频繁的访问故障机.
解决方案: 可以利用down属性 来标识故障机.

#配置集群  1.默认方式   轮询策略   2.权重策略   3.IPhash策略
upstream jtWindows {
    server localhost:8081 down;
    server localhost:8082 ;
    server localhost:8083 ;
}

备用机策略

说明:正常情况下一般服务器部署时需要准备几台服务器当做备用.正常的情况下该服务器不参与工作.只有当主机遇忙时/或者宕机时.该服务器才会工作.

upstream jtWindows {
    server localhost:8081 down;
    server localhost:8082 down;
    server localhost:8083 backup;
}

把第三个服务器设置为备用机, 当前两个标识为故障机后, 使用第三个服务器

nginx高可用配置

说明:当tomcat服务器宕机时,可以通过如下的配置,实现服务器的自动的切换.无需人为的干预.

配置信息:
fail_timeout=60s; 设定超时时间(定义一个周期)
max_fails=1 设定最大的访问失败次数.

配置说明:
如果nginx访问某台服务器时,如果该服务器访问失败,失败的次数达到最大失败次数时.在60秒之内,nginx不会再次访问故障机.直到下一个周期.

upstream jtWindows {
    server localhost:8081 max_fails=1 fail_timeout=60s;
    server localhost:8082 max_fails=1 fail_timeout=60s;
    server localhost:8083 max_fails=1 fail_timeout=60s;
}
posted @ 2020-08-07 20:18  zpk-aaron  阅读(252)  评论(0编辑  收藏  举报