一、Nginx负载均衡:
1.概述:
Nginx是一款http服务器软件,支持高达50000个并发连接数的响应。
(1)拥有强大的处理静态资源的能力。
(2)运行稳定。
(3)CPU,内存等资源消耗低。
2.负载均衡实现原理:
(1)通过反向代理实现
(2)反向代理原理:指以代理服务器来接收客户端的请求,然后将请求转发到内部网络的服务器上。将服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。对于客户端来说,反向代理服务器相当于目标服务器,只需将反向代理当作目标服务器一样发送请求即可,且客户端不需要进行任何设置。
-
正向代理:位于客户端和目标服务器之间的代理服务器,为了从目标服务器获得内容,客户端向代理服务器发送一个请求并指定目标服务器,然后代理服务器向目标服务器转交请求并获得内容,然后返回客户端。
-
正向代理的作用:
-
- 突破访问权限,通过代理服务器,可突破自身IP的访问限制,访问外网等。
- 提高访问速度,代理服务器会设置硬盘缓冲区,并保存部分响应请求,当其他用户再访问相同信息时,由缓冲区传给用户信息,以提高访问速度。
- 隐藏客户端真实IP。
-
反向代理作用:
-
- 负载均衡,根据所有真实服务器负载情况,将客户端请求发到不同的真实服务器上。
- 提高访问速度反向代理服务器可以对于静态内容及短时间内有大量访问请求的动态内容提供缓存服务,提高访问速度。
- 提供安全保障,反向代理服务器可以作为应用层防火墙,为网站提供对基于Web的攻击行为(例如DoS/DDoS)的防护,更容易排查恶意软件等。还可以为后端服务器统一提供加密和SSL加速(如SSL终端代理),提供HTTP访问认证等。
3.Nginx静态处理优势:
(1)动静分离原理:服务端接收客户端的请求中,既有静态资源,也有动态资源,静态资源由nginx提供服务,动态资源由nginx转发至后端。
(2)静态处理优势:
- 处理静态页面的效率远高于tomcat的处理能力
- 若tomcat请求量为1000次,则nginx为6000次
- tomcat吞吐量为0.6M/s,nginx为3.6M/s
- nginx处理静态能力是tomcat的6倍
二、实验:
1.部署虚拟机192.168.174.15(两个tomcat已部署完)
(1)关闭防火墙,安全机制:
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
(2)安装环境
1.先安装jdk
2.安装 tomcat
cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat
cp -a /usr/local/tomcat /usr/local/tomcat1
3.部署环境变量
vim /etc/profile.d/tomcat.sh
#tomcat1
export CATALINA_HOME1=/usr/local/tomcat
export CATALINA_BASE1=/usr/local/tomcat
export TOMCAT_HOME1=/usr/local/tomcat
#tomcat2
export CATALINA_HOME2=/usr/local/tomcat1
export CATALINA_BASE2=/usr/local/tomcat1
export TOMCAT_HOME2=/usr/local/tomcat1
source /etc/profile.d/tomcat.sh
(3)修改 tomcat1 中的 server.xml 文件,要求各 tomcat 实例配置不能有重复的端口号:
vim /usr/local/tomcat1/conf/server.xml
<Server port="8006" shutdown="SHUTDOWN"> #22行,修改Server prot,默认为8005 -> 修改为8006
<Connector port="8081" protocol="HTTP/1.1" #69行,修改Connector port,HTTP/1.1 默认为8080 -> 修改为8081
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" /> #116行,修改Connector port AJP/1.3,默认为8009 -> 修改为8010
修改各 tomcat和tomcat1 实例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 环境变量
vim /usr/local/tomcat/bin/startup.sh
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
##添加以下内容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1
vim /usr/local/tomcat/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1
修改tomcat1
vim /usr/local/tomcat1/bin/startup.sh
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2
vim /usr/local/tomcat1/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2
(4)启动各 tomcat 中的 /bin/startup.sh
/usr/local/tomcat/bin/startup.sh
/usr/local/tomcat1/bin/startup.sh
etstat -antp | grep java
tcp6 0 0 :::8080 :::* LISTEN 7316/java
tcp6 0 0 :::8081 :::* LISTEN 7372/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 7316/java
tcp6 0 0 127.0.0.1:8006 :::* LISTEN 7372/java
tcp6 0 0 :::8009 :::* LISTEN 7316/java
tcp6 0 0 :::8010 :::* LISTEN 7372/java
(5)Tomcat server 配置
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> #指定为 test2 页面
</head>
<body>
<% out.println("动态页面 2,http://www.test2.com");%>
</body>
</html>
vim /usr/local/tomcat/conf/server.xml
#删除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true" />
</Host>
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
mkdir /usr/local/tomcat1/webapps/test
vim /usr/local/tomcat1/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test3 page</title> #指定为 test3 页面
</head>
<body>
<% out.println("动态页面 3,http://www.test3.com");%>
</body>
</html>
vim /usr/local/tomcat1/conf/server.xml
#删除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/tomcat2/webapps/test" path="" reloadable="true" />
</Host>
/usr/local/tomcat1/bin/shutdown.sh
/usr/local/tomcat1/bin/startup.sh
2. 部署虚拟机192.168.174.17(第三个tomcat已开启)
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
1.关闭防火墙,将安装 Tomcat 所需软件包传到/opt目录下
jdk-8u201-linux-x64.rpm
apache-tomcat-9.0.16.tar.gz
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2.安装jdk
cd /opt
rpm -qpl jdk-8u201-linux-x64.rpm
rpm -ivh jdk-8u201-linux-x64.rpm
java -version
3.设置JDK环境变量
vim /ect/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
suorce /etc/profile.d/java.sh
java -version
/etc/profile
4.安装启动Tomcat
cd /opt
tar zcvf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat
##启动tomcat ##
#后台启动
/usr/lcoal/tomcat/bin/startup.sh
或
/usr/lcoal/tomcat/bin/catalina.sh strat
#前台启动
/usr/local/tomcat/bin/catalina.sh run
netatst -antp | grep 8080
(2)部署192.168.174.17的tomcat server
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>
vim /usr/local/tomcat/conf/server.xml
#由于主机名 name 配置都为 localhost,需要删除前面的 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>
3.部署192.168.174.16 七层反向代理(nginx服务已开启)(50)
(1)配置:
1.关闭防火墙,将安装nginx所需软件包传到/opt目录下
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2.安装依赖包
#nginx的配置及运行需要pcre、zlib等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件。
yum -y install pcre-devel.x86_64 zlib-devel.x86_64 openssl-devel.x86_64 gcc gcc-c++ make
3.创建运行用户、组(Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)
useradd -M -s /sbin/nologin nginx
4.编译安装Nginx
cd /opt
tar zxvf nginx-1.18.0.tar.gz -C /opt/
cd nginx-1.18.0/
./configure \
--prefix=/usr/local/nginx \ #指定nginx的安装路径
--user=nginx \ #指定用户名
--group=nginx \ #指定组名
--with-http_stub_status_module #启用 http_stub_status_module 模块以支持状态统计
操作
make -j 2 && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
5.启动nginx
/usr/local/nginx/sbin/nginx #启动nginx,使用绝对路径或者绝对路径
(2)可以给他加入到system中去管理:
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
(3)配置图片
#准备静态页面和静态图片
mkdir /usr/local/nginx/html/img
cd /usr/local/nginx/html
vim sehun.html
<html>
<body>
<h1>this is nginx test web</h1>
<img src="sehun_1.jpg" />
</body>
</html>
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
#gzip on;
#配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
upstream tomcat_server {
server 192.168.174.17:8080 weight=1;
server 192.168.174.15:8080 weight=1;
server 192.168.174.15:8081 weight=1;
}
server {
listen 80;
server_name www.exo.com;
charset utf-8;
#access_log logs/host.access.log main;
#配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理
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;
}
#配置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;
}
......
}
......
}
- 测试静态页面效果,浏览器访问:
- 测试负载均衡效果:
三、总结:
1.动静分离是一种优化 Web 服务器性能的方式,它的基本思路是把动态的请求和静态的请求分别交给不同的服务器处理,从而减轻 Web 服务器的负担,提高网站的访问速度和同时响应用户数量。
2.动静分离的具体实现方式一般是将静态资源(如 HTML、CSS、JavaScript、图片、视频等)部署在 CDN 或独立的静态资源服务器上,而动态资源则部署在应用服务器上。这样做的好处是静态资源可以直接从 CDN 或静态资源服务器上获取,而不需要经过应用服务器的处理,从而提高了访问速度和并发访问能力。而应用服务器则专注于处理动态请求,提供业务逻辑的处理和数据查询等服务。
3.负载均衡是一种提高服务器可用性和性能的方式,它的基本思路是将大量的请求分摊到多个服务器上进行处理,从而降低单个服务器的负担和风险,提高整个系统的稳定性和可用性。
4.负载均衡的具体实现方式一般是将多台服务器组成一个服务器集群,通过负载均衡设备或软件来实现请求的分发,把请求转发到不同的服务器上进行处理。负载均衡设备可以根据服务器的配置、负载、响应时间等指标来动态调度请求,从而保证各个服务器的负载均衡,提高系统的运作效率和资源利用率。
.动静分离的具体实现方式一般是将静态资源(如 HTML、CSS、JavaScript、图片、视频等)部署在 CDN 或独立的静态资源服务器上,而动态资源则部署在应用服务器上。这样做的好处是静态资源可以直接从 CDN 或静态资源服务器上获取,而不需要经过应用服务器的处理,从而提高了访问速度和并发访问能力。而应用服务器则专注于处理动态请求,提供业务逻辑的处理和数据查询等服务。
3.负载均衡是一种提高服务器可用性和性能的方式,它的基本思路是将大量的请求分摊到多个服务器上进行处理,从而降低单个服务器的负担和风险,提高整个系统的稳定性和可用性。
4.负载均衡的具体实现方式一般是将多台服务器组成一个服务器集群,通过负载均衡设备或软件来实现请求的分发,把请求转发到不同的服务器上进行处理。负载均衡设备可以根据服务器的配置、负载、响应时间等指标来动态调度请求,从而保证各个服务器的负载均衡,提高系统的运作效率和资源利用率。
5.动静分离和负载均衡都是常见的 Web 服务器优化技术,它们可以相互结合使用,共同提高服务器的性能和可用性。