对于一个大型网站,随着网站的访问量快速增长,单台服务器很难再支撑起需要,所以我们会购置多个服务器来满足业务量的需求,然后再利用Nginx提供的反向代理功能,来实现多台服务器间的协作功能,提高网站的处理能力。那首先先了解下什么是Nginx的正向代理和反向代理

正向代理与反向代理的区别

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

反向代理正好相反。对于客户端来说,反向代理就好像目标服务器。并且客户端不需要进行任何设置。客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了。

正、反代理使用场景

  • 正向代理:主要用于在防火墙内的局域网提供访问外网的途径(FQ软件-红杏出墙)
  • 反向代理:主要用于将防火墙后面的服务器提供给外网的客户访问,同时还有可以实现负载均衡等功能

要实现正向代理服务,客户端必须要进行一些特别的设置。这些略过,不过你可以买个vpnFQ软件感受一下

反向代理实现

利用Nginx来实现反向代理配置简单,指令proxy_pass,用于设置后端服务器的地址。地址中包括使用的协议,主机名,URL

  1. server{
  2. listen 80;
  3. server_name www.fx.com;
  4. # 用户访问www.fx.com 域名的请求全部都转发给ip为140,端口为8099的主机
  5. location / {
  6. proxy_pass http://192.168.153.140:8099;
  7. }
  8. }
  1.  

本地测试的时候,记得修改本地host文件来解析www.fx.com域名。

  1. # C:\Windows\System32\drivers\etc\hosts
  2. 192.168.153.139 www.fx.com

六、反向代理相关指令

  • 指令proxy_pass: 用于设置后端服务器的地址。地址中包括使用的协议,主机名,URL
  • 指令proxy_set_header: 在将客户端发送后端服务器之前,更改来自客户端的请求信息
  • 指令proxy_connect_timeout 配置Nginx与后端代理服务器尝试建立连接的超时时间
  • 指令proxy_redirect 用于修改后端服务器返回的响应头中的Location和Refresh

七、Nginx下的负载均衡

负载均衡就是将请求压力分摊到多个服务器承担,从而提高服务器的可用性和响应速度。下面以lnmp环境测试

1、场景环境准备:

  • 作为反向代理的 A主机 192.168.153.139
  • B 主机 192.168.153.140
  • C 主机 192.168.153.141

B、C主机添加虚拟主机 www.fz.com,项目首页文件分别显示

  1. # B主机
  1. [root@localhost /]# echo 'hello 140' > /home/wwwroot/www.fz.com/index.html
  1. # C主机
  1. [root@localhost /]# echo 'hello 141' > /home/wwwroot/www.fz.com/index.html

2、代理服务器配置

在A主机创建虚拟主机,域名:www.fz.com。修改配置文件

  1. [root@localhost /]# vim /usr/local/nginx/conf/vhost/www.fz.com.conf

配置文件修改以下内容

  1. upstream myfz {
  2. server 192.168.153.140:80;
  3. server 192.168.153.141:80;
  4. }

  5. server{
  6. listen 80;
  7. server_name www.fz.com;
  8. location / {
  9. proxy_pass http://myfz;
  10. # $host 用来获取客户端真实的主机名
  11. proxy_set_header Host $host;
  12. # $remote_addr 用来获取客户端真实的IP地址
  13. proxy_set_header X-Real-IP $remote_addr;
  14. # $proxy_add_x_forwarded_for 用来在客户端请求头字段后添加客户端地址,使用逗号分隔,当不存在请求头字段,该变量等同于上面的$remote_addr
  15. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  16. }
  17. } 

3、客户端测试

本地测试的时候,记得修改本地hosts文件来解析www.fz.com域名。

  1. # C:\Windows\System32\drivers\etc\hosts
  1. 192.168.153.139 www.fx.com
  1. 192.168.153.139 www.fz.com
 4、宕机测试

Nginx检测到后端那台服务器宕机了,则会在负载均衡时自动排除该主机。你可以重启(reboot)或关机测试(init 0)

5、权重轮询测试

很多时候,我们购置多台服务器组成负载均衡组,但是保不准服务器硬件配置高低不一样。所以我们要通过weight参数来进行权重设置,配置好的权重高些,反之设置权重低些。

