百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

Linux运维:nginx反向代理与负载均衡简介与配置

yuyutoo 2024-11-10 13:47 2 浏览 0 评论

一:反向代理:

1:正向代理与反向代理简介:

正向代理代理客户端,反向代理代理服务器。

简单来说 ,代理就是隐藏自己的真实位置,由其他代理来访问。

既然都这样,为什么分正反呢,区别在于,正向在于主动,有目的性的指向哪里,而反向在于被动方,无法知道来访问的真正客户端是谁。

打个比方:双方买卖双方,买家(用户客户端)指定去某某商店(某网站),买家可以自己去,也可以叫别人(正向代理)去。到达卖家商店(网站域名)时,肯定可以看到一个收银的人(服务器IP),这时,真正的老板也不知道来的具体是哪个人(用户客户端真实IP或者是代理IP),为了安全,所以老板(web服务器)就请一个收银员(nginx代理)假装老板坐那里,不管谁来,都找不着真正的老板(web服务器),拿货时,只有收银员(nginx)去后面(反向代理)找老板(web)拿货给买家。交易完成,谁也没见到谁,各自安好……

如下图:用户通过正向代理,原本IP106.52.xxx.xx,通过67.229.xxx.xx这个代理去访问。用户访问到看到的只是172.16.2.50这个代理服务器,代理服务器里面没东西,只有反向代理到web服务器拿出数据给用户。用户只能访问看到的只有172.16.2.50这个IP,无法知晓真实的web服务器IP。

2:nginx反向代理作用:

主要两种模式:

  • 1:安全 ,保护了真实的web服务器,web服务器对外不可见,外网只能看到反向代理服务器,而反向代理服务器上并没有真实数据,因此,保证了web服务器的资源安全。
  • 2:负载均衡 ,web服务器往往不是一个单独服务器,是一个集群,所以需要负载均衡来分担每台服务器压力,增加效率及利用率。

3:nginx反向代理服务器搭建:

搭建环境:两台(或多台web)机器Linux(centos7)

nginx代理服务器,内网IP:172.168.2.50 (已安装nginx)

外网ip:192.168.200.150 (这里只用到外网IP访问即可)


web1服务器,ip:172.168.2.20(已安装php,nginx)

web2服务器,ip:172.168.2.21(已安装php,nginx)(可选)

目标:用户访问nginx服务器IP时,返回的数据是web的数据。

nginx安装参考:yum安装nginx最新版

web服务搭建参考:Linux手动搭建LNMP


3.1):在nginx反向代理服务器中更改配置文件

vim /etc/nginx/nginx.conf

主要配置是upstream 选项以及在location加上 proxy_pass参数两部分;

upstream 为真实web服务器IP,proxy_pass里面则为nginx代理服务器IP。

注:upstream位置应该放在http模块里面 但必须是在server模块的外面。server模块也在http模块中。

本人web1访问端口已改为9091,web2访问端口已改为9092。所以加上配置如下:

upstream phpserver1 {
	server 172.16.2.20:9091;
}

upstream phpserver2 {
	server 172.16.2.21:9092;
}

server {
	listen 80;
 	server_name 192.168.200.150;
 	location / {
 	proxy_pass http://phpserver1;
 	index index.html index.htm;
  }
}
server {
 	listen 8080;
 	server_name 192.168.200.150;
 	location / {
 	proxy_pass http://phpserver2;
 	index index.html index.htm;
 	}
}


upstream:反向代理的关键字,后面名称可自取,但要玩后面proxy_pass后面名称一致。

server: 后台真实的服务器地址,可以是IP或者FQDN(如果是FQDN,别忘记解析)。

listen:监听的端口,如果没有把原来nginx做web服务器的配置内容注销掉,建议改为其他端口。

proxy_pass:后面名称,此一定要和upstream后面(服务器组名称)的名称保持一致。


3.2):在web服务器中,更改站点测试首页。

确保已正确搭建好web服务器,如本人站点目录为/www。在站点创建测试首页区分web服务器。

vim /www/index.php

web1输入简单测试页面,web2同理改文字 这是172.16.2.21 web2服务器 即可。

<html>
<head>
<title>PHP 测试</title>
</head>
<body>
<?php echo '<p>这是172.16.2.20 web1服务器</p>'; ?>
</body>
</html>


