Nginx
1. nginx简介
(1)、Nginx是什么?
Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
(2)、发布版本时间
第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
(3)、Nginx开发者
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发。
(4)、特点
占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用
(5)、户有
新浪、网易、腾讯等。
(6)、功能
web服务器、web reverse proxy、smtp reverse proxy
2. nginx安装
1、依赖
gcc openssl-devel pcre-devel zlib-devel
安装:yum install gcc openssl-devel pcre-devel zlib-devel
|
2、创建用户和用户组。
为了方便nginx运行而不影响linux安全
创建组:groupadd -r nginx
创建用户:useradd -r -g nginx -M nginx
-M 表示不创建用户的家目录。
|
3、解压tengine
tar zxvf tengine*.tar.gz
|
4、进入解压目录
编译 ./configure --prefix=/usr/tengine(如果不指定就默认local下)
注释:
(1)、configure是一个可执行脚本,它有很多选项,在待安装的源码路径下使用命令./configure –help输出详细的选项列表。其中--prefix选项是配置安装的路径,如果不配置该选项,安装后可执行文件默认放在/usr /local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc,其它的资源文件放在/usr /local/share,比较凌乱。
(2)、如果配置--prefix,如:./configure --prefix=/usr/local/test,可以把所有资源文件放在/usr/local/test的路径中,不会杂乱。用了—prefix选项的另一个好处是卸载软件或移植软件。当某个安装的软件不再需要时,只须简单的删除该安装目录,就可以把软件卸载得干干净净;移植软件只需拷贝整个目录到另外一个机器即可(相同的操作系统)。
(3)、当然要卸载程序,也可以在原来的make目录下用一次make uninstall,但前提是make文件指定过uninstall。
5、安装(编译并安装)
make && make install
6、启动
进入安装文件路径 cd /usr/tengine/sbin中启动
./nginx
killall nginx 是杀掉所有nginx进程
|
7、配置Nginx为系统服务,以方便管理
(1)、在/etc/rc.d/init.d/目录中建立文本文件nginx
(2)、在文件中粘贴nginx.txt文件的内容:必须vim nginx手动粘贴
|
8、修改nginx文件的执行权限
chmod +x nginx
|
9、添加该文件到系统服务中去
chkconfig --add nginx
查看是否添加成功
chkconfig --list nginx
启动,停止,重新装载
service nginx start|stop
设置终端模式开机启动:
chkconfig nginx on
注意:在nginx配置中
nginx="/usr/tengine/sbin/nginx",NGINX_CONF_FILE="/usr/tengine/conf/nginx.conf"
这两个路径一定是安装目录的路径
./configure --prefix=/usr/tengine
10、重新加载配置文件命令
service nginx reload
3. nginx配置
1、进入nginx目录下的conf
2、打开nginx.conf
|
3、nginx.conf配置详情
(1)、#运行用户
user nobody;
(2)、#启动进程
通常设置成和cpu(核心)的数量相等
worker_processes 1;
也可以设置为worker_processes auto,但是只在tengine中有,nginx没有。
(3)、#全局错误日志及PID文件
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
(4)、#工作模式及连接数上限
events {
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,
#仅用于linux2.6以上内核,可以大大提高nginx的性能
use epoll;
#单个后台worker process进程的最大并发链接数
worker_connections 1024;
# 并发总数是 worker_processes 和 worker_connections 的乘积
# 即 max_clients = worker_processes * worker_connections
# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么
# 为什么上面反向代理要除以4,应该说是一个经验值
# 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
# worker_connections 值的设置跟物理内存大小有关
# 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
# 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
# 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
# $ cat /proc/sys/fs/file-max
# 输出 34336
# 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
# 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
# 使得并发总数小于操作系统可以打开的最大文件数目
# 其实质也就是根据主机的物理CPU和内存进行配置
# 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
# ulimit -SHn 65535
}
(5)、http {
#设定mime类型,类型由mime.type文件定义
include 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 logs/access.log main;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#tcp_nopush on;
#连接超时时间
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
#开启gzip压缩
gzip on;
gzip_disable "MSIE [1-6].";
#设定请求缓冲
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
(6)、 #设定虚拟主机配置
一个server代表一个虚拟主机
server {
#侦听80端口
listen 80;
#定义使用 www.nginx.cn访问
server_name www.nginx.cn;
#定义服务器的默认网站根目录位置
root html;
#设定本虚拟主机的访问日志
access_log logs/nginx.access.log main;
#默认请求
location / {
#定义首页索引文件的名称
index index.php index.html index.htm;
}
# 定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
#静态文件,nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
#过期30天,静态文件不怎么更新,过期可以设大一点,
#如果频繁更新,则可以设置得小一点。
expires 30d;
}
#PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#禁止访问 .htxxx 文件
location ~ /.ht {
deny all;
}
}
}
htttp{
server{
#表示一个虚拟主机
}
}
(7)、location 映射
location [ = | ~ | ~* | ^~ ] uri { ... }
location URI {}:
对当前路径及子路径下的所有对象都生效;
location = URI {}: 必须执行一个具体文件路径(不能使用目录)
精确匹配指定的路径,不包括子路径,因此,只对当前资源生效;
location ~ URI {}:
location ~* URI {}:
模式匹配URI,此处的URI可使用正则表达式,~区分字符大小写,~*不区分字符大小写;
location ^~ URI {}:
不使用正则表达式
优先级:= > ^~ > ~|~* > /|/dir/
1)、创建html
2)、配置location
3)、浏览器访问
4)、
为什么不是http://192.168.239.141/test/opt/test1.html
因为location配置的是 /test/自动去找opt目录下的test1.html
|
(8)、访问控制
IP访问控制
location {
deny IP /IP段
deny 192.168.1.109;
allow 192.168.1.0/24;
}
|
(9)、用户认证访问(需要输入用户名和密码)
一、模块ngx_http_auth_basic_module 允许使用“HTTP基本认证”协议验证用户名和密码来限制对资源的访问。
location / {
auth_basic "closed site";
auth_basic_user_file /var/users;
}
二、Apache发行包中的htpasswd命令来创建user_file 文件
htpasswd -c -m /var/users username
1)、安装httpd
2)、添加用户和密码格式
创建用户名zs 、密码123456
3)进入配置文件nginx.conf添加localtion
4)、退出后重新加载
5)浏览器访问,这时会要求输入用户名和密码
|
(10)、autoindex 在浏览器中列出当前目录的文件索引
1)、autoindex on;
退出重启
效果
2)、启用访问状态模块
location /status{
stub_status on;
}
|
4. 动静分离配置
1、Apache 和 nginx(web服务器)
(1)、多台集群机器联合处理一个任务。
(2)、一台机器处理不同的多个任务。
特点:
处理静态数据速度快(自动html静态数据的缓存)
并发数一般要比J2EE服务器要高。
|
2、搭建tomcat集群和动静分离
(1)、上传tomcat进行解压
tomcat直接解压就可使用了
如果觉得名字太长可以重新命名
(2)、进入tomcat1目录下的ROOT创建
添加
|
(3)、在复制一个tomcat,作为tomcat2
修改ROOT下的test1.jsp,标识一个信息为tomcat2,方便看效果
(4)、修改tomcat2的修改端口号
因为两个tomcat端口不能一样
进入conf
修改
(5)、分别启动tomcat1、tomcat2
启动tomcat1
查看是否启动成功
如下代表启动成功
tomcat2启动方式和tomcat1一样,在此略
查看进程可以直接查java,因为tomcat也是java程序
(6)、启动nginx
(7)、进入 opt/test/下
上传一张图片作为静态资源
cp ~/1.jpg . 拷贝根目录root下的1.jpg到当前目录
温馨提示linux命令:4 yy -p 从当前光标开始复制4行
(8)、进入nginx.conf配置
添加tomcat集群组,upstream backend 意思是允许定义一组服务器(集群)
其中weight代表权重,就是并发量多的时候分配的优先级,数字一样代表相同
|
(9)、分别进入tomcat1,tomcat2
添加图片
(10)、退出重新加载nignx配置文件
(11)、测试效果
图片是静态访问的,tomcat字体是动态的,实现了tomcat集群动态分离
(12)、测试2
其实tomcat就是java进程,以下命令查找可以查询出tomcat进行
杀掉一个tomcat进行,保留一个,在浏览器访问这时候只有一个tomcat服务
5. session共享
1、原理图
https://blog.csdn.net/u010651369/article/details/72899524
用户通过浏览器访问,经过服务器nginx服务请求,把随机分配给tomcat集群处理,在这过程中会产生数据不一致,例如
登录功能(在tomcat1服务器上已经登录,但是刷新之后又可能随机在tomcat2上服务,tomcat上由于没有用户账号密码
的session,会判断用户没有登录,但是用户已经在tomcat1登录了,这样会造成用户体验出问题),所以为了保证session
一致,搭建session缓存服务器,当用户第一次访问tomcat1时候将session写入session缓存服务器,用户再次访问时候去
session服务器中读取session判断是否已经登录,两台tomcat为了保证取到的是同一份session数据,主要是通过sessoinId
,如果两个sessionId是一样就取同一个session值。
sessionId的生命周期:
当 session.setAttribute("data", "孤傲苍狼");
-->就会在服务器端产生了sessionId
-->服务器端并响应数据(包括sessionId)返回给客户端
-->客户端把返回的数据保存cookie中
-->客户端再次请求时也会把cookie中的数据发送给服务器
-->服务器发现sessionId一致(拿不到新的session),判断出还处于一次会话中
注:sessionId在客户端和服务端之间流转
|
2、搭建session服务器
(memcached 缓存服务)和修改tomcat配置
(1)、连接session缓存服务器
修改sessoin缓存服务器yum源,并删除
进入session缓存服务器/etc/yum.repos.d/
远程复制tomcat集群下的服务器/etc/yum.repos.d/*.repo
|
(2)、删除掉epel.repo,并创建 vi my.repo
添加
保存退出后
|
(3)、安装memcached
安装成功后启动服务
永久关闭防火墙
|
(4)、将以下jar分别拷贝到tomcat1、tomcat2的lib目录下
|
(5)、配置tomcat,每个tomcat里面的context.xml中加入:
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.197.128:11211"
sticky="false"
lockingMode="auto"
sessionBackupAsync="false"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
sessionBackupTimeout="1000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
|
|
(6)、验证是否实现了session共享
进入tomcat1、tomcat2的ROOT下
分别添加以下代码
退出启动,查看是否启动成功
|
浏览器端
经常容易出错
注意:如果两个服务器(session缓存服务器,tomcat服务器)相差时间只能是3到4s,
如果两台tomcat不在同一台机器上必须保证时间一致,因为sessionId是根据MD5算法通过系统时间来计算的
6. 健康检查
1、健康检查配置
进入tengine的nginx.conf文件
添加健康检查动作
#gzip on;
upstream my_servers {
server localhost:8080 weight=5;
server localhost:8081 weight=5;
check interval=3000 rise=2 fall=2 timeout=1000 type=http;
check_http_send "HEAD /check.jsp HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
|
2、添加健康检查状态页面
location /status {
check_status;
access_log off;
}
|
3、保存退出后,在tomcat服务器添加检查状态页面
|
4、健康检查结果,浏览器端
7. 动态网页静态化
1、使用nginx完成SEO中的,动态网页静态化。
http://192.168.239.3/test.action?id=1
http://192.168.239.3/test.action?id=2
http://192.168.239.3/test.action?id=3
8. 反向代理
1、反向代理含义
(1)、反向代理:反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,简单来说就是真实的服务器不能直接被外部网络访问,想要访问必须通过代理。
(2)、反向代理的主要作用是分发请求。
(3)、反向代理的工作流程:
1)、用户通过域名发出访问请求,该域名被解析为反向代理服务器的IP地址;
2)、反向代理服务器接收用户的请求;
3)、反向代理服务器在本地缓存查找是否存在当前用户所请求的内容,找到则直接把内容返回给用户;
4)、如果本地没有用户请求的内容,反向代理服务器会以自己的身份去后端服务器请求同样的信息内容,并把信息内容发给用户,如果信息内容是可以被缓存的,则会将该内容缓存在代理服务器的本地缓存中。
(4)、反向代理的好处:
1)、解决了网站服务器对外可见的问题,提高了网站服务器的安全性;
2)、节约了有限的IP地址资源,后端服务器均可使用私有IP地址与代理服务器进行通信;
3)、加速了网站的访问速度,减轻了真是web服务器的负荷
(5)、正向代理:意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),
然后代理向原始服务器转交请求并将获得的内容返回给客户端。
|
2、操作步骤
(1)、在nginx.conf配置文件http下面添加属性
upstream 名字 {
server IP:PORT;
server IP:PORT;
}
说明:表示两个服务器的负载以那个响应速度快的优先承担upstream转发来的请求,起到了路径从速的负载作用,逻辑上实现了地区就近负载的功效
|
(2)、对Tengine的nginx.conf进行编辑
location / {
proxy_pass http://名字;
}
比如:
location /forum/ {
proxy_pass http://192.168.80.11:8080/bbs/;
}
|
(3)、退出重新启动tomcat,tengine
|
(4)、打开浏览器,输入URL进行查看
使用F5不断地刷新浏览器—–刷新三下,显示两次tomcat1,显示一次tomcat2
|
(5)、改变反向代理时,apache记录的日志
httpd.conf
LogFormat %{X-Real_IP}i
|
9. tengine集群
1、为什么要搭建tengine集群
因为tomcat是多台,在客户访问量过大的时候单个tengine服务器就回出现瓶颈了,为了解决这个问题搭建tengine集群
,这两台tengine集群完全一样,在工作的叫master,当master挂了之后,backup立即起作用,但是这个过程就引发了ip
问题,为了解决这个问题使用vip(虚拟ip),当一台tengine挂掉之后,vip会漂移到另一台。如果在配置多台tengine只需
要绑定 一台vip就可以了。
方法:Keepalived : 提供高可用,vrrp协议,实现IP的漂移
Zookeeper:选举、心跳机制提供接管
|
|
2、Keepalived 原理 - IP漂移
(1)、IP漂移
针对的是VIP 集群正常运作的情况下,服务器上有DIP、VIP(客户端访问的是VIP),VIP绑定在DR Master上,
当这台服务器挂掉之后,IP漂移到DR Backup上, 是对哪个IP进行漂移?? -- VIP
也就是说当Master挂掉,VIP马上切换 绑定到Backup上
除此之外、Keepalived还对后端的服务器进行监控,并且可以发邮件给你、当你的集群出现问题的时候(rs宕机)
Keepalived除了对LVS做高可用, 还可对Nginx 应用服务器。。做高可用
##zookeeper 性能更好
##zookeeper VS Keepalived
Keepalived进行ip漂移的过程中进行主机检测,中间会有时间空隔
zookeeper处理机制是 在你请求后端服务器之前会先进行选举 然后选择后端服务器。。。
|
3、怎么新建新的网络接口
(1)、添加一个新的网络接口
(2)、ping ip看是否可以访问
(3)、去掉网络接口
|
4、tengine集群配置和vip
(1)、准备两台tengine服务器(big_data02,linux02),分别安装keepalived
操作big_data02服务器
若产生错误,解决办法,如果勾选不生效,重启一下
|
(2)、修改big_data02服务器的tengine配置文件
改为本机的ip
(3)、将big_data2的tengine配置文件拷贝给第二台linux02
在big_data2输入
linux02服务器(先安装tengine)也按照安装keepalived(1步骤),不用修改nginx配置文件
|
(4)、big_data02服务器进入keepalived目录下
vi keepalived.conf
修改vip
|
(5)、curl
输入,命令窗口会多了200
(6)、新建脚本
添加
修改tengine配置文件
重新加载tengine,启动脚本
同样原理,把check_nginx.sh添加到linux02服务器的/home下(第二台tengine)
|
(7)、在big_data02下
进入
添加
退出添加权限
第二台也是同样的配置
第二台keepalived配置文件改为
|
(8)、启动步骤
先启动master主服务器,后启动backup副服务器
1)、关闭两台tengine服务器防火墙
2)、启动sessoin共享服务器
3)、启动big_data2服务器的tomcat
4)、启动keepalived
如果tengine没有开就会显示
查看日志
5)、重复(3)--(4)步骤启动linux02(第二台tengine)
6)、浏览器访问
一开始只有一台tengine有vip,停掉一台tengine,在浏览器再次访问,在shell可以看到停掉的这一台已经没有vip了,但是任然可以访问,因为vip漂移到了第二台tengine服务器
|
5、以上安装文档描述
两台tengine主机 安装Keepalived
yum install keepalived
** rpm -ql keepalived 查看安装目录
** man Keepalived 查看文档
**查看配置的帮助手册
man keepalived.conf
看着文档修改/etc/keepalived/keepalived.conf配置文件
##配置邮件提醒
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
##IP漂移设置
vrrp_instance VI_1 {
state MASTER #指定Keepalived的角色,MASTER为主,BACKUP为备
interface eth0 #绑定的vip
virtual_router_id 51 #虚拟路由编号,主备要一致
priority 100 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
advert_int 1 #检查间隔,默认为1s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.183.200/24 dev eth0 label eth0:1 #定义虚拟IP(VIP)为192.168.2.33,可多设,每行一个 可以为多个服务高可用 我们现在只对LVS
格式: ip地址/网络段 brd广播地址 dev网络设备(eth0网卡) label别名
}
}
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.183.200 80 { 如果对数据库。。做高可用 端口。。
delay_loop 6 # 设置健康检查时间,单位是秒
lb_algo wrr # 设置负载调度的算法为wlc
lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
nat_mask 255.255.255.0
persistence_timeout 50 #会话保持
protocol TCP
real_server 192.168.183.111 80 { # 指定real server1的IP地址
weight 3 # 配置节点权值,数字越大权重越高
HTTP_CHECK { #健康检查 选择HTTP_CHECK
url {
path /index.html #健康检查地址
#digest 返回结果
status_code 200 #状态码
}
connect_timeout 3 连接超时时间
nb_get_retry 3 #允许尝试3次
delay_before_retry 3 #检查时间间隔
}
}
real_server 192.168.183.112 80 { # 指定real server2的IP地址
weight 3 # 配置节点权值,数字越大权重越高
HTTP_CHECK { #健康检查 选择HTTP_CHECK
url {
path /index.html #健康检查地址
#digest 返回结果
status_code 200 #状态码
}
connect_timeout 3 连接超时时间
nb_get_retry 3 #允许尝试3次
delay_before_retry 3 #检查时间间隔
}
}
}
##备用的主机 Keepalived
**拷贝配置文件过去 scp /etc/keepalived/keepalived.conf ...
##修改 只需要修改下边的配置
vrrp_instance VI_1 {
state BACKUP #指定Keepalived的角色,MASTER为主,BACKUP为备
priority 50 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
}
##启动Keepalived service keepalived start
查看IP地址 ifconfig
帮我们绑定了ip地址 eth0:1
ipvsadm -Ln 帮我们启动了realserver
停掉第一台主机 init 6
查看第二台主机 ifconfig 出现了eth0:1
ipvsadm
查看页面效果
启动第一天Keepalived
ifconfig 出现了eth0:1
ipvsadm 第一台重新接管了
mail 查看邮件
10. lvs(linux虚拟服务器)
1、lvs(linux虚拟服务器)的作用
用户发送请求到达nginx,nginx与tomcat之间进行数据响应,在此过程中会影响nginx服务器,如果是文件下载响应
文件流,所有的响应文件流都由tomcat响应给nginx,在此过程中进行数据响应流太频繁会到达IO的瓶颈,IO会造成
阻塞,所以在此使用lvs解决,lvs会将数据直接发送给客户端,LVS解决了前端服务器访问IO/网络瓶颈问题
LVS官网 http://www.linuxvirtualserver.org/Documents.html
|
2、原理
CIP:客户端ip,VIP虚拟iP,DIP转发ip,RIP真是ip
注意:如果没有保证VIP是隐藏的会造成ip冲突
LVS 组成 :lvs && ipvsadm
|
3、负载均衡实现方式
1、硬件服务器 F5 - 看ZOL报价
2、软件LVS
|
4、调度算法
1、静态
rr:轮循、wrr:、dh: 、sh:
2、动态
lc: 最少连接、 wlc: 加权最少连接、sed: 最短期望延迟、nq: never queue、LBLC: 基于本地的最少连接
DH: 、LBLCR: 基于本地的带复制功能的最少连接、默认方法:wlc
|
5、LVS模式、看官网
三种类型:NAT、DR - 重点、TUN
|
6、IP:
VIP: 虚拟服务器地址、DIP: 转发的网络地址、RIP: 后端真实主机(后端服务器)、CIP: 客户端IP地址
|
7、NAT
Network Address Translation 网络地址转换(将内部地址转化为Internets上可用的外部地址)
工作原理:
报文头(目标地址、源地址和端口等)被正确改写后,客户相信它们连接一个IP地址,
而不同IP地址的服务器组也认为它们是与客户直接相连的。
由此,可以用NAT方法将不同IP地址的并行网络服务变成在一个IP地址上的一个虚拟服务。
看图:
客户端通过虚拟服务器ip(virtul ipaddress)访问网络服务,发送请求到调度器服务器,调度器根据一些调度算法()从真实的服务器集群中,选取一台服务器作为请求响应的服务器,并将客户端发来的请求中报文的目标地址virtual ip address改写为选定的服务器的ip地址、报文的目标端口改写成选定服务器的相应端口,由该服务器响应客户端发来的请求,当响应请求处理完成之后,服务器还是将响应数据发送给调度器服务器(前端服务器),调度器再重写报文,将响应返回给客户端。。。
问题:
处理流程上跟Nginx基本类似,调度器服务器(前端服务器)的高负载、单点故障问题还是存在的。。。(真实服务器10-20之间,负载调度器成为限制集群系统的瓶颈)
|
8、TUN IP隧道
工作原理:
将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。
IP隧道技术亦称为IP封装技术(IP encapsulation)。IP隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),
在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。
看图:
request --virtual ipaddress--> | load balancer linux box | === IP TUNNEL ===> | real server
连接调度和管理与VS/NAT中的一样,只是它的报文转发方法不同。调度器根据各个服务器的负载情况,动态地选择一台服务器,将请求报文封装在另一个IP报文中,
再将封装后的IP报文转发给选出的服务器;服务器收到报文后,先将报文解封获得原来目标地址为 VIP的报文,服务器发现VIP地址被配置在本地的IP隧道设备上,
所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。
适用场景:
性能肯定要高于NET模式,但是它内部处理很复杂,性能上不如另外一种也是我们主要要介绍的DR模式
IP TUN模式主要超大型网站,需要跨网段、跨域场景,像一些全球性的互联网网站
|
9、DR 直接路由 Direct Routing
工作原理:
跟TUN方法相同,DR利用大多数Internet服务的非对称特点,负载调度器中只负责调度请求,而真实服务器直接将响应返回给客户,从而极大地提高整个集群系统的吞吐量。
看图:
request --virtual ipaddress--> | load balancer linux box | === Internal Network 内网 ===> | real server
调度服务器和服务器集群 必须要有一个网卡 使他们在同一个局域网段内 - ARP/RARP是作用于局域网内的协议
工作流程:
连接调度和管理的方式与NAT、TUN是相同的,报文转发有所差别:
由调度器的负载均衡算法选择出响应的服务器,报文不做任何修改直接发送给后端真实的服务器处理,
那么我们的报文中请求和响应报文的vip自始至终都是不变的,当客户端接受到响应时会发现一切正常,他不会知道具体我们哪台服务器处理的。。。
(网络通信,使用IP进行通信的,但是硬件底层只能识别mac地址,因为设备传输之间会通过ARP和RARP协议将ip与mac之间进行相互的解析)
(网络七层协议:7应用层 6表示层 5会话层 4传输层 3网络层 2数据链路层 1物理层 | ARP、RARP属于数据链路层 - 它介乎于物理层和网络层之间,为网络层提供服务:
其中一项主要的服务就是 - 将数据组合成数据块,在数据链路层中称这种数据块为帧)
DR模式 转发报文的过程中 就是将数据帧的MAC地址改为调度器选出真实服务器的MAC地址,再把修改后的数据帧发送到服务器集群的局域网内
此时,因为这个MAC地址是集群里真实服务器的MAC地址,所以服务器肯定可以接收到这个数据帧,从中可以拿到相对应的IP报文。
|
10、三种模式比较
(1)、NET模式 伸缩能力太差,服务器节点增多以后,调度器负载压力瓶颈
(2)、TUN模式 可以处理超大数量级别的请求 但是太大了 适合于构建 高性能的超级服务器
(3)、DR模式 与NET相比,伸缩性很好,便于服务器集群的扩张;使用以及性能上 不像TUN那么庞杂
-- 重点。。。(但是LVS只有超大并发量的网站才会使用到,可能大部分人以后都不会遇到)
|
11、Lvs DR(转发)模式集群步骤
(准备三台服务器,两台分别装有tomcat,另一台作为lvs服务器,在这里叫linux1、linux2(这两台作为tomcat服务器)、linux3作为lvs服务器)
(1)、找一台主机作为DR(虚拟服务器),linux03安装ipvsadm
yum install ipvsadm
进入network-scripts目录
在DR设置两个IP地址:
a)DIP: 192.168.1.134 ,设置静态ID(在这里暂时不操作)
b)VIP:192.168.239.200 , ifconfig eth0:1 192.168.239.200/24
网盘,一个网盘可以对应多个ip
|
(2)、找多台机器作为RS( apeche或者tomcat ),这里使用linux1、linux2
修改报文源IP的设置,需要设置内核参数
在此用tomcat所在的服务器作为RS,在两台tomcat服务器上输入以下命令
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
在两台机器(RS)上,设置网卡的别名IP:192.168.1.200
ifconfig lo:0 192.168.239.100 netmask 255.255.255.255 broadcast 192.168.239.100
输入ifconfig
验证是否成功,在windows的cmd下
在两台机器(RS)上,添加一个路由
route add -host 192.169.239.200 dev lo:0
如果另一台RS服务器没有tomcat,那么将含有一台tomcat的服务器拷贝给它
拷贝jdk
进入bash_profile
修改配置文件
重新加载配置文件
两台tomcat都修改为80端口
|
在lvs服务器上使用ipvsadm添加集群服务
a)、ipvsadm -C 清空原来的设置
b)、ipvsadm -A -t 192.168.239.100:80 -s wlc
c)、ipvsadm -a -t 192.168.239.100:80 -r 192.168.1.111 -g -w 1
d)、ipvsadm -a -t 192.168.239.100:80 -r 192.168.1.112 -g -w 1
|
设置三台机器统一时间
|
浏览器端输入
11. Ipvsadm命令
1、管理集群服务
添加:-A -t|u|f service-address [-s scheduler]
-t: TCP协议的集群
-u: UDP协议的集群
service-address: IP:PORT
-f: FWM: 防火墙标记
service-address: Mark Number
修改:-E
删除:-D -t|u|f service-address
# ipvsadm -A -t 172.16.100.1:80 -s rr
2、管理集群服务中的RS
添加:-a -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-t|u|f service-address:事先定义好的某集群服务
-r server-address: 某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射;
[-g|i|m]: LVS类型
-g: DR、-i: TUN、-m: NAT
[-w weight]: 定义服务器权重
修改:-e
删除:-d -t|u|f service-address -r server-address
# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 –g
# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.9 -g
查看
-L|l
-n: 数字格式显示主机地址和端口
--stats:统计数据
--rate: 速率
--timeout: 显示tcp、tcpfin和udp的会话超时时长
-c: 显示当前的ipvs连接状况
删除所有集群服务
-C:清空ipvs规则
保存规则
-S
# ipvsadm -S > /path/to/somefile
载入此前的规则:
-R
# ipvsadm -R < /path/form/somefile
12. 名词理解
(1)、高并发:
在一个时间段内大量的线程访问,解决集群,但是引发Session共享,解决Session共享mencach
(2)、集群:
多台服务器运行,它们构成了一个组,并以单一系统的模式加以管理。
(3)、负载均衡:
对系统中的负载情况进行动态调整,减少系统中各节点负载不均衡的现象。
(4)、高可用:
当一台服务器挂了之后,另一台服务器立即作用