一、基本概念
1、什么是集群?
简单的说就是一堆机器做同一件事,www.baidu.com看着就是一个搜索框,背后可能是上万台服务器。
2、为什么企业要用集群?
a、7*24服务,需要多台机器同时工作,互为实时备份
b、高并发访问,需要多台服务器同时提供服务
3、集群特点
a、数据量大,用户多
b、7*24持续服务
c、高并发
d、用户分布广泛,网络情况复杂
4、典型的高可用集群常用开源软件
nginx,haproxy,lvs
下图可以形象的体现出负载均衡在集群中的作用
5、实现nginx负载均衡的组件模块
ngx_http_proxy_module | proxy代理模块,用于把请求后抛给服务器节点或upstream服务器池 |
---|---|
ngx_http_upstream_module | 负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查 |
二、实际操作
在一台机子上安装nginx,安装方法前面博客有写,这里不赘述
1、首先配置负载均衡的配置文件
vim /application/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream backend {
server 192.168.119.174:80 weight=1;#这是两台web的ip,设置权重为1:1
server 192.168.119.178:80 weight=1;
}
upstream 模块 负载均衡池。
backend 负载均衡池名称
server {
listen 80;
server_name www.etiantian.org; 访问这个网站
location / {
proxy_pass http://backend;把请求抛给负载均衡池backend
proxy_set_header Host $host;
}
}
}
默认情况浏览器请求负载均衡器,会携带host字段,但是Nginx代理向后请求节点
默认在请求头里不带host字段。
配置Nginx代理向后请求节点默认在请求头里带host字段配置参数就是www.etiantian.org这个域名:
proxy_set_header Host $host;
然后在两台web主机的www.etiantian.org的网页里标清楚是哪台机子的网页
echo www174>/application/nginx/html/www/index.html
echo www178>/application/nginx/html/www/index.html
而且还要在三台机子上做好ip地址与www.etiantian.org对应的host解析
再在负载均衡机子上进行测试
[root@nginx conf]# for n in {1..6};do curl www.etiantian.org;sleep 1;done
www174
www178
www174
www178
www174
www178
当然也可以在nginx.conf里面再添加blog的访问页面,两台web,停掉一台web服务,还可以访问另外一台web的blog。配置文件如下,在原来的基础上再添加blog标签就行了
server {
listen 80;
server_name www.etiantian.org;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
}
}
server {
listen 80;
server_name blog.etiantian.org;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
}
}
两台web服务都关闭就会出现502错误,坏的网关,后端的服务不可用
2、修改负载均衡IP地址为用户Ip
我们看访问文件可以看到第一列是反向代理服务器的ip,可是我们想看的是哪个用户通过负载均衡访问的服务,所以做如下修改
vim nginx.conf
server {
listen 80;
server_name www.etiantian.org;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;加上这个字段
}
}
这是反向代理时,节点服务器获取用户真实IP的必要功能配置。
在反向代理请求后端节点服务器的请求头中增加获取的客户端IP的字段信息,
然后节点后端可以通过程序或者相关的配置接收X-Forwarded-For传过来的用户真实IP的信息。
然后在web的nginx.conf文件里页面配置上这样的东西
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
以上log_format就是要配置的东西
然后在浏览器访问,再刷新访问日志,就可以看到客户端192.168.119.1的ip了
三、负载均衡算法
1、静态调度算法
和节点无关的调度算法
1、rr轮询(默认调度算法)
按客户端请求顺序把客户端的请求逐一分配到不同的后端节点服务器,宕机的服务器会被自动从节点服务器池中剔除,以使客户端的用户访问不受影响,新的请求会分配给正常的服务器。
2、wrr轮询(权重轮询)
权重值越大,被转发的请求也就越多。可以根据服务器的配置和性能指定权重值大小,有效解决新旧服务器性能不均带来的请求分配问题,在upstream模块里设置weight就可以实现。
3、ip_hash
只要客户端是一个ip就一直访问同一台机器,会导致负载不均,存在的目的是为了解决会话保持。
2、动态调度算法
1、fair(动态调度算法)
根据后端节点服务器的响应时间来分配请求,响应时间短的优先分配。
2、least_conn(最小连接调度算法)
谁的连接数小,谁比较空闲,就把请求给谁。
3、url_hash算法
同一个url地址访问同一台机器,和ip_hash挺像的。缺点是后面的缓存服务器节点不能宕机,宕机了数据就会乱
4、一致性hash算法
解决上述url_hash算法缓存服务器节点宕机的问题
四、动静分离原理
通过nginx反向代理配置规则实现让动态资源和静态资源及其他业务分别由不同的服务器解析,以解决网站性能,安全,用户体验等重要问题。
下图为动静分离网站集群架构
1、基于路径实现动静分离
域名不变,实现上述图片的动静分离
1、首先在nginx负载均衡器上做如下操作
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream static_pools {
server 192.168.119.174:80 weight=1;
}
upstream upload_pools {
server 192.168.119.178:80 weight=1;
}
upstream default_pools { 默认动态服务器
server 192.168.119.180:80 weight=1;
}
server {
listen 80;
server_name www.etiantian.org;
location /static/ {
proxy_pass http://static_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
location /upload/ {
proxy_pass http://upload_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
location / { 默认动态服务器找这里
proxy_pass http://default_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
}
2、然后在三台web机子上做修改
174的机子做的是静态的,所以在它网页上写入静态数据
[root@web01 html]# cd /application/nginx/html/www/
[root@web01 www]# ls
index.html
[root@web01 www]# mkdir static
[root@web01 www]# cd static/
[root@web01 static]# ls
index.html
[root@web01 static]# echo "static" > index.html
[root@web01 static]# cat index.html
static
[root@web01 static]# nginx -t
nginx: the configuration file /application/nginx-1.16.1//conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.16.1//conf/nginx.conf test is successful
[root@web01 static]# nginx -s reload
178的机子做的是上传服务
[root@web02 ~]# cd /application/nginx/html/www/
[root@web02 www]# ls
index.html
[root@web02 www]# mkdir upload
[root@web02 www]# echo "upload" > upload/index.html
[root@web02 www]# ls
index.html upload
[root@web02 www]# cd upload/
[root@web02 upload]# ls
index.html
[root@web02 upload]# cat index.html
upload
因为我们只有两台机子,但第三个机子做的是动态服务,所以我先临时给它加了一个180的IP地址
[root@web02 upload]# ifconfig ens33:180 192.168.119.180/24 up
[root@web02 upload]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.119.178 netmask 255.255.255.0 broadcast 192.168.119.255
ens33:180: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.119.180 netmask 255.255.255.0 broadcast 192.168.119.255
[root@web02 upload]# cd /application/nginx/conf/extra/
[root@web02 extra]# ls
01_www.conf 02_bbs.conf 03_blog.conf
[root@web02 extra]# vim 01_www.conf
server {
listen 192.168.119.178:80;
server_name www.etiantian.org;
location / {
root html/www;
index index.html index.htm;
}
}
server {
listen 192.168.119.180:80; 添加一个180的server标签,然后创目录,加内容
server_name www.etiantian.org;
location / {
root html/www180;
index index.html index.htm;
}
}
[root@web02 extra]# cd ..
[root@web02 nginx]# ls
client_body_temp fastcgi_temp logs proxy_temp scgi_temp
conf html nginx-1.16.0 sbin uwsgi_temp
[root@web02 nginx]# cd html/
[root@web02 html]# ls
50x.html bbs blog index.html www
[root@web02 html]# mkdir www180
[root@web02 html]# cd www180/
[root@web02 www180]# ls
[root@web02 www180]# echo "www180" > index.html
[root@web02 www180]# echo "www180" > oldboy.html
[root@web02 www180]# mkdir new
[root@web02 www180]# echo "180" >new/index.html
[root@web02 www180]# ls
index.html new oldboy.html
[root@web02 www180]# cat oldboy.html
www180
[root@web02 www180]# cat index.html
www180
[root@web02 www180]# cd new/
[root@web02 new]# cat index.html
180
[root@web02 new]# nginx -t
nginx: the configuration file /application/nginx-1.16.0//conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.16.0//conf/nginx.conf test is successful
[root@web02 new]# nginx -s reload
然后在windows的hosts文件里做好nginx负载均衡器与www.etiantian.org的对应关系后,开始访问!
基于路径的动静分离成功!