一、简介

由于 Nginx 的反向代理和负载均衡功能经常被提及,所以将这两个功能单独提出来进行讲解。

Nginx 其实仅仅是作为 Nginx Proxy 反向代理使用的,因为这个反向代理功能表现的效果是负载均衡集群的效果,所以将其称之为 Nginx 负载均衡。那么,反向代理和负载均衡有什么区别呢?

普通负载均衡软件,例如大名鼎鼎的 LVS,其实功能只是对请求数据包的转发(也可能会改写数据包),传递,其中 DR 模式明显的特征是从负载均衡下面的节点服务器来看,接收到的请求还是来自访问负载均衡器的客户端的真实用户,而反向代理就不一样了,反向代理接收访问用户的请求后,会代理用户重新发起请求代理下的节点服务器,最后把数据返回给客户端用户,在节点服务器看来,访问的节点服务器的客户端用户就是反向代理服务器了,而非真实的网站访问用户。

所以说,LVS 等的负载均衡是转发用户请求的数据包,而 Nginx 反向代理是接收用户的请求然后重新发起请求去请求其后面的节点。

实现 Nginx 负载均衡的组件主要有两个:

1)proxy_pass 指令属于 ngx_http_proxy_module 模块,此模块可以将请求转发到另一台服务器,在实际的反向代理工作中,会通过 location 功能匹配指定的 URI,然后把接收到的符合匹配 URI 的请求通过 proxy_pass 抛给定义好的 upstream 节点池。

2)Nginx 的负载均衡功能依赖于 ngx_http_upsteam_module 模块,所支持的代理方式包括 proxy_pass,fastcgi_pass,memcached_pass 等,新版 Nginx 软件支持的方式有所增加。本文主要讲解 proxy_pass 代理方式。
ngx_http_upstream_module 模块允许 Nginx 定义一组或多组节点服务器组,使用时可以通过 proxy_pass 代理方式把网站的请求发送到事先定义好的对应 Upstream 组的名字上,具体写法为 "proxy_pass http://www_server_pools",其中 www_server_pools 就是一个Upstream 节点服务器组名字。

Nginx 反向代理重要参数:

二、Nginx 反向代理

Nginx 反向代理是指当用户访问 Web 服务器时,网络可能不互通,因为大部分 Web 服务器只有私网 IP,若想访问该 Web 服务器,可以再找一台服务器,让这台服务器不仅能够和 Web 服务器进行互通,而且还能和用户进行互通,这台服务器就是反向代理服务器,因为它代理的是服务器端,而不是客户端。

首先 yum 安装 nginx,然后进入到 /etc/nginx 目录下面,创建虚拟主机目录 vhost,并创建一个新的虚拟主机配置文件 proxy.conf,如下:

[root@masternode nginx]# mkdir /etc/nginx/vhost
[root@masternode nginx]# vim /etc/nginx/vhost/proxy.conf
server {
listen ;
server_name www.baidu.com; location / {
proxy_pass http://14.215.177.39;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

上面的配置表示代理到 www.baidu.com,proxy_pass 指令属于 ngx_http_proxy_module 模块,此模块可以将请求转发到另一台服务器,在实际的反向代理工作中,会通过 location 功能匹配指定的URI,然后把接收到的符合匹配URI的请求通过 proxy_pass 抛给定义好的upstream 节点池。

然后,修改 nginx 主配置文件 nginx.conf,如下:

[root@masternode nginx]# vi /etc/nginx/nginx.conf

在结束符号 } 上面一行添加:

include vhost/*.conf;

这样就表示 nginx 在启动的时候,会加载 vhost 目录下面所有的 conf 文件。

检查 nginx 配置文件有无错误,如下:

[root@masternode nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

启动 nginx,并访问,如下验证:

可以正常通过 nginx 反向代理访问到 www.baidu.com。

而访问其他域名时,由于没有代理到其他域名,因此,只能返回 Nginx 的默认首页。

三、Nginx 负载均衡

代理一台服务器称作代理,代理两台或两台以上的服务器称作负载均衡。代理服务器后面可以是多台 Web 服务器,多台 Web 服务器提供服务时即可实现负载均衡的功能。正常情况下,如果不加代理服务,用户访问 Web 服务器只能一台一台地去请求,或者指定 IP,或者把域名解析到多台服务器上,使得用户一访问 A 服务器、用户二访问 B 服务器,以此类推。虽然这样操作也可以,但不太友好,如果 A 服务器宕机了,用户一因解析到了 A 服务器,就不能够访问该网站。

采用 Nginx 负载均衡后,若 A 服务器宕机,代理服务器就不会把请求发给 A 服务器。Nginx 负载均衡借助 upstream 模块,在 proxy_pass 处不能定义多个 IP,但在 upstream 下面可以定义多个 IP。

下面以 www.baidu.com 来验证,使用 dig 命令可以查看域名解析的 IP 地址,如未安装,使用 yum 安装即可,如下:

[root@masternode vhost]# yum install -y bind-utils
[root@masternode vhost]# dig www.baidu.com
......
;; ANSWER SECTION:
www.baidu.com. IN CNAME www.a.shifen.com.
www.a.shifen.com. IN A 14.215.177.38
www.a.shifen.com. IN A 14.215.177.39
......

可以看到在 dns 解析过程中,www.baidu.com 作为 cname 记录(相当于别名),在 dns 服务器中配置了 www.baidu.com 跳转到 www.a.shifen.com 的映射记录。而 www.a.shifen.com 是作为 A(address)记录,映射到了真实的 IP 信息。

创建负载均衡配置文件 load-balance.conf,如下:

[root@masternode vhost]# vim /etc/nginx/vhost/load-balance.conf
upstream baidu_com {
#ip_hash 是nginx的一种负载均衡算法,该算法会让相同的客户端ip请求相同的服务器
ip_hash;
server 14.215.177.38:80;#定义真实server地址
server 14.215.177.39:80;
}
server {
listen ;#监听端口
server_name www.baidu.com;#网站域名 location / {
proxy_pass http://baidu_com;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

停止 nginx 服务,移除之前的反向代理配置文件 proxy.conf,然后重启 nginx,通常情况下, curl -x127.0.0.1:80 www.baidu.com 会返回 nginx 的默认页面,但是重载完 load-balance.conf 之后,重新访问百度,则会正常显示百度首页,如下:

Nginx 不支持代理 HTTPS,server 后面如果写 443 端口是不支持的,Nginx 只能代理 HTTP 和 TCP。若想代理 HTTPS,让用户看到 HTTPS,后端服务器必须是 80  端口,在代理服务器上监听 443 端口,用代理服务器的 443 端口返回给用户。

Linux 笔记 - 第二十章 配置 Nginx 反向代理和负载均衡的更多相关文章

  1. Nginx反向代理实现负载均衡配置图解

    Nginx反向代理实现负载均衡配置图解 [导读] 负载均衡配置是超大型机器需要考虑的一些问题,同时也是数据安全的一种做法,下面我来介绍在nginx中反向代理 负载均衡配置图解,大家可参考本文章来操作. ...

  2. Nginx反向代理与负载均衡应用实践(一)

    Nginx反向代理与负载均衡应用实践(一) 链接:https://pan.baidu.com/s/1xB20bnuanh0Avs4kwRpSXQ 提取码:migq 复制这段内容后打开百度网盘手机App ...

  3. Nginx反向代理,负载均衡,redis session共享,keepalived高可用

    相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此 ...

  4. 【转】Nginx反向代理和负载均衡

    原文链接:http://www.cnblogs.com/shuoer/p/7820899.html Nginx反向代理和负载均衡 环境说明 由于我使用的是windows系统,所以我用虚拟机虚拟出来了3 ...

  5. 一篇文章搞定 Nginx 反向代理与负载均衡

    代理 要想弄明白反向代理,首先要知道啥是正向代理,要搞懂正向代理只需要知道啥是代理即可.代理其实就是一个中介,在不同事物或同一事物内部起到居间联系作用的环节.比如买票黄牛,房屋中介等等. 在互联网中代 ...

  6. nginx反向代理与负载均衡

    一:nginx反向代理与负载均衡配置思路与用法 1.nginx反向代理:就是你去相亲时,媒婆就是这里的代理,让媒婆带你去见姑娘 2.nginx负载均衡:就是有很多的媒婆经过商量给你选出最适合你的姑娘, ...

  7. 谁说前端不需要懂-Nginx反向代理与负载均衡

    转:https://juejin.im/post/5b01336af265da0b8a67e5c9 学到老活到老 前端圈一直很新,一直要不停的学习,而且在进入大厂的路上,还要求熟悉一门后台语言等等.用 ...

  8. [转]Nginx反向代理和负载均衡部署指南

    Nginx反向代理和负载均衡部署指南   1.        安装 1)         从Nginx官网下载页面(http://nginx.org/en/download.html)下载Nginx最 ...

  9. 基于Nginx反向代理及负载均衡

    基于Nginx反向代理及负载均衡 参考:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass 只要没有被启用,默认就是 ...

随机推荐

  1. #348 大陆争霸(DIjkstra)

    在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的 克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭 的神曾·布拉泽,而克里斯国信仰象征光明和永恒的神斯普林·布拉 ...

  2. 洛谷 P1177 【模板】快速排序

    这道题用传统快排(如下所示)的结果就是最后三个点TLE: void swap(int &a, int &b) { int tmp = a; a = b; b = tmp; } void ...

  3. Elasticsearch6.x和7.x版本常用插件汇总

    elasticsearch插件汇总 基于es 7.3版本试用. 一.安全插件 1.x-pack a.介绍 包括安全(x-pack-security),监视(x-pack-watcher),警报(x-p ...

  4. Element-UI 2.4.11 版本 使用注意(发现一点更新一点)

    1.$Vue.$refs.addForm.resetFields() 的resetFields()方法重置到默认值并不是 ,你在form绑定对象上写的默认值 ,而是这个form被渲染出来之后第一次赋到 ...

  5. C语言编程入门之--第五章C语言基本运算和表达式-part3

    5.3  挑几个运算符来讲 常用的运算符除了加减乘除(+-*/)外,还有如下: 注意:以下运算符之间用逗号隔开,C语言中也有逗号运算符,这里不讲逗号运算符. 1. 赋值运算符 =,+=,*= 2. 一 ...

  6. LoRaWAN stack移植笔记(六)_调试2

    前言 调试的过程中碰到的问题基本都是以前没有遇到过的,而且需要对整个协议栈及射频方面的工作流程较熟悉才能找到问题的原因,需要多读SX1276的数据手册以及与射频芯片的物理层通信例程和MAC层通信例程进 ...

  7. python+unittest框架第四天unittest之批量执行案例

    今天开始批量执行用例~,场景是这样的: 工作中我们可能有多个模块文件(.py)这些文件根据不同的业务类型或功能,测试案例分布在不同的模块文件下.前面的小示例中,我们的测试用例都是在一个文件中,直接运行 ...

  8. NanoPi NEO2 学习笔记 1:安装系统、首次开机和一些设置

    初识NEO2 前几天搞到了一块NanoPi NEO2,A53的核心,512M内存,一个千兆网口,非常小的体积,质量也不错,非常满意,140元的价格可以买到这样一块ARM开发板也是非常划算了,非常适合低 ...

  9. 解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xyfer.dao.UserDao.findById

    在使用Spring整合MyBatis的时候遇到控制台报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (no ...

  10. Jedis操作Redis--Key操作

    /** * Key(键) * DEL,DUMP,EXISTS,EXPIRE,EXPIREAT,KEYS,MIGRATE,MOVE,OBJECT,PERSIST,PEXPIRE,PEXPIREAT,PT ...