目录
一、Nginx代理服务器概念
1.正向代理
2.反向代理
二、动静分离
三、负载均衡
四、Nginx七层代理实验
1.部署Nginx服务
2. 部署Tomcat服务
2.1在192.168.88.50 虚拟机上部署双实例
2.2在192.168.88.60 上部署Tomcat服务器3
3.动静分离配置
3.1Tomcat1 server 配置
3.2 Tomcat2 server 配置
3.3Tomcat3 server 配置
4.Nginx server 配置
4.1准备静态页面和静态图片
4.2修改nginx配置文件
5.测试效果
四、Nginx四层代理服务
1.在192.168.88.60上配置nginx七层负载均衡器
1.1安装nginx服务
1.2配置静态页面和图片
1.3配置七层nginx配置文件
2.配置nginx四层代理
3.测试
代理是在服务器和客户端之间假设的一层服务器,代理将接收客户端的请求并将它转发给服务器,然后将服务端的响应转发给客户端。
不管是正向代理还是反向代理,实现的都是上面的功能。
正向代理:一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
正向代理是为我们服务的,即为客户端服务的,客户端可以根据正向代理访问到它本身无法访问到的服务器资源。
正向代理对我们是透明的,对服务端是非透明的,即服务端并不知道自己收到的是来自代理的访问还是来自真实客户端的访问。
反向代理(Reverse Proxy)方式是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
反向代理是为服务端服务的,反向代理可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发,负载均衡等。
反向代理对服务端是透明的,对我们是非透明的,即我们并不知道自己访问的是代理服务器,而服务器知道反向代理在为他服务。
反向代理的优势:
动静分离是指在 Web 服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提示整个服务的访问性和可维护性。
一般来说,都需要将动态资源和静态资源分开,由于 Nginx 的高并发和静态资源缓存等特性,经常将静态资源部署在 Nginx 上。如果请求的是静态资源,直接到静态资源目录获取资源,如果是动态资源的请求,则利用反向代理的原理,把请求转发给对应后台应用去处理,从而实现动静分离。
使用前后端分离后,可以很大程度提升静态资源的访问速度,即使动态服务不可用,静态资源的访问也不会受到影响。
一般情况下,客户端发送多个请求到服务器,服务器处理请求,其中一部分可能要操作一些资源比如数据库、静态资源等,服务器处理完毕后,再将结果返回给客户端。
这种模式对于早期的系统来说,功能要求不复杂,且并发请求相对较少的情况下还能胜任,成本也低。随着信息数量不断增长,访问量和数据量飞速增长,以及系统业务复杂度持续增加,这种做法已无法满足要求,并发量特别大时,服务器容易崩。
很明显这是由于服务器性能的瓶颈造成的问题,除了堆机器之外,最重要的做法就是负载均衡。
请求爆发式增长的情况下,单个机器性能再强劲也无法满足要求了,这个时候集群的概念产生了,单个服务器解决不了的问题,可以使用多个服务器,然后将请求分发到各个服务器上,将负载分发到不同的服务器,这就是负载均衡,核心是「分摊压力」。Nginx 实现负载均衡,一般来说指的是将请求转发给服务器集群。
Nginx 实现负载均衡的策略:
轮询策略:默认情况下采用的策略,将所有客户端请求轮询分配给服务端。这种策略是可以正常工作的,但是如果其中某一台服务器压力太大,出现延迟,会影响所有分配在这台服务器下的用户;
最小连接数策略:将请求优先分配给压力较小的服务器,它可以平衡每个队列的长度,并避免向压力大的服务器添加更多的请求;
最快响应时间策略:优先分配给响应时间最短的服务器;
客户端 IP 绑定策略:来自同一个 IP 的请求永远只分配一台服务器,有效解决了动态网页存在的 session 共享问题。
nginx应用配置核心:
upstream:用于定义上游服务器(后台提供的应用服务器)的相关信息
可在upstream内使用的指令:
server 定义上游服务器地址;
zone 定义共享内存,用于跨 worker 子进程;
keepalive 对上游服务启用长连接;
keepalive_requests 一个长连接最多请求 HTTP 的个数;
keepalive_timeout 空闲情形下,一个长连接的超时时长;
hash 哈希负载均衡算法;
ip_hash 依据 IP 进行哈希计算的负载均衡算法;
least_conn 最少连接数负载均衡算法;
least_time 最短响应时间负载均衡算法;
random 随机负载均衡算法。
server: 定义上游服务器地址
parameters 可选值:
weight=number 权重值,默认为1;
max_conns=number 上游服务器的最大并发连接数;
fail_timeout=time 服务器不可用的判定时间;
max_fails=numer 服务器不可用的检查次数;
backup 备份服务器,仅当其他服务器都不可用时才会启用;
down 标记服务器长期不可用,离线维护。
准备三个虚拟机:
#关闭防火墙
systemctl stop firewalld
setenforce 0
#安装编译器
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
#创建运行用户
useradd -M -s /sbin/nologin nginx
cd /opt
tar zxvf nginx-1.24.0.tar.gz -C /opt/
#编译安装nginx服务
cd nginx-1.24.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模块,提供对 flv 视频的伪流支持
--with-http_ssl_module #启用 SSL模块,提供SSL加密功能
--with-stream
make && make install
#将nginx服务加入可执行文件
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
#将nginx服务加入系统服务
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
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.service
systemctl enable nginx.service
1.安装好 jdk
cd /opt
rpm -qpl jdk-8u201-linux-x64.rpm
rpm -ivh jdk-8u201-linux-x64.rpm
java -version
#设置JDK环境变量
vim /etc/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
source /etc/profile.d/java.sh
2.安装 tomcat
cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mkdir /usr/local/tomcat
mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1
cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat2
3.配置 tomcat 环境变量
vim /etc/profile.d/tomcat.sh
#tomcat1
export CATALINA_HOME1=/usr/local/tomcat/tomcat1
export CATALINA_BASE1=/usr/local/tomcat/tomcat1
export TOMCAT_HOME1=/usr/local/tomcat/tomcat1
#tomcat2
export CATALINA_HOME2=/usr/local/tomcat/tomcat2
export CATALINA_BASE2=/usr/local/tomcat/tomcat2
export TOMCAT_HOME2=/usr/local/tomcat/tomcat2
source /etc/profile.d/tomcat.sh
4.修改 tomcat2 中的 server.xml 文件,要求各 tomcat 实例配置不能有重复的端口号
vim /usr/local/tomcat/tomcat2/conf/server.xml
#22行,修改Server prot,默认为8005 -> 修改为8006
修改为8081
#116行,修改Connector port AJP/1.3,默认为8009 -> 修改为8010
5.修改各 tomcat 实例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 环境变量
vim /usr/local/tomcat/tomcat1/bin/shutdown.sh(startup.sh)
添加
export CATALINA_HOME=$CATALINA_HOME1
export CATALINA_BASE=$CATALINA_BASE1
export TOMCAT_HOME=$TOMCAT_HOME1
vim /usr/local/tomcat/tomcat2/bin/shutdown.sh(startup.sh)
添加
export CATALINA_HOME=$CATALINA_HOME2
export CATALINA_BASE=$CATALINA_BASE2
export TOMCAT_HOME=$TOMCAT_HOME2
#重启tomcat服务
/usr/local/tomcat/tomcat1/bin/stutdown.sh
/usr/local/tomcat/tomcat2/bin/startup.sh
#查看tomcat服务是否开启
netstat -lntp | grep java
systemctl stop firewalld
setenforce 0
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH
source /etc/profile
tar zxvf apache-tomcat-8.5.16.tar.gz
mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
netstat -ntap | grep 8080
mkdir /usr/local/tomcat/tomcat1/webapps/test
vim /usr/local/tomcat/tomcat1/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
JSP test1 page #指定为 test1 页面
<% out.println("动态页面 1,http://www.test1.com");%>
vim /usr/local/tomcat/tomcat1/conf/server.xml
#由于主机名 name 配置都为 localhost,需要删除前面的 HOST 配置
/usr/local/tomcat/tomcat1/bin/shutdown.sh
/usr/local/tomcat/tomcat1/bin/startup.sh
mkdir /usr/local/tomcat/tomcat2/webapps/test
vim /usr/local/tomcat/tomcat2/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
JSP test2 page #指定为 test2 页面
<% out.println("动态页面 2,http://www.test2.com");%>
vim /usr/local/tomcat/tomcat2/conf/server.xml
#由于主机名 name 配置都为 localhost,需要删除前面的 HOST 配置
/usr/local/tomcat/tomcat2/bin/shutdown.sh
/usr/local/tomcat/tomcat2/bin/startup.sh
mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
JSP test3 page #指定为 test3 页面
<% out.println("动态页面 3,http://www.test1.com");%>
vim /usr/local/tomcat/conf/server.xml
#由于主机名 name 配置都为 localhost,需要删除前面的 HOST 配置
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
mkdir /usr/local/nginx/html/test
将game.jpg上传到/usr/local/nginx/html/test目录下
vim /usr/local/nginx/html/test/index.html
this is hello web!
vim /usr/local/nginx/conf/nginx.conf
http {
#gzip on;
#配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
upstream tomcat_server {
server 192.168.80.50:8080 weight=1;
server 192.168.80.50:8081 weight=1;
server 192.168.80.60:8080 weight=1;
}
server {
listen 8080;
server_name localhost;
charset utf-8;
#配置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/;
expires 10d;
}
location / {
root html;
index index.html index.htm;
}
}
}
测试静态页面效果
浏览器访问 http://192.168.88.40:8080/test/
测试负载均衡效果,不断刷新浏览器测试
浏览器访问 http://192.168.88.40:8080/test/index.jsp
不断刷新会轮询tomcat1、tomcat2、tomcat3
在七层基础上再加一台虚拟机: nginx四层转发服务器:192.168.88.70
过程同上
mkdir /usr/local/nginx/html/test
将game.jpg上传到/usr/local/nginx/html/test目录下
vim /usr/local/nginx/html/test/index.html
this is world web!
vim /usr/local/nginx/conf/nginx.conf
upstream tomcat_server {
server 192.168.88.50:8080 weight=1;
server 192.168.88.50:8081 weight=1;
server 192.168.88.60:8080 weight=1;
}
server {
listen 80;
server_name localhost;
charset utf-8;
server 192.168.88.50:8081 weight=1;
server 192.168.88.60:8080 weight=1;
}
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;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
root /usr/local/nginx/html/;
expires 10d;
}
vim /usr/local/nginx/conf/nginx.conf
和http同等级:所以一般只在http上面一段设置,
stream {
upstream appserver {
server 192.168.80.40:8080 weight=1;
server 192.168.80.60:80 weight=1;
}
server {
listen 8080;
proxy_pass appserver;
}
}
vim /usr/local/nginx/conf/nginx.xonf
#关闭长连接
keepalive_timeout 0;
测试静态页面效果,不断刷新测试
浏览器访问 http://192.168.88.70:8080/test/
测试负载均衡效果,不断刷新浏览器测试
浏览器访问 http://192.168.88.70:8080/test/index.jsp