反向代理负载均衡Nginx的http和tcp代理
一、集群
1.1 什么是集群
集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。 和传统的高性能计算机技术相比,集群技术可以利用各档次的服务器作为节点,系统造价低,可以实现很高的运算速度,完成大运算量的计算,具有较高的响应能力,能够满足当今日益增长的信息服务的需求。 而集群技术是一种通用的技术,其目的是为了解决单机运算能力的不足、IO能力的不足、提高服务的可靠性、获得规模可扩展能力,降低整体方案的运维成本(运行、升级、维护成本)。只要在其他技术不能达到以上的目的,或者虽然能够达到以上的目的,但是成本过高的情况下,就可以考虑采用集群技术
1.2 集群的特点
1) 提高性能
一些计算密集型应用,如:天气预报、核试验模拟等,需要计算机要有很强的运算处理能力,现有的技术,即使普通的大型机器计算也很难胜任。这时,一般都使用计算机集群技术,集中几十台甚至上百台计算机的运算能力来满足要求。提高处理性能一直是集群技术研究的一个重要目标之一。
2) 降低成本
通常一套较好的集群配置,其软硬件开销要超过100000美元。但与价值上百万美元的专用超级计算机相比已属相当便宜。在达到同样性能的条件下,采用计算机集群比采用同等运算能力的大型计算机具有更高的性价比。
3) 提高可扩展性
用户若想扩展系统能力,不得不购买更高性能的服务器,才能获得额外所需的CPU 和存储器。如果采用集群技术,则只需要将新的服务器加入集群中即可,对于客户来看,服务无论从连续性还是性能上都几乎没有变化,好像系统在不知不觉中完成了升级。
4) 增强可靠性
集群技术使系统在故障发生时仍可以继续工作,将系统停运时间减到最小。集群系统在提高系统的可靠性的同时,也大大减小了故障损失。
1.3 常见的集群类型
1.3.1 负载均衡集群
负载均衡集群为企业需求提供了更实用的系统。负载均衡集群使负载可以在计算机集群中尽可能平均地分摊处理。负载通常包括应用程序处理负载和网络流量负载。这样的系统非常适合向使用同一组应用程序的大量用户提供服务。每个节点都可以承担一定的处理负载,并且可以实现处理负载在节点之间的动态分配,以实现负载均衡。对于网络流量负载,当网络服务程序接受了高入网流量,以致无法迅速处理,这时,网络流量就会发送给在其它节点上运行的网络服务程序。同时,还可以根据每个节点上不同的可用资源或网络的特殊环境来进行优化。与科学计算集群一样,负载均衡集群也在多节点之间分发计算处理负载。它们之间的最大区别在于缺少跨节点运行的单并行程序。大多数情况下,负载均衡集群中的每个节点都是运行单独软件的独立系统。
但是,不管是在节点之间进行直接通信,还是通过中央负载均衡服务器来控制每个节点的负载,在节点之间都有一种公共关系。通常,使用特定的算法来分发该负载。
负载均衡集群典型搭配:
1.3.2 高可用性集群
当集群中的一个系统发生故障时,集群软件迅速做出反应,将该系统的任务分配到集群中其它正在工作的系统上执行。考虑到计算机硬件和软件的易错性,高可用性集群的主要目的是为了使集群的整体服务尽可能可用。如果高可用性集群中的主节点发生了故障,那么这段时间内将由次节点代替它。次节点通常是主节点的镜像。当它代替主节点时,它可以完全接管其身份,因此使系统环境对于用户是一致的。
高可用性集群使服务器系统的运行速度和响应速度尽可能快。它们经常利用在多台机器上运行的冗余节点和服务,用来相互跟踪。如果某个节点失败,它的替补者将在几秒钟或更短时间内接管它的职责。因此,对于用户而言,集群永远不会停机。
在实际的使用中,集群的这三种类型相互交融,如高可用性集群也可以在其节点之间均衡用户负载。同样,也可以从要编写应用程序的集群中找到一个并行集群,它可以在节点之间执行负载均衡。从这个意义上讲,这种集群类别的划分是一个相对的概念,不是绝对的。
1.4 集群的选择
1.4.1 不同类型企业对集群的选择
1)当业务重要,技术力量又薄弱,有钱买商业产品,如银行、证券、金融等
2)对于门户网站,会用并用软硬件分担单一产品的风险,融资企业。
3)中小型互联网公司,起步没利润,希望通过开源软件。
1.4.2运对于维人员集群的选择
中小型互联网并发和总访问量不是很大的情况下,建议首选nginx负载均衡,nginx配置简单,使用方便,安全稳定,社区活跃,另一个产品haproxy(支持L4和L7负载均衡,nginx1.9之前只支持L7,新版支持L4,不过处于测试阶段)。
nginx+keepalived实现高可用,理由安装配置简单,安全稳定,类似的还有heartbeat(使用复杂,不建议初学者使用)
商业负载均衡产品:成本高、性能好、更稳定、缺点不能二次开发;开源软件相反。
1.4.3 生产环境集群建议选择
lvs简单L4转发,实现ip负载均衡;L7层反向代理使用nginx/haproxy均可,以实际情况和技术栈定
二、使用nginx实现反向代理负载均衡实战
# cd /usr/local/src/
# tar zxf nginx-1.12.0.tar.gz
# cd nginx-1.12.0
# ./configure --prefix=/usr/local/nginx-1.12.0 --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-file-aio
# make && make install
# ln -sv /usr/local/nginx-1.12.0/ /usr/local/nginx
测试配置并启动Nginx
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx
1.配置Nginx反向代理
修改nginx配置文件,并添加proxy.conf,重载nginx
# cat nginx.conf
[root@localhost nginx]# cat /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
upstream myblog {
# 权重为2,健康检查最大失败次数为3
server 192.168.3.200:8080 weight=2 max_fails=3 fail_timeout=5;
server 192.168.3.12:8080 weight=2 max_fails=3 fail_timeout=5;
server 192.168.3.140:8080 weight=2 max_fails=3 fail_timeout=5;
}
server {
listen 80;
server_name www.chinasoft.com;
location / {
proxy_pass http://myblog;
index index.html index.htm;
include proxy.conf;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
[root@linux-node1 conf]# cat at /usr/local/nginx/conf/proxy.conf
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
[root@localhost nginx]# sbin/nginx -t
nginx: the configuration file /usr/local/nginx-1.12.0/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx-1.12.0/conf/nginx.conf test is successful
[root@localhost nginx]# sbin/nginx -s reload
2.通过分组方式,以及User-agent实现不同代理
#http段配置
upstream static-cluster{
server 192.168.3.200:8080 weight=1 max_fails=3 fail_timeout=5;
}
upstream dynamic-cluster{
server 192.168.3.12:8080 weight=1 max_fails=3 fail_timeout=5;
}
upstream default-cluster{
server 192.168.3.140:8080 weight=1 max_fails=3 fail_timeout=5;
}
#需要配置本地host解析测试
server {
listen 80;
server_name www.chinasoft.com;
location / {
if ($http_user_agent ~* "Firefox"){
proxy_pass http://static-cluster;
}
if ($http_user_agent ~* "Chrome"){
proxy_pass http://dynamic-cluster;
}
proxy_pass http://default-cluster;
index index.html;
}
}
测试分组
##默认浏览器交给default处理
火狐浏览器交给static-cluster处理
谷歌浏览器交给dynamic-cluster处理
3.配置Nginx4层反向代理
多加编译参数 --with-stream
# ./configure --prefix=/usr/local/nginx-1.12.0 \
--user=www --group=www --with-http_ssl_module \
--with-http_stub_status_module --with-file-aio --with-stream
# ln -s /usr/local/nginx-1.12.0 /usr/local/nginx
2222端口代理至192.168.3.200的SSH、7306端口代理至于192.168.3.12的MYSQL
stream {
upstream ssh_proxy {
hash $remote_addr consistent;
server 192.168.3.200:22;
}
upstream mysql_proxy {
hash $remote_addr consistent;
server 192.168.3.12:3306;
}
server {
listen 2222;
proxy_connect_timeout 1s;
proxy_timeout 300s;
proxy_pass ssh_proxy;
}
server {
listen 7306;
proxy_connect_timeout 1s;
proxy_timeout 300s;
proxy_pass mysql_proxy;
}
}
[root@node1 nginx]# ssh -p2222 192.168.3.140
The authenticity of host '[192.168.3.140]:2222 ([192.168.3.140]:2222)' can't be established.
ECDSA key fingerprint is cb:38:89:8d:fe:d3:ec:fa:1c:26:4a:cd:ea:dd:64:68.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.3.140]:2222' (ECDSA) to the list of known hosts.
[email protected]'s password:
Last login: Wed May 3 17:25:21 2017 from 192.168.3.140
[root@node2 ~]# ip ad li
1: lo:
mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:fe:67:7c brd ff:ff:ff:ff:ff:ff
inet 192.168.3.200/24 brd 192.168.3.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fefe:677c/64 scope link
valid_lft forever preferred_lft forever