Nginx正反向代理及负载均衡等功能实现配置代码实例

Nginx正反向代理及负载均衡等功能实现配置代码实例,第1张

Nginx正反向代理及负载均衡等功能实现配置代码实例

本文主要介绍Nginx正向和反向代理、负载均衡等配置代码示例。,通过示例代码进行了非常详细的介绍,对大家的学习或者工作都有一定的参考价值。有需要的朋友可以参考一下。

本文主要介绍Nginx正向和反向代理、负载均衡等配置代码示例。,通过示例代码进行了非常详细的介绍,对大家的学习或者工作都有一定的参考价值。有需要的朋友可以参考一下。

系统环境:

VirtualBox管理器

厘斯6.4

nginx1.10.0

对应于IP的机器名:

IP计算机名角色名

[elk]客户端

10.0.0.136[LVS-主]nginx服务器

10.0.0.137[kvm]网络服务器1

10.0.0.111[lvs-backup]web服务器2

一、转发代理

1.1环境介绍

1.2配置介绍

Nginx服务器:(内网地址:10.0.0.136,外网地址:172.16.27.64)

使用VirtualBoxManager虚拟化双网卡。

[[email protected]]#ifconfig eth0Linkencap:EthernetHWaddr08:00:27:30:56:99 inetaddr:10.0.0.136Bcast:10.255.255.255Mask:255.0.0.0 inet6addr:fe80::a00:27ff:fe30:5699/64Scope:Link UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1 RXpackets:891978errors:0dropped:0overruns:0frame:0 TXpackets:9509errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:81841095(78.0MiB)TXbytes:13339058(12.7MiB) eth1Linkencap:EthernetHWaddr08:00:27:55:4C:72 inetaddr:172.16.27.64Bcast:172.16.27.255Mask:255.255.255.0 inet6addr:fe80::a00:27ff:fe55:4c72/64Scope:Link UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1 RXpackets:913671errors:0dropped:0overruns:0frame:0 TXpackets:22712errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:109369858(104.3MiB)TXbytes:1903855(1.8MiB) loLinkencap:LocalLoopback inetaddr:127.0.0.1Mask:255.0.0.0 inet6addr:::1/128Scope:Host UPLOOPBACKRUNNINGMTU:16436Metric:1 RXpackets:36222errors:0dropped:0overruns:0frame:0 TXpackets:36222errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:0 RXbytes:3899937(3.7MiB)TXbytes:3899937(3.7MiB)
[[email protected]]#catzxproxy.conf server{ listen80;#监听的端口 server_name10.0.0.136;#server的内容地址,与client需要网络互通 resolver172.16.5.1;#DNS,这个是DNS,访问外网 location/{ proxy_passhttp://$http_host$request_uri;#$http_host和$request_uri是nginx系统变量,不需要替换,保持原样 }

Nginx客户端:

只有一张内网卡,可以通过访问Nginx服务器上网。这个原理其实就是俗称的“翻墙鸡之类的”。

[root@kvm~]#ifconfig eth0Linkencap:EthernetHWaddr08:00:27:72:8C:3B inetaddr:10.0.0.137Bcast:10.255.255.255Mask:255.0.0.0 inet6addr:fe80::a00:27ff:fe72:8c3b/64Scope:Link UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1 RXpackets:1462448errors:0dropped:0overruns:0frame:0 TXpackets:21130errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:145119904(138.3MiB)TXbytes:2814635(2.6MiB) loLinkencap:LocalLoopback inetaddr:127.0.0.1Mask:255.0.0.0 inet6addr:::1/128Scope:Host UPLOOPBACKRUNNINGMTU:16436Metric:1 RXpackets:60800errors:0dropped:0overruns:0frame:0 TXpackets:60800errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:0 RXbytes:4831102(4.6MiB)TXbytes:4831102(4.6MiB) [root@kvm~]#wgetwww.baidu.com --2016-06-0813:02:08--http://www.baidu.com/ 正在解析主机www.baidu.com...失败:域名解析暂时失败。#无法访问百度 wget:无法解析主机地址“www.baidu.com” [root@kvm~]#exporthttp_proxy=http://10.0.0.136:80#设定环境变量,指定代理服务器的ip及端口 [root@kvm~]#wgetwww.baidu.com#可以成功访问百度了 --2016-06-0813:08:15--http://www.baidu.com/ 正在连接10.0.0.136:80...已连接。 已发出Proxy请求,正在等待回应...200OK 长度:未指定[text/html] 正在保存至:“index.html.1” [<=>]99,762--.-K/sin0.07s 2016-06-0813:08:16(1.36MB/s)-“index.html.1”已保存[99762]

二。反向代理

文章与转发代理相同

2.1环境介绍

1.让我们来看看测试页面:

[root@kvm~]#yuminstallhttpd [root@kvm~]#echo"<html>10.0.0.137</html>">/var/www/html/index.html [root@lvs-backup~]#yuminstallhttpd [root@lvs-backup~]#echo"<html>10.0.0.111</html>">/var/www/html/index.html

2.看效果:

[root@lvs-backuphtml]#curl10.0.0.111 <html> 10.0.0.111 </html> [root@lvs-backuphtml]#curl10.0.0.137 <html> 10.0.0.137 </html> ##都成功了,我们进行下一步。

2.2配置介绍

[[email protected]]#ls#nginx目录下的配置文件 zxproxy.conf [[email protected]]#cpzxproxy.conffxproxy.conf#复制一份,之前是正向代理,现在是反向代理 [[email protected]]#mvzxproxy.confzxproxy.conf.bak [[email protected]]#catfxproxy.conf server{ listen80; server_name10.0.0.136;#根据环境介绍,nginxserverip location/{ proxy_passhttp://10.0.0.137;#被代理的服务器ip } #proxy_pass:proxy_passURL #默认值:NO #使用字段:location,location中的if字段 #这个参数设置被代理服务器的地址和被映射的URL,地址可以使主机名、域名、IP加端口的模式,如: #proxy_passhttp://192.168.1.6:8099/linuxtone/; [[email protected]]#servicenginxrestart#重启加载配置

看看结果:

#先登录到实验环境中的clinet机上,ip如下: [root@elk~]#ifconfig eth0Linkencap:EthernetHWaddr08:00:27:3D:40:40 inetaddr:10.0.0.139Bcast:10.255.255.255Mask:255.0.0.0 inet6addr:fe80::a00:27ff:fe3d:4040/64Scope:Link UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1 RXpackets:2618345errors:0dropped:0overruns:0frame:0 TXpackets:247926errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:336182790(320.6MiB)TXbytes:35145157(33.5MiB) loLinkencap:LocalLoopback inetaddr:127.0.0.1Mask:255.0.0.0 inet6addr:::1/128Scope:Host UPLOOPBACKRUNNINGMTU:16436Metric:1 RXpackets:177352errors:0dropped:0overruns:0frame:0 TXpackets:177352errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:0 RXbytes:26547640(25.3MiB)TXbytes:26547640(25.3MiB) [root@elk~]#curl10.0.0.136#访问反向代理服务器 <html> 10.0.0.137 </html> #我们看到访问代理服务器,结果被转发到了webserver1上。 #接下来我们分别看下nginx-server和web-server1的日志: nginx-server: [root@lvs-master~]#tail/var/log/nginx/access.log 10.0.0.139--[08/Jun/2016:15:35:43+0800]"GET/HTTP/1.1"20026"-""curl/7.19.7 (x86_64-redhat-linux-gnu)libcurl/7.19.7NSS/3.19.1BasicECCzlib/1.2.3libidn/1.18libssh2/1.4.2""-" web-server: [root@kvmhttpd]#tail/var/log/httpd/access_log 10.0.0.136--[08/Jun/2016:15:21:12+0800]"GET/HTTP/1.0"20026"-""curl/7.19.7 (x86_64-redhat-linux-gnu)libcurl/7.19.7NSS/3.19.1BasicECCzlib/1.2.3libidn/1.18libssh2/1.4.2" ##我们看到nginx-server上的nginx的日志,显示访问的用户是10.0.0.139也就是我们环境的clinet, #而web-server上显示的ip是10.0.0.136,也就是nginx-server。 #说白了反向代理,对客户来说nginx-server就是真正的服务器,实际上,当用户访问nginx-server的时候,会将请求转发到 #web-server1上,然后web-server1将请求的结果发给nginx-server,然后由ngin小-server将请求的结果转交给用户。 #在web-server上看到的都是代理的ip,能不能也看到真实用户的ip呢? [[email protected]]#catfxproxy.conf server{ listen80; server_name10.0.0.136;#根据环境介绍,nginxserverip location/{ proxy_passhttp://10.0.0.137;#被代理的服务器ip proxy_set_headerX-Real-IP$remote_addr;#多了这行 } [[email protected]]#servicenginxrestart [root@kvm~]#tail/var/log/httpd/access_log 10.0.0.136--[08/Jun/2016:16:10:53+0800]"GET/HTTP/1.0"20026"-""curl/7.19.7 (x86_64-redhat-linux-gnu)libcurl/7.19.7NSS/3.19.1BasicECCzlib/1.2.3libidn/1.18libssh2/1.4.2" #改了之后还是显示的是代理服务器的ip,我们去web-server上修改下配置 [root@kvm~]#vim/etc/httpd/conf/httpd.conf LogFormat"%h%l%u%t\"%r\"%>s%b\"%{Referer}i\"\"%{User-Agent}i\""combined LogFormat"%h%l%u%t\"%r\"%>s%b"common LogFormat"%{Referer}i->%U"referer LogFormat"%{User-agent}i"agent #修改为:(%h指的的访问的主机,现在改为访问的真实主机ip) LogFormat"%{X-Real-IP}i</span>%l%u%t\"%r\"%>s%b\"%{Referer}i\"\"%{User-Agent}i\""combined LogFormat"%h%l%u%t\"%r\"%>s%b"common LogFormat"%{Referer}i->%U"referer LogFormat"%{User-agent}i"agent</span> [root@kvm~]#servicehttpdrestart 停止httpd:[确定] 正在启动httpd:[确定] [root@kvm~]#tail/var/log/httpd/access_log 10.0.0.136--[08/Jun/2016:16:10:53+0800]"GET/HTTP/1.0"20026"-""curl/7.19.7 (x86_64-redhat-linux-gnu)libcurl/7.19.7NSS/3.19.1BasicECCzlib/1.2.3libidn/1.18libssh2/1.4.2" <spanstyle="color:#FF0000;">10.0.0.139</span>--[08/Jun/2016:16:16:01+0800]"GET/HTTP/1.0"20026"-""curl/7.19.7 (x86_64-redhat-linux-gnu)libcurl/7.19.7NSS/3.19.1BasicECCzlib/1.2.3libidn/1.18libssh2/1.4.2" #已经变成了真实的访问地址

多个代理web服务器:

[[email protected]]#catfxproxy.conf server{ listen80; server_name10.0.0.136; location/{ proxy_passhttp://10.0.0.137; proxy_set_headerX-Real-IP$remote_addr; } location/web2{#多加个location proxy_passhttp://10.0.0.111; proxy_set_headerX-Real-IP$remote_addr; } [root@lvs-backup~]#cd/var/www/html/#进入10.0.0.111这个web-server2 [root@lvs-backuphtml]#mkdirweb [root@lvs-backuphtml]#echo"<html>10.0.0.111</html>">index.html #我们去client上访问试试: [root@elk~]#curl10.0.0.136/web2/ <html> 10.0.0.111 </html> #访问成功

三。负载平衡

实现负载均衡的方式有很多种,比如lvs四层负载均衡,nginx七层负载均衡,可以在线查看相关信息。

3.1环境介绍

3.2配置介绍

1.upstream是Nginx的HTTP上行模块。该模块通过简单的调度算法实现了从客户端IP到后端服务器的负载均衡。在上述设置中,负载平衡器的名称1.2.3.4是由upstream命令指定的。这个名字可以任意指定,以后需要用到的地方可以直接调用。

2.目前,负载均衡模块的2。Nginx支持四种调度算法,下面介绍,后两种是第三方调度算法。

  • 轮询(默认)。每个请求按照时间顺序被一个接一个地分配给不同的后端服务器。如果一个后端服务器宕机,故障系统会自动消除,这样用户的访问就不会受到影响。指定权重轮询权重。权重值越大,分配的访问概率越高,主要用于各后端服务器性能不均衡的情况。
  • ip_hash.根据IP访问的哈希结果分配每个请求,使得来自同一个IP的访问者可以访问一个后端服务器,有效地解决了动态网页的会话共享问题。
  • 公平.这是一个比上面两个更智能的负载均衡算法。该算法可以根据页面大小和加载时间智能均衡负载,即根据后端服务器的响应时间分配请求,优先考虑响应时间短的请求。NGX本身不支持fair。如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。
  • url_hash.这种方法根据被访问URL的哈希结果来分配请求,使得每个URL都被定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash。如果需要使用这种调度算法,必须安装Nginx的hash软件包。
  • 3.3.上游支持的状态参数

    在HTTP上游模块中,可以通过服务器指令指定后端服务器的IP地址和端口,也可以设置每个后端服务器在负载均衡调度中的状态。常用的状态有:

  • Down表示当前服务器暂时不参与负载平衡。
  • 备份,预留备份机。当其他所有非备份机器都出现故障或繁忙时,备份机器将被请求,因此这台机器的压力最轻。
  • Max_failures是允许失败的请求数,默认为1。超过最大次数时,返回proxy_next_upstream模块定义的错误。
  • Fail_timeout,max_failures之后暂停服务的时间。Max_failures可以与fail_timeout一起使用。
  • 注意:当负载调度算法为ip_hash时,负载均衡调度中后端服务器的状态不能为weight和backup。
    我们来看看具体配置:

    [[email protected]]#cat../nginx.conf http{ include/etc/nginx/mime.types; default_typeapplication/octet-stream; log_formatmain'$remote_addr-$remote_user[$time_local]"$request"' '$status$body_bytes_sent"$http_referer"' '"$http_user_agent""$http_x_forwarded_for"'; access_log/var/log/nginx/access.logmain; sendfileon; #tcp_nopushon; keepalive_timeout65; #gzipon; upstream1.2.3.4{ server10.0.0.111:80; server10.0.0.137:80; } include/etc/nginx/conf.d/*.conf; } [[email protected]]#catslb.confserver { location/{ proxy_passhttp://1.2.3.4;proxy_set_headerX-Real-IP$remote_addr; } #注,upstream是定义在server{}之外的,不能定义在server{}内部。定义好upstream之后,用proxy_pass引用一下即可。

    4.试验结果

    [root@elk~]#curl10.0.0.136 <html> 10.0.0.111 </html> [root@elk~]#curl10.0.0.136 <html> 10.0.0.137 </html> [root@elk~]#curl10.0.0.136 <html> 10.0.0.111 </html> #结果是server1,2交替出现,说明默认是轮询方式的负载均衡。

    5.健康检查

    通常,需要进行keepalived健康检查,但是nginx也有相应的参数可以设置。

    Max_failures是允许失败的请求数,默认为1。超过最大次数时,返回proxy_next_upstream模块定义的错误。

    Fail_timeout,max_failures之后暂停服务的时间。Max_failures可以与fail_timeout一起使用来检查运行状况。

    [[email protected]]#cat../nginx.conf http{ include/etc/nginx/mime.types; default_typeapplication/octet-stream; log_formatmain'$remote_addr-$remote_user[$time_local]"$request"' '$status$body_bytes_sent"$http_referer"' '"$http_user_agent""$http_x_forwarded_for"'; access_log/var/log/nginx/access.logmain; sendfileon; #tcp_nopushon; keepalive_timeout65; #gzipon; upstream1.2.3.4{ server10.0.0.111:80weight=1max_fails=2fail_timeout=2; server10.0.0.137:80weight=1max_fails=2fail_timeout=2; } include/etc/nginx/conf.d/*.conf; } [[email protected]]#servicenginxrestart

    6.测试结果

    [root@kvmhttpd]#servicehttpdstop#关闭web-server1服务 [root@elk~]#curl10.0.0.136 <html> 10.0.0.111 </html> [root@elk~]#curl10.0.0.136 <html> 10.0.0.111 </html> #现在只能访问web-server2了。 [root@kvmhttpd]#servicehttpdstart#打开web-server1服务 [root@elk~]#curl10.0.0.136 <html> 10.0.0.111 </html> [root@elk~]#curl10.0.0.136 <html> 10.0.0.137 </html> [root@elk~]#curl10.0.0.136 <html> 10.0.0.111 </html>

    7.7.ip_hash的负载平衡

    [[email protected]]#cat../nginx.conf upstream1.2.3.4{ ip_hash; server10.0.0.111:80weight=1max_fails=2fail_timeout=2; server10.0.0.137:80weight=1max_fails=2fail_timeout=2; } [[email protected]]#servicenginxrestart 停止nginx:[确定] 正在启动nginx:[确定] [root@elk~]#curl10.0.0.136 <html> 10.0.0.137 </html> [root@elk~]#curl10.0.0.136 <html> 10.0.0.137 </html> #配置这种负载均衡后,>每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器, #有效解决了动态网页存在的session共享问题。(一般电子商务网站用的比较多)

    这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://outofmemory.cn/zz/774737.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-03
    下一篇 2022-05-03

    发表评论

    登录后才能评论

    评论列表(0条)

    保存