3.3):在浏览器输入nginx代理服务器的地址测试

第一次测试输入192.168.200.150,不加端口,默认80.

测试成功,代理服务器已获取web1的数据。

第二次测试输入192.168.200.150:8080。

测试成功,代理服务器已获取web2服务器的数据。

以上就是代理服务器的简单设置。


二:负载均衡:

负载均衡之前,需要先了解反向代理,了解后就可以这样理解负载均衡了:将多台服务器写在一个 upstream 模块中,根据相关参数策略,依次反向代理个多台服务器,实现负载均衡。

防止服务器断开连接或者服务器宕机、某一台服务器过载压力大。

官网负载均衡配置说明:http://nginx.org/en/docs/http/load_balancing.html

根据参考文档,官方提供了三个内置策略:

1:round-robin(轮询):

默认策略,将请求依次分配给每个服务器。

配置如下:

http {
 	upstream phpserver1 {
 	server 171.16.2.20;
 	server 171.16.2.21;
 	server 171.16.2.22;
 	}

 server {
 	listen 80;
 	location / {
 	proxy_pass http://phpserver1;
 		}
 	}
}


假如有10个请求,则:

这种策略常常和加权轮询(weight)一起使用(生活中服务器配置有优劣的情况采用):

upstream phpserver1 {
 	server 171.16.2.20 weight=3; # 3/6次
 	server 171.16.2.21 weight=2; # 2/6次
 	server 171.16.2.22 weight=1; # 1/6次
}


10个请求,则:

2:least-connected (最少连接):

由于请求时间长短的关系,有些服务器处理快,有些服务器处理慢,导致有些服务器连接一直存在。则将新来的请求分配给连接最少的那台服务器:

upstream phpserver1 {
 	least_conn;
 	server 171.16.2.21;
 	server 171.16.2.22;
 	server 171.16.2.23;
}


3:ip-hash(ip-hash算法):

根据用户访问的IP来分配服务器,每台服务器只处理某一条IP的请求:


upstream phpserver1 {
 	ip_hash;
 	server 171.16.2.21;
 	server 171.16.2.22;
 	server 171.16.2.23;
}


三个IP,无论每个IP多少请求:

4:扩展策略:

如加权轮询的参数 weight 也属于一种扩展策略:

可参考官方upstream_module文档: http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server

常见参数:

  • down,表示当前的server暂时不参与负载均衡。
  • backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
  • max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
  • fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
  • slow_start,当一台有问题服务器恢复正常使用时,或由不可用恢复可用状态,服务器权重从0恢复到正常值的时间。默认值为0,默认禁止。注:该参数不能与 haship_hash random 参数一起使用。

配合内置策略使用举例:

upstream phpserver1 {
 	server 171.16.2.20 weight=5;
 	#权重最高,处理请求最多

 	server 171.16.2.21:8080 fail_timeout=5s slow_start=30s;
 	#暂停5秒服务,30秒后启动服务

 	server 171.16.2.22 max_fails=3;
 	#失败连接最大数为3,失败后返回proxy_next_upstream

 	server 171.16.2.23 down;
 	#不启用负载均衡策略

 	server 171.16.2.24:8080 backup;
 	#其他所有服务器宕机后,启动的备份服务器
 	}

server {
 	location / {
 	proxy_pass http://phpserver1;
 	health_check;
 	}
}


4:代理配置的部分配置文件说明(仅供参考):

更多详见http_proxy_module模块官方文档: https://nginx.org/en/docs/http/ngx_http_proxy_module.html

