当前位置: 首页 > 科技观察

Nginx反向代理和负载均衡详解

时间:2023-03-22 17:13:26 科技观察

前言Nginx的代理功能和负载均衡功能是最常用的。Nginx的基本语法知识和配置在Nginx配置详解中已经有讲解。本文将开门见山。首先描述一些关于代理功能的配置,然后解释负载均衡的细节。Nginx代理服务配置说明1.设置404页面重定向地址error_page404https://www.runnob.com;#错误页面proxy_intercept_errorson;#如果代理服务器返回的状态码为400或大于400,设置的error_page配置将生效。默认关闭。2.如果我们的代理只允许接受get和post请求方法,一个proxy_methodget;#支持客户端的请求方式。发布/获取;3、设置支持的http协议版本proxy_http_version1.0;#Nginx服务器提供代理服务http协议版本1.0、1.1,默认设置为1.0版本4.如果你的nginx服务器作为2个web服务器的代理,负载均衡算法采用轮询,那么当你的一台机器的web程序iis关闭了,也就是无法访问web,那么nginx服务器会将请求分发到这个无法访问的web服务器上,如果这里的响应连接时间过长,会导致客户端的页面全部等待响应时间和用户体验都会受到影响。怎样才能避免这种情况在这里发生呢?这里我有一张图来说明这个问题。如果web2在负载均衡中出现这种情况,nginx会先去web1请求,但是nginx在配置不当的情况下会继续向web2分发请求,然后等待web2响应,直到我们的响应超时之前re-requesting分发到web1,如果这里的响应时间过长,用户会等待更长时间。下面的配置是解决方案之一。proxy_connect_timeout1;#nginx服务器与代理服务器建立连接的超时时间,默认60秒proxy_read_timeout1;#nginx服务器想被代理服务器组发送读请求,等待响应的超时时间,默认60秒。proxy_send_timeout1;#nginx服务器想收到代理服务器组的写请求,等待响应超时,默认60秒。proxy_ignore_client_aborton;#当客户端断网时,nginx服务器是否终止对代理服务器的请求。默认关闭。5.如果使用upstream命令配置一组服务器作为代理服务器,服务器中的访问算法遵循配置的负载均衡规则。同时,你可以通过这条命令来配置发生哪些异常,请求会按顺序交给下一组。服务器处理。proxy_next_upstreamtimeout;#反向代理upstream中设置的服务器组,当发生故障时,代理服务器返回的状态值。状态值可以是:error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|offerror:服务器在建立连接或向代理服务器发送请求或读取响应消息时遇到错误。timeout:连接建立,代理服务器发送请求或读取响应信息时服务器超时。invalid_header:代理服务器返回的响应头异常。off:请求不能分发到代理服务器。http_400,...:代理服务器返回的状态码是400,500,502等6.如果想通过http获取客户的真实ip,而不是代理服务器的ip地址,那么做以下设置。proxy_set_headerHost$主机;#只要用户在浏览器中访问的域名绑定了VIPVIP,且其下有RS;然后使用$host;host为访问URL中的域名和端口www.taobao.com:80proxy_set_headerX-Real-IP$remote_addr;#将源IP[$remote_addr,HTTP连接头中的信息]分配给X-Real-IP;所以代码中$X-Real-IP获取源IPproxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;#在nginx作为代理服务器时,设置的IP列表会记录通过的机器ip和代理机器ip,用[,]分隔;代码中使用echo$x-forwarded-for|awk-F,'{print$1}'作为源IP,X-Forwarded-For和X-Real-IP的相关文章可以查看:X-Forwarded-对于在HTTP请求标头中。7、以下是我的配置文件中关于代理配置的部分内容,仅供参考。includemime.types;#文件扩展名和文件类型映射表default_typeapplication/octet-stream;#默认文件类型,默认为text/plain#access_logoff;#取消服务日志log_formatmyFormat'$remote_addr–$remote_user[$time_local]$request$status$body_bytes_sent$http_referer$http_user_agent$http_x_forwarded_for';#自定义格式access_loglog/access.logmyFormat;#combined是日志格式的默认值sendfileon;#允许sendfile传输文件,默认关闭,可以在httpblock,服务器块,位置块。sendfile_max_chunk100k;#每个进程每次调用的传输次数不能大于设置值,默认为0,即没有上限。keepalive_timeout65;#连接超时,默认75s,可以在http、server、location块中。proxy_connect_timeout1;#nginx服务器与代理服务器建立连接的超时时间,默认60秒proxy_read_timeout1;#nginx服务器想被代理服务器组发送读请求,等待响应的超时时间,默认60秒。proxy_send_timeout1;#nginx服务器想收到代理服务器组的写请求,等待响应超时,默认60秒。proxy_http_version1.0;#Nginx服务器提供代理服务http协议版本1.0、1.1,默认设置为1.0版本。#proxy_methodget;#支持客户端请求方式。发布/获取;proxy_ignore_client_aborton;#当客户端断网时,nginx服务器是否终止对代理服务器的请求。默认关闭。proxy_ignore_headers"Expires""Set-Cookie";#Nginx服务器不处理设置的HTTP对应的header字段,这里可以用多个空格隔开。proxy_intercept_errorson;#如果代理服务器返回的状态码是400或者大于400,设置的error_page配置才会生效。默认关闭。proxy_headers_hash_max_size1024;#存储http消息头的哈希表容量上限,默认为512个字符。proxy_headers_hash_bucket_size128;#nginx服务器申请存储httpheaders的哈希表容量大小。默认值为64个字符。proxy_next_upstreamtimeout;#反向代理upstream中设置的服务器组,当发生故障时,代理服务器返回的状态值。错误|超时|无效标头|http_500|http_502|http_503|http_504|http_404|off#proxy_ssl_session_reuseon;默认是开启的,如果我们在错误日志中发现“SSL3_GET_FINSHED:digestcheckfailed”,可以将这个命令设置为关闭。Nginx负载均衡详解在Nginx配置详解一文中,我说了nginx有哪些负载均衡算法。我将详细说明如何操作和配置此结。首先,让我告诉你上游配置。这个配置就是写一组代理服务器地址,然后配置负载均衡算法。这里有2种写代理服务器地址的方法。upstreammysvr{server192.168.10.121:3333;server192.168.10.122:3333;}server{....location~*^.+${proxy_passhttp://mysvr;#请求到mysvr定义的服务器列表}}然后,让我们做一些实际的事情。1、双机热备:如果你有2台服务器,当一台服务器出现意外时,会启用第二台服务器提供服务。服务器处理请求的顺序:AAAAAA突然A挂了,BBBBBBBBBBBBBB.....upstreammysvr{server127.0.0.1:7878;server192.168.10.121:3333backup;#HotStandby}2.轮询:nginx默认为polling其权重默认为1,服务器处理请求的顺序:ABABABABAB....upstreammysvr{server127.0.0.1:7878;server192.168.10.121:3333;}3.加权轮询:根据配置的weight而是将不同数量的请求分发到不同的服务器。如果未设置,则默认为1。以下服务器的请求顺序为:ABBABBABBABBABB....upstreammysvr{server127.0.0.1:7878weight=1;server192.168.10.121:3333weight=2;}4.ip_hash:nginx会让同一个客户端ip请求同一台服务器。upstreammysvr{server127.0.0.1:7878;server192.168.10.121:3333;ip_hash;}5.以上四种均衡算法不明白的可以查看Nginx配置详解,可能更容易理解理解。至此,是不是觉得nginx的负载均衡配置特别简单,功能也特别强大呢,还没完,我们继续。nginx负载均衡配置的几个状态参数说明。down,说明当前服务器暂时不参与负载均衡。backup,预留备用机。当所有其他非备机都出现故障或忙时,会请求备机,所以这台机器的压力是最轻的。max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream模块定义的错误。fail_timeout,失败max_fails次后暂停服务的时间。max_fails可以和fail_timeout一起使用。upstreammysvr{server127.0.0.1:7878weight=2max_fails=2fail_timeout=2;server192.168.10.121:3333weight=1max_fails=2fail_timeout=1;}至此,应该说nginx内置的负载均衡算法是缺货。如果你想进一步了解nginx的负载均衡算法,nginx官方提供了一些插件供你了解。