所谓集群是指一组独立的计算机系统构成的一个松耦合的多处理器系统,它们之间通过网络实现进程间的通信,对外表现为一个整体,对外提供相同 的服务。应用程序可以通过网络共享内存进行消息传送,实现分布式计算机。通俗一点来说,就是让若干台计算机联合起来工作(服务),可以是并行的,也可以是做备份。
高性价比,高性能,负载均衡,高可靠,可伸缩性…
当服务器的性能达到瓶颈,我们可以纵向扩展,也就是添加或者替换高性能CPU,添加内存等操作。但是这些随着性能的提升,价格也在提高。并且,始终有一天性能会达到瓶颈,无法满足服务需求。并且,单台服务器负载压力大,同时,无法进满足高可用的需求
集群根据架构功能和结构,主要有三类
动态网站的页面上的信息都必须从数据库中读取,每打开一个页面就读取数据库一次,如果访问网站的人数很多,这会对服务器增加很大的荷载,从而影响这个网站的运行速度。所以,我们可以利用负载均衡集群,降低服务器的负载。
nginx可以充当反向代理服务器实现负载均衡。
当nginx 进程反向代理时,其可以工作在第四层传输层,也可以工作在第七层应用层。
七层反向代理是基于 http,https.mail,等协议代理转发。
四层反向代理是基于 IP + PORT(TCP/UDP)转发
复制http {
....
upstream 服务池名 { #配置后端服务器池,以提供响应数据
server 后端服务器ip:端口
}
server {
locaton {
.......
proxy_pass http://服务池名 #配置将访问请求转发给后端服务器池的服务器处理
}
.....
}
}
复制#需要开启 --with-stream 模块
stream { #和http 在同一级,一般在 http上面设置
upstream 服务池名 {
server 后端服务器ip:端口
}
server {
listen 端口 #代理服务器监听端口,当用户访问这个端口时,就转发给动态web服务器
proxy_pass 服务池名
}
}
http {
......
}
服务端接收来自客户端的请求中,既有动态资源,也有静态资源。静态资源由ngixn提供服务。动态资源由nginx 转发到后端tomcat 服务器。
静态页面一般 有html,htm,css 等路径, 动态页面则一般是jsp ,php 等路径。nginx 在站点的location 中 通过正则,或者 前缀,或者 后缀等方法匹配。当匹配到用户访问路径中有 jsp 时,则转发给后端的处理动态资源的web服务器处理。如果匹配到的路径中有 html 时,则nginx 自己处理。
192.168.23.12 部署tomcat 服务
192.168.23.13 部署tomcat 服务
192.168.23.103 部署nginx 反向代理
复制#host 192.168.23.103 部署nginx
systemctl stop firewalld
setenforce 0
yum -y install pcre pcre-devel zliv-devel openssl-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
cd /opt/
tar -zxvf nginx-1.12.0.tar.gz -C /opt/
cd nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \ # 启用文件修改支持
--with-http_stub_status_module \ #启用状态统计
--with-http_gzip_static_module \ #启用gzip 静态压缩
--with-http_flv_module \ #启用flv 模块,提供对视频的伪流支持
--with-http_ssl_module --with-stream #启用stream 模块,提供4层调度
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
vim /lib/systemd/system/nginx.service
[Util]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx
systemctl enable nginx
netstat -natop | grep :80
复制#192.168.23.12
#192.168.23.13
systemctl stop firewalld
setenforce 0
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/local/jdk1.8.0_91
export JAR_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib/:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
source /etc/profile.d/java.sh
java -version
复制#192.168.23.13
#192.168.23.12
tar zxvf apache-tomcat-9.0.16.tar.gz
mv /opt/apache-tomcat-9.0.16 /usr/local/tomcat
/usr/local/tomcat/bin/startup.sh
netstat -natp | grep java
修改网页页面
复制mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title> #指定为 test1 页面
</head>
<body>
<% out.println("动态页面 1,http://www.test1.com");%>
</body>
</html>
修改xml 文件
复制vim /usr/local/tomcat/conf/server.xml
----- 修改 148行的Host-----
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" >
Context>
#注意,结束的 Host>在文件末尾的倒数第4行
重启tomcat 服务
复制/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
netstat -natp | grep java
复制 mkdir /usr/local/tomcat/webapps/test/
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>
</head>
<body>
<% out.println("动态页面 2,http://www.test1.com");%>
</body>
</html>
复制vim /usr/local/tomcat/conf/server.xml
----- 修改 148行的Host-----
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true">
Context>Context>
复制#准备静态页面和静态图片
echo '这是静态页面
' > /usr/local/nginx/html/index.html
mkdir /usr/local/nginx/html/img
#将静态图片传到该目录
复制
vim /usr/local/nginx/conf/nginx.conf
http {
........
upstream tomcat_server {
server 192.168.23.12:8080 weight=1;
server 192.168.23.13:8080 weight=1;
}
server {
listen 80;
server_name www.mynet.com;
charset utf-8;
#nginx 处理动态页面请求,将.jsp 文件请求转发到tomcat 服务器处理
location ~ .*\.jsp$ {
proxy_pass http://tomcat_server;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#配置nginx 处理静态图片请求
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
root /usr/local/nginx/html/img;
expires 10d;
}
location / {
root html;
index index.html index.htm;
}
......
}
.......
}
复制 location ~ .*\.jsp$ {
proxy_pass http://tomcat_server;
#设置后端web 服务器可以虎丘远程客户端的真实IP
#设定后端的web 服务器 接收到的请求访问的主机名(域名或IP、端口),默认HOST的值为proxy_pass设置的主机名。如果反向代理服务器不重写改请求头的话,那么后端真是服务器在处理时会认为所有的请求都来自反向代理服务器。如果后端有防攻击策略,则反向代理服务器就会被后端封掉
proxy_set_header HOST $host;
#把$remote_addr 赋值给X-Real-IP ,来获取源IP
proxy_set_header X-Real-IP $remote_addr;
#在nginx 作为代理服务器时,设置的IP列表会把经过的机器ip,代理机器ip都记录下来
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
复制firefox http://192.168.23.103 #测试静态页面
firefox http://192.168.23.103/picture.jpg #测试静态图片
firefox http://192.168.23.103/index.jsp #测试动态页面
前提:
nginx 的 4层反向代理,需要 开启 stream 模块. 在 编译安装nginx 时,需要加上 --with-stream 项
3.1 修改主配置文件,实现4 层反向代理
复制cp -p /usr/local/nginx/conf/nginx.conf{,.bak}
cp -p /usr/local/nginx/conf/nginx.conf.default /usr/local/nginx/conf/nginx.conf
vim /usr/local/nginx/conf/nginx.conf
stream {
upstream appserver {
server 192.168.23.12:8080 weight=1;
server 192.168.23.13:8080 weight=2;
}
server {
listen 8080;
proxy_pass appserver;
}
}
重载配置文件并访问测试
复制nginx -s reload
curl http://192.168.23.103:8080
curl http://192.168.23.103:8080
curl http://192.168.23.103:8080
#访问3次,并且每次访问时间要有间隔,因为四层转发有连接保持的效果