参数 : 解释

  • include mime.types; #文件扩展名与文件类型映射表
  • default_type application/octet-stream; #默认文件类型,默认为text/plain
  • access_log off; #取消服务日志
  • log_format myFormat ' $remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
  • access_log log/access.log myFormat; #combined为日志格式的默认值
  • sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
  • sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
  • keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
  • proxy_connect_timeout 1; #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
  • proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。
  • proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。
  • proxy_http_version 1.0 ; #Nginx服务器提供代理服务的http协议版本1.0,1.1,默认设置为1.0版本。
  • proxy_method get; #支持客户端的请求方法。post/get;
  • proxy_ignore_client_abort on; #客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off。
  • proxy_ignore_headers "Expires" "Set-Cookie"; #Nginx服务器不处理设置的http相应投中的头域,这里空格隔开可以设置多个。
  • proxy_intercept_errors on; #如果被代理服务器返回的状态码为400或者大于400,设置的error_page配置起作用。默认为off。
  • proxy_headers_hash_max_size 1024; #存放http报文头的哈希表容量上限,默认为512个字符。
  • proxy_headers_hash_bucket_size 128; #nginx服务器申请存放http报文头的哈希表容量大小。默认为64个字符。
  • proxy_next_upstream timeout ; #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。error/timeout/invalid_header/http_500/http_502/http_503/http_504/http_404/off
  • proxy_ssl_session_reuse on; #默认为on,如果我们在错误日志中发现“SSL3_GET_FINSHED:digest check failed”的情况时,可以将该指令设置为off。

相关推荐

jQuery VS AngularJS 你更钟爱哪个?

在这一次的Web开发教程中,我会尽力解答有关于jQuery和AngularJS的两个非常常见的问题,即jQuery和AngularJS之间的区别是什么?也就是说jQueryVSAngularJS?...

Jquery实时校验,指定长度的「负小数」,小数位未满末尾补0

在可以输入【负小数】的输入框获取到焦点时,移除千位分隔符,在输入数据时,实时校验输入内容是否正确,失去焦点后,添加千位分隔符格式化数字。同时小数位未满时末尾补0。HTML代码...

如何在pbootCMS前台调用自定义表单?pbootCMS自定义调用代码示例

要在pbootCMS前台调用自定义表单,您需要在后台创建表单并为其添加字段,然后在前台模板文件中添加相关代码,如提交按钮和表单验证代码。您还可以自定义表单数据的存储位置、添加文件上传字段、日期选择器、...

编程技巧:Jquery实时验证,指定长度的「负小数」

为了保障【负小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【负小数】的方法。HTML代码<inputtype="text"class="forc...

一篇文章带你用jquery mobile设计颜色拾取器

【一、项目背景】现实生活中,我们经常会遇到配色的问题,这个时候去百度一下RGB表。而RGB表只提供相对于的颜色的RGB值而没有可以验证的模块。我们可以通过jquerymobile去设计颜色的拾取器...

编程技巧:Jquery实时验证,指定长度的「正小数」

为了保障【正小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【正小数】的方法。HTML做成方法<inputtype="text"class="fo...

jquery.validate检查数组全部验证

问题:html中有多个name[],每个参数都要进行验证是否为空,这个时候直接用required:true话,不能全部验证,只要这个数组中有一个有值就可以通过的。解决方法使用addmethod...

Vue进阶(幺叁肆):npm查看包版本信息

第一种方式npmviewjqueryversions这种方式可以查看npm服务器上所有的...

layui中使用lay-verify进行条件校验

一、layui的校验很简单,主要有以下步骤:1.在form表单内加上class="layui-form"2.在提交按钮上加上lay-submit3.在想要校验的标签,加上lay-...

jQuery是什么?如何使用? jquery是什么功能组件

jQuery于2006年1月由JohnResig在BarCampNYC首次发布。它目前由TimmyWilson领导,并由一组开发人员维护。jQuery是一个JavaScript库,它简化了客户...

django框架的表单form的理解和用法-9

表单呈现...

jquery对上传文件的检测判断 jquery实现文件上传

总体思路:在前端使用jquery对上传文件做部分初步的判断,验证通过的文件利用ajaxFileUpload上传到服务器端,并将文件的存储路径保存到数据库。<asp:FileUploadI...

Nodejs之MEAN栈开发(四)-- form验证及图片上传

这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能。开始之前需要源码同学可以先在git上fork:https://github.com/stoneniqiu/R...

大数据开发基础之JAVA jquery 大数据java实战

上一篇我们讲解了JAVAscript的基础知识、特点及基本语法以及组成及基本用途,本期就给大家带来了JAVAweb的第二个知识点jquery,大数据开发基础之JAVAjquery,这是本篇文章的主要...

推荐四个开源的jQuery可视化表单设计器

jquery开源在线表单拖拉设计器formBuilder(推荐)jQueryformBuilder是一个开源的WEB在线html表单设计器,开发人员可以通过拖拉实现一个可视化的表单。支持表单常用控件...

取消回复欢迎 发表评论: