正反向代理、负载均衡、Nginx配置实现
一、正反向代理
1、前提
我们曾经使用翻墙软件,访问google;使用了代理软件时,需要在浏览器选项中配置代理的地址,我们仅仅有代理这个概念,并不清楚代理还有正向和反向之分。
2、正向代理(代替客户端访问服务器)
正向代理:是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
正向代理中,proxy和client同属于一个LAN,对server透明;
3、反向代理
反向代理:以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
反向代理中,proxy和server同属于一个LAN,对client透明;
4、区别理解
正向代理的内部是客户端,代替客户端访问服务器;反向代理的内部是服务器,客户端通过反向代理访问内部服务器;
正向代理代理的对象是客户端,反向代理代理的对象是服务端;
正向代理是代理(v)客户端,为客户端收发请求,使真实客户端对服务器不可见;反向代理是代理(v)服务器,为服务器收发请求,使真实服务器对客户端不可见;
正向代理隐藏真实客户端,反向代理隐藏真实服务端;
5、代理作用
访问 原本无法访问的服务; 翻墙访问Google,正向代理服务器
提高访问速度;目标服务器返回数据会缓存带代理服务器上,下次访问同一站点会优先使用缓存数据;代理服务器途径路由速度快;
访问授权管理;正向代理服务器根据ip限制客户端访问;
6、Nginx实现
下文中IP对应的机器名:
IP 机器名 角色名
10.0.0.139 [elk] client
10.0.0.136 [lvs-master] nginx server
10.0.0.137 [kvm] web server 1
10.0.0.111 [lvs-backup] web server 2
https://blog.csdn.net/hiyun9/article/details/51602428
6.1 正向代理
Nginx server:(内网地址:10.0.0.136,外网地址:172.16.27.64)
使用VirtualBox Manager虚拟出双网卡。
[root@lvs-master conf.d]# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:30:56:99
inet addr:10.0.0.136 Bcast:10.255.255.255 Mask:255.0.0.0
inet6 addr: fe80::a00:27ff:fe30:5699/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:891978 errors:0 dropped:0 overruns:0 frame:0
TX packets:9509 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:81841095 (78.0 MiB) TX bytes:13339058 (12.7 MiB) eth1 Link encap:Ethernet HWaddr 08:00:27:55:4C:72
inet addr:172.16.27.64 Bcast:172.16.27.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe55:4c72/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:913671 errors:0 dropped:0 overruns:0 frame:0
TX packets:22712 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:109369858 (104.3 MiB) TX bytes:1903855 (1.8 MiB) lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:36222 errors:0 dropped:0 overruns:0 frame:0
TX packets:36222 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3899937 (3.7 MiB) TX bytes:3899937 (3.7 MiB)
[root@lvs-master conf.d]# cat zxproxy.conf
server {
listen 80; #监听的端口
server_name 10.0.0.136; #server的内容地址,与client需要网络互通 resolver 172.16.5.1; #DNS,这个是DNS,访问外网
location / {
proxy_pass http://$http_host$request_uri; #$http_host和$request_uri是nginx系统变量,不需要替换,保持原样
}
Nginx client:只有一个内网网卡,通过访问Nginx server去访问internet,其实翻墙、肉鸡、之类的俗称就是这个原理。
1 [root@kvm ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:72:8C:3B
inet addr:10.0.0.137 Bcast:10.255.255.255 Mask:255.0.0.0
inet6 addr: fe80::a00:27ff:fe72:8c3b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1462448 errors:0 dropped:0 overruns:0 frame:0
TX packets:21130 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:145119904 (138.3 MiB) TX bytes:2814635 (2.6 MiB) lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:60800 errors:0 dropped:0 overruns:0 frame:0
TX packets:60800 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:4831102 (4.6 MiB) TX bytes:4831102 (4.6 MiB) [root@kvm ~]# wget www.baidu.com
--2016-06-08 13:02:08-- http://www.baidu.com/
正在解析主机 www.baidu.com... 失败:域名解析暂时失败。 #无法访问百度
wget: 无法解析主机地址 “www.baidu.com” [root@kvm ~]# export http_proxy=http://10.0.0.136:80 #设定环境变量,指定代理服务器的ip及端口 [root@kvm ~]# wget www.baidu.com #可以成功访问百度了
--2016-06-08 13:08:15-- http://www.baidu.com/
正在连接 10.0.0.136:80... 已连接。
已发出 Proxy 请求,正在等待回应... 200 OK
长度:未指定 [text/html]
正在保存至: “index.html.1” [ <=> ] 99,762 --.-K/s in 0.07s 2016-06-08 13:08:16 (1.36 MB/s) - “index.html.1” 已保存 [99762]
6.2 反向代理
[root@lvs-master conf.d]# ls #nginx目录下的配置文件
zxproxy.conf
[root@lvs-master conf.d]# cp zxproxy.conf fxproxy.conf #复制一份,之前是正向代理,现在是反向代理
[root@lvs-master conf.d]# mv zxproxy.conf zxproxy.conf.bak
[root@lvs-master conf.d]# cat fxproxy.conf
server {
listen 80;
server_name 10.0.0.136; #根据环境介绍,nginx server ip location / {
proxy_pass http://10.0.0.137; #被代理的服务器ip
} #proxy_pass: proxy_pass URL
#默认值:NO
#使用字段:location,location中的if字段
#这个参数设置被代理服务器的地址和被映射的URL,地址可以使主机名、域名、IP加端口的模式,如:
#proxy_pass http://192.168.1.6:8099/linuxtone/; [root@lvs-master conf.d]# service nginx restart #重启加载配置
#先登录到实验环境中的clinet机上,ip如下:
[root@elk ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:3D:40:40
inet addr:10.0.0.139 Bcast:10.255.255.255 Mask:255.0.0.0
inet6 addr: fe80::a00:27ff:fe3d:4040/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2618345 errors:0 dropped:0 overruns:0 frame:0
TX packets:247926 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:336182790 (320.6 MiB) TX bytes:35145157 (33.5 MiB) lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:177352 errors:0 dropped:0 overruns:0 frame:0
TX packets:177352 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:26547640 (25.3 MiB) TX bytes:26547640 (25.3 MiB) [root@elk ~]# curl 10.0.0.136 #访问反向代理服务器
<html>
10.0.0.137
</html>
#我们看到访问代理服务器,结果被转发到了web server1上。 #接下来我们分别看下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" 200 26 "-" "curl/7.19.7
(x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "-" web-server:
[root@kvm httpd]# tail /var/log/httpd/access_log
10.0.0.136 - - [08/Jun/2016:15:21:12 +0800] "GET / HTTP/1.0" 200 26 "-" "curl/7.19.7
(x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/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呢? [root@lvs-master conf.d]# cat fxproxy.conf
server {
listen 80;
server_name 10.0.0.136; #根据环境介绍,nginx server ip location / {
proxy_pass http://10.0.0.137; #被代理的服务器ip
proxy_set_header X-Real-IP $remote_addr; #多了这行
}
[root@lvs-master conf.d]# service nginx restart
2 [root@kvm ~]# tail /var/log/httpd/access_log
10.0.0.136 - - [08/Jun/2016:16:10:53 +0800] "GET / HTTP/1.0" 200 26 "-" "curl/7.19.7
(x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/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 ~]# service httpd restart
停止 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" 200 26 "-" "curl/7.19.7
(x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
<span style="color:#FF0000;">10.0.0.139</span> - - [08/Jun/2016:16:16:01 +0800] "GET / HTTP/1.0" 200 26 "-" "curl/7.19.7
(x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
#已经变成了真实的访问地址
代理多个web服务器:
[root@lvs-master conf.d]# cat fxproxy.conf
server {
listen 80;
server_name 10.0.0.136; location / {
proxy_pass http://10.0.0.137;
proxy_set_header X-Real-IP $remote_addr;
}
location /web2 { #多加个location
proxy_pass http://10.0.0.111;
proxy_set_header X-Real-IP $remote_addr;
} [root@lvs-backup ~]# cd /var/www/html/ #进入10.0.0.111这个web-server2
[root@lvs-backup html]# mkdir web
[root@lvs-backup html]# echo "<html>10.0.0.111</html>" > index.html
#我们去client上访问试试:
[root@elk ~]# curl 10.0.0.136/web2/
<html>
10.0.0.111
</html>
#访问成功
二、负载均衡
1、概念
负载均衡(Load Balance),意思就是分摊到多个操作单元上进行执行;
通过一定的调度算法将流量分发到不同的应用服务器上面,同时对应用服务器做周期性的健康检查,从应用服务器集群中动态的剔除故障节点,保证应用的高可用。
2、分类
负载均衡又分为四层负载均衡和七层负载均衡
四层负载均衡,主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器;
七层负载均衡,也称为“内容交换”,主要通过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器;
七层负载均衡,可以对客户端的请求和服务器的响应进行任意意义上的修改,极大的提升了应用系统在网络层的灵活性;
七层负载均衡,更具有安全性,SYN攻击在负载均衡设备上就截止,不会影响后台服务器的正常运营;
3、负载均衡算法
轮询及加权轮询
- 轮询(Round Robbin)当服务器群中各服务器的处理能力相同时,且每笔业务处理量差异不大时,最适合使用这种算法。 轮循,按公约后的权重设置轮循比率。存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
- 加权轮询(Weighted Round Robbin)为轮询中的每台服务器附加一定权重的算法,权值越大概率越高。比如服务器1权重1,服务器2权重2,服务器3权重3,则顺序为1-2-2-3-3-3-1-2-2-3-3-3- ......
IP地址散列
- 通过管理发送方IP和目的地IP地址的散列,将来自同一发送方的分组(或发送至同一目的地的分组)统一转发到相同服务器的算法。当客户端有一系列业务需要处理而必须和一个服务器反复通信时,该算法能够以流(会话)为单位,保证来自相同客户端的通信能够一直在同一服务器中进行处理。
最小连接及加权最小连接
- 最少连接(Least Connections)在多个服务器中,与处理连接数(会话数)最少的服务器进行通信的算法。即使在每台服务器处理能力各不相同,每笔业务处理量也不相同的情况下,也能够在一定程度上降低服务器的负载。
- 加权最少连接(Weighted Least Connection)为最少连接算法中的每台服务器附加权重的算法,该算法事先为每台服务器分配处理连接的数量,并将客户端请求转至连接数最少的服务器上。
URL散列
- 通过管理客户端请求URL信息的散列,将发送至相同URL的请求转发至同一服务器的算法。
4、负载均衡实现
默认情况
[root@lvs-master conf.d]# cat ../nginx.conf
http {
include /etc/nginx/mime.types;
default_type application/octet-stream; log_format main '$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.log main; sendfile on;
#tcp_nopush on; keepalive_timeout 65; #gzip on;
upstream 1.2.3.4 {
server 10.0.0.111:80;
server 10.0.0.137:80;
}
include /etc/nginx/conf.d/*.conf;
} [root@lvs-master conf.d]# cat slb.confserver
{
location / {
proxy_pass http://1.2.3.4; proxy_set_header X-Real-IP $remote_addr;
}
#注,upstream是定义在server{ }之外的,不能定义在server{ }内部。定义好upstream之后,用proxy_pass引用一下即可。
#结果
[root@elk ~]# curl 10.0.0.136
<html>
10.0.0.111
</html>
[root@elk ~]# curl 10.0.0.136
<html>
10.0.0.137
</html>
[root@elk ~]# curl 10.0.0.136
<html>
10.0.0.111
</html>
#结果是server1,2交替出现,说明默认是轮询方式的负载均衡。
设置超时时间次数等
[root@lvs-master conf.d]# cat ../nginx.conf
http {
include /etc/nginx/mime.types;
default_type application/octet-stream; log_format main '$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.log main; sendfile on;
#tcp_nopush on; keepalive_timeout 65; #gzip on;
upstream 1.2.3.4 {
server 10.0.0.111:80 weight=1 max_fails=2 fail_timeout=2;
server 10.0.0.137:80 weight=1 max_fails=2 fail_timeout=2;
}
include /etc/nginx/conf.d/*.conf;
}
[root@lvs-master conf.d]# service nginx restart
#结果
[root@kvm httpd]# service httpd stop #关闭web-server1服务
[root@elk ~]# curl 10.0.0.136
<html>
10.0.0.111
</html>
[root@elk ~]# curl 10.0.0.136
<html>
10.0.0.111
</html>
#现在只能访问web-server2了。 [root@kvm httpd]# service httpd start #打开web-server1服务
[root@elk ~]# curl 10.0.0.136
<html>
10.0.0.111
</html>
[root@elk ~]# curl 10.0.0.136
<html>
10.0.0.137
</html>
[root@elk ~]# curl 10.0.0.136
<html>
10.0.0.111
</html>
ip_hash的负载均衡
[root@lvs-master conf.d]# cat ../nginx.conf
upstream 1.2.3.4 {
ip_hash;
server 10.0.0.111:80 weight=1 max_fails=2 fail_timeout=2;
server 10.0.0.137:80 weight=1 max_fails=2 fail_timeout=2;
}
[root@lvs-master conf.d]# service nginx restart
停止 nginx: [确定]
正在启动 nginx: [确定] [root@elk ~]# curl 10.0.0.136
<html>
10.0.0.137
</html>
[root@elk ~]# curl 10.0.0.136
<html>
10.0.0.137
</html>
#配置这种负载均衡后,>每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,
#有效解决了动态网页存在的session共享问题。(一般电子商务网站用的比较多)
正反向代理、负载均衡、Nginx配置实现的更多相关文章
- 反向代理负载均衡-----nginx
一:集群 1.1:集群的概念 集群是一组相互独立的.通过高速网络互联的计算机,他们构成了一个组,并以单一系统的模式加以管理.一个客户与集群相互作用时,集群像是一个独立的服务器.集群配置是用于提高 ...
- nginx反向代理负载均衡初次配置
反向代理,我个人理解是通过一台反向代理服务器,把客户端的把有请求按照一定的规则分发给后台的服务器.nginx作反向代理服务器的虚拟机配置如下: upstream itest { #正常情况下应该作如下 ...
- Nginx反向代理和负载均衡的配置
1.反向代理配置 反向代理也称"动静分离",nginx不自己处理图片的相关请求,而是把图片的请求转发给其他服务器来处理. 修改nginx部署目录下conf子目录的nginx.con ...
- Nginx特性验证-反向代理/负载均衡/页面缓存/URL重定向
原文发表于cu:2016-08-25 参考文档: Nginx 反向代理.负载均衡.页面缓存.URL重写等:http://freeloda.blog.51cto.com/2033581/1288553 ...
- Nginx 反向代理 负载均衡 虚拟主机配置
Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常 ...
- Linux 下 Nginx 反向代理 负载均衡配置
转载请注明出处:http://blog.csdn.net/smartbetter/article/details/52036350 上一篇分享了 Nginx + JDK + Tomcat + MySQ ...
- 【转】Nginx 反向代理 负载均衡 虚拟主机配置
原文:http://www.cnblogs.com/itdragon/p/8059000.html Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代 ...
- Centos7.4 Nginx反向代理+负载均衡配置
Ningx是一款高性能的HTTP和反向代理服务器,配置起来也比较简单. 测试环境: 172.16.65.190 Nginx-反向代理 172.16.65.191 Ningx-Web 172.16.65 ...
- 如何使用Weave以及Docker搭建Nginx反向代理/负载均衡服务器
Hi, 今天我们将会学习如何使用 Weave 和 Docker 搭建 Nginx 的反向代理/负载均衡服务器.Weave 可以创建一个虚拟网络将 Docker 容器彼此连接在一起,支持跨主机部署及自动 ...
- 项目实战2.2—nginx 反向代理负载均衡、动静分离和缓存的实现
实验一:实现反向代理负载均衡且动静分离 1.环境准备: 机器名称 IP配置 服务角色 备注 nginx VIP:172.17.11.11 反向代理服务器 开启代理功能 设置监控,调度 rs01 RIP ...
随机推荐
- java面向对象4-多态
5 多态 5.1多态:polymorphism概念 定义:某一类事物的多种存在形态表现形式:父类变量指向子类实例 例:动物中猫,狗 猫这个对象对应的类型是猫类型 猫 x = new 猫(); 同时猫也 ...
- 【leetcode】Largest Plus Sign
题目如下: In a 2D grid from (0, 0) to (N-1, N-1), every cell contains a 1, except those cells in the giv ...
- 恩友歌 What a friend we've found 歌词
Verse 1 何等恩友仁慈救主 负我罪孽担我忧 何等权利能将万事 来到耶稣座前求 多少平安我们坐失 多少痛苦冤枉受 都是因为未将万事 来到耶稣座前求 Verse 2 我们有无试探 ...
- linux-文件系统-5
cat /proc/partions cat /proc/mounts mount [options] -o [option] -t 文件类型 设备 挂载目录 设备: (1)设备文件:例如/dev/s ...
- linux 中统计目录/文件数量
1.查询目录/文件的数量(包括子目录下的文件) [root@small king]# ls -lR|grep "^-"|wc -l 4 注:R代表子目录."^d" ...
- Android使用SDKManager下载SDK速度慢 容易丢包和异常的解决办法
第一步, SDK Manager启动之后,会先解析一些google的xml文件,会在Log里面打印出一些日志信息. 解析完之后,把日志全部拷贝到一个记事本里(这一步是因为日志窗口不支持查找),在里面查 ...
- shell基础练习题
shell 基础练习题 1.编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小 #!/bin ...
- splice()、slice()、split()函数的区分
1.slice(数组) 用法:array.slice(start,end) 解释:该方法是对数组进行部分截取,并返回一个数组副本:参数start是截取的开始数组索引,end参数等于你要取的最后一个字符 ...
- mount -o是什么意思
mount -o是用loop设备, 在 linux挂载本地的(可能是硬盘上的) iso文件时, 使用的. -o 就是loop回环设备的意思. loop回路文件系统: 是: 用来在一个文件系统上实现另一 ...
- 利用Git版本控制管理你的项目
准备工作 项目创建完成后,将项目版本控制起来,今后每个版本的迭代会非常清楚,同时也有助于项目进行协同开发. 还有一个十分重要的问题是:项目上线后,线上的运行的程序的配置与线下进行测试的配置文件是不一样 ...