注意Nginx会按照平滑加权重轮询算法进行分配。其中权重值总和为一个循环,如下配置:这里配置10次请求为一次循环,在整个过程中,140服务器会在10次请求被分配到8次,141服务器3次 但是8次和2次并不会连续执行,而是按照算法分散执行。

  1. upstream myfz {
  2. server 192.168.153.140:80 weight=8;
  3. server 192.168.153.141:80 weight=2;
  4. }
 

另外,还可以设定每台Web服务器在负载调度中的状态。

  • max_fails 允许请求失败的次数,默认1次,当超过最大次数时,返回proxy_next_upstream指令定义的错误
  • 在经历max_fails次失败后,暂停服务的时间。
  • backup 预留的备份机器
  • down 表示当前的server暂时不参与负载均衡
  1. upstream myfz {
  2. server 192.168.153.140:80 weight=8 max_fails=1 fail_timeout=2;
  3. server 192.168.153.141:80 weight=2 max_fails=2 fail_timeout=2;
  4. }
  1.  

6、让主服务器也提供服务

  • 修改主服务器的nginx.conf主服务器的nginx.conf或者另外创建虚拟主机
  • 服务器转发到了自己IP上,然后又进到主服务器分配IP那里,假如一直分配到本机,则会造成一个死循环
  • 80端口已经用来监听负载均衡的处理,那么本服务器上就不能再使用80端口来处理fz.com的访问请求
  1. upstream myfz {
  2. server 192.168.153.140:80 weight=8;
  3. server 192.168.153.141:80 weight=1;
  4. server 192.168.153.139:8088 weight=1;
  5. }
  1.  

7、ip_hash解决session问题

ip_hash方式是指:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session共享的问题

  1. upstream myfz {
  2. ip_hash;
  3. server 192.168.153.140:80 weight=8;
  4. server 192.168.153.141:80 weight=1;
  5. server 192.168.153.139:8088 weight=1;
  6. }
 

注意:在使用ip_hash方式的时候,不能使用weight和backup设置。另外使用ip_hash方式为每一个用户ip绑定一台服务器,势必会导致某些服务器接收的请求多。所以只有在有必要的时候使用。

8、利用第三方模块fair进行负载均衡

1、首先要安装fair模块

2、配置fair方式的负载均衡

  1. upstream myfz {
  2. server 192.168.153.140:80;
  3. server 192.168.153.141:80;
  4. fair;
  5. }

  6. server{
  7. listen 80;
  8. server_name www.fz.com;
  9. location / {
  10. proxy_pass http://myfz;
  11. proxy_set_header Host $host;
  12. proxy_set_header X-Real-IP $remote_addr;
  13. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  14. }
  15. } 

3、测试效果 验证fair模块是否根据后端服务器的响应时间负载均衡。

  1. <?php
  2. sleep(10);
  3. echo 'hello 140';
  4. ?>

Nginx的反向代理做负载均衡的更多相关文章

  1. Windos环境用Nginx配置反向代理和负载均衡

    Windos环境用Nginx配置反向代理和负载均衡 引言:在前后端分离架构下,难免会遇到跨域问题.目前的解决方案大致有JSONP,反向代理,CORS这三种方式.JSONP兼容性良好,最大的缺点是只支持 ...

  2. nginx(三)反向代理和负载均衡

    nginx(三)反向代理和负载均衡 正向代理概念:比如在学校要上网,在学校内网是一个内网ip,需要连上公网就需要一个正向代理服务器. 反向代理概念: 看下图(Nginx只做请求的转发,后台有多个htt ...

  3. nginx的反向代理和负载均衡的一个总结

    之前一直觉的nginx的反向代理和负载均衡很厉害的样子,最近有机会接触了一下公司的这方面的技术,发现技术就是一张窗户纸呀,捅破了啥都明白了! 接下来先看一下nginx的反向代理: 简单的来说就是ngi ...

  4. nginx简单反向代理和负载均衡(ubuntu)

    nginx简单反向代理与负载均衡 环境:三台ubuntu 12.04.5 虚拟机    均装有nginx 1.1.19 以下u1(192.168.240.129) ,u2(192.168.240.13 ...

  5. nginx的反向代理和负载均衡的区别是什么 - 开源中国社区

    nginx的反向代理和负载均衡的区别是什么 - 开源中国社区   nginx的反向代理和负载均衡的区别是什么 #user  nobody;worker_processes  1;#error_log  ...

  6. 七、CentOS 6.5 下 Nginx的反向代理和负载均衡的实现

    CentOS 6.5 下 Nginx的反向代理和负载均衡的实现 * 修复上面文章的问题: 复制出一个tomcat2之后,修改service.xml文件时,要修改三个端口: 1. <!-- 800 ...

  7. Nginx使用反向代理实现负载均衡

    Nginx使用反向代理实现负载均衡 yls 2019-9-20 简介 基于docker容器以及docker-compose,所以需要自学docker在linux环境的基本使用 使用两个tomcat作为 ...

  8. nginx 配置反向代理,负载均衡实战解析

    前言:NGINX的反向代理和负载均衡是网站架构中经常用到的一种高并发,高可用的方案,下面我们直接实战操作,当然理论也是要的. 一.反向代理 过程:反向代理:客户端 一>代理 <一> ...

  9. [笔记]nginx配置反向代理和负载均衡

    1.nginx配置文件:源码安装情况下,nginx.conf在解压后的安装包内.yum安装,一般情况下,一部分在/etc/nginx/nginx.conf中,一部分在/etc/nginx/conf.d ...

  10. nginx 作为反向代理实现负载均衡的例子

    以下我们就来举例说明如何使用 nginx 实现负载均衡.因为nginx在处理并发方面的优势,现在这个应用非常常见.nginx 这个轻量级.高性能的 web server 主要可以干两件事情: 〉直接作 ...

随机推荐

  1. Codeforces Round #529 (Div. 3) 练习赛

    Examples input 6 baabbb output bab input 10 ooopppssss output oops 思路: 模拟等差数列即可 #include<bits/std ...

  2. Java | 个人学习指南笔记

    前言:由于作者已经有C语言,C++和Python语言的基础了,所以在文章的编写时会以这几门编程语言作对比.本文学习自 C语言中文网的 Java 教程,部分内容引用自这.引用内容仅作学习使用. 第1章: ...

  3. 领域驱动设计(DDD)实践之路(四):领域驱动在微服务设计中的应用

    这是"领域驱动设计实践之路"系列的第四篇文章,从单体架构的弊端引入微服务,结合领域驱动的概念介绍了如何做微服务划分.设计领域模型并展示了整体的微服务化的系统架构设计.结合分层架构. ...

  4. [tslint] Identifier 'loggedIn' is never reassigned; use 'const' instead of 'let'. (prefer-const)

  5. 【rt-thread】构建自己的项目工程 -- 初始篇

    现以stm32f429igt6芯片的板子 & Keil5编译环境为例,记述构建适配自己板子的rt-thread工程的过程 1.拿到rt-thread源码,进入bsp/stm32/librari ...

  6. [转帖]elasticsearch8.0以上版本修改内置用户密码

    https://www.cnblogs.com/zhang-ding-1314/p/16199682.html 修改密码需要在es启动,并cd到es的bin目录下执行: 1.重置密码并在控制台显示新密 ...

  7. [转帖]AMD第四代宵龙 9174F 亮眼

    https://www.amd.com/zh-hans/processors/epyc-9004-series#%E8%A7%84%E6%A0%BC 型号规格   型号 CPU 核心数量 线程数量 最 ...

  8. [转帖]jemalloc内存分配算法

    https://www.cnblogs.com/xiaojiesir/p/15450732.html jemalloc内存分配算法简介 jemalloc 是由 Jason Evans 在 FreeBS ...

  9. [转帖]Linux命令拾遗-动态追踪工具

      原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 这是Linux命令拾遗系列的第六篇,本篇主要介绍工作中常用的动态追踪工具strace.arthas.bpft ...

  10. Linux 内核参数

    /proc/sys/net/ipv4: ip_local_port_range:定义了TCP或UDP对目标发起连接所选择的本地端口范围(除ip_local_reserved_ports之外),其定义受 ...