目录
在现代 Web 服务架构中,Tomcat 和 Nginx 是两个至关重要的组件,负责处理用户请求并实现高性能的服务。本篇博客将深入探讨这些技术的原理和部署配置方法。
最初是由Sun的软件构架师詹姆斯·邓肯·戴维森开发。
安装Tomcat后,安装路径下面的目录和文件,是使用或者配置Tomcat的重要文件。
Nginx是一款非常优秀的HTTP服务器软件。Nginx支持高达50000个并发连接数的响应,拥有强大的静态资源处理能力,运行稳定,内存、CPU等系统资源消耗非常低。
目前很多大型网站都应用Nginx服务器作为后端网站程序的反向代理及负载均衡器,提升整个站点的负载并发能力。

首先我们需要明确,我们作为用户是从客户端去访问服务端,因此从客户端-→服务端可以简单的认为是正向。换句话说正向代理时,我们往往明确的知道我们需要访问哪个服务端,比如我想访问google,但是由于某种原因,我无法直接访问它,因此我需要一个能访问呢google的代理服务器去帮我完成这个通信,通过一系列代理服务器的配置,当我输入google的网站时,代理服务器接收请求并转交给目标服务端即google,最终返回内容给我客户端。至此完成了一个简单的正向代理,通过上文我们可以发现,服务端仅仅只与代理服务器产生了通信,因此服务端并不知道该请求来自于哪个客户端,它知道是从代理服务器而来,因此正向代理的最大特点即:其屏蔽或者隐藏了真实客户端的信息,即保护了客户端。

弄清了正向代理,其实反向代理也很清晰了,不就是一个逆向思维嘛,即保护了服务端。反向代理往往应用于分布式环境下,例如我们的淘宝,为了解决高流星带来的服务器压力,单台服务器往往不能够解决问题,此时则需要搭建一个集群环境,并且其也拥有一个反向代理服务器,当大量的客户端请求淘宝时,往往请求并不会直接到服务端,而是先到代理服务器,由代理服务器进行反向代理,采用负载均衡9策略将请求分法给各台服务器,保证资源的充分利用。这就是反向代理最大的用处,我们是否也能发现,从某种意义上来说,反向代理屏蔽或者隐藏了服务器的信息,相对于单一服务端,采用了反向代理之后我们只知道访问了淘宝,却不知道访问了其具体的哪台服务器
当使用Nginx服务器作为前端时,可以配置Nginx来进行静态页面的处理,而将动态页面请求转发给后端的Tomcat服务器来处理。由于Tomcat是轻量级应用服务器,可能无法满足所有访问量,因此需要多台Tomcat服务器,并通过Nginx的配置权重来进行负载均衡,以确保请求能够被分发到不同的Tomcat服务器上

客户端向反向代理发送请求,接着反向代理根据某种负载机制请求至目标服务器(这些服务器都运行着相同的应用),并把获取的内容返回给客户端,其中代理请求可能根据配置被发往不同的服务器。
配置后端服务器池,以提供响应数据
upstream 服务池名{}
配置将访问请求发送给后端服务器池的服务器处理。
proxy_pass http://服务池名
4层代理
使用NAT (Network Address Translation)技术,即网络地址转换。即请求进来的时候,nginx只修改数据包里面的目标IP、源IP、端口,然后就直接把数据包发给目标服务器(即nginx不知道请求的具体内容),目标服务器处理完成后,发给nginx,nginx数据包再做一次类似的修改,就返回给请求的客户端了。
四层代码配置:
- stream {
-
- upstream appserver {
- server 192.168.80.100:8080 weight=1;
- server 192.168.80.101:8080 weight=1;
- server 192.168.80.101:8081 weight=1;
- }
- server {
- listen 8080;
- proxy_pass appserver;
- }
- }
-
- http {
- ......
7层代理
nginx读取并解析Http请求内容,然后将具体内容(请求行、请求头、空行、请求数据)转发到相应的服务器,转发的过程是:建立和目标机器的连接,然后转发请求,收到响应数据再转发给请求客户端。
七层代码配置
3.1 rr 轮询 负载均衡模式 (自带的)
每个请求按时间顺序逐一分配到不同的后端服务器,如果超过了最大失败次数后(max_fails,默认1),在失效时间内(fail_timeout,默认10秒),该节点失效权重变为0,超过失效时间后,则恢复正常,或者全部节点都为down后,那么将所有节点都恢复为有效继续探测,一般来说rr可以根据权重来进行均匀分配。
3.2 least_conn 最少连接(自带的)
优先将客户端请求调度到当前连接最少的服务器。
3.3 weight 加权轮询(自带的)
weight代表权重的意思,用于指定轮询的几率,默认权重都是1,可以手动设置调整,权重越高,被分配的次数越多,weight权重和访问比例是成正比的,用于解决后端服务器性能不均衡时,调整访问比例。
3.4 ip_hash (自带的)
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,但是ip_hash会造成负载不均,有的服务请求接受多,有的服务请求接受少,所以不建议采用ip_hash模式,session 共享问题可用后端服务的 session 共享代替 nginx 的 ip_hash(使用后端服务器自身通过相关机制保持session同步)。
3.5 url_hash(第三方)
基于用户请求的uri做hash。和ip_hash算法类似,是对每个请求按url的hash结果分配,使每个URL定向到同一个后端服务器,但是也会造成分配不均的问题,这种模式后端服务器为缓存时比较好。
3.6 fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
客户端发送请求想要访问服务器端,首先会经过一个代理服务器(即包含Nginx服务的服务器),如果发送的请求中既有静态资源也有动态资源,其中的静态资源会有Nginx提供服务进行返回响应给客户端,动态资源则会由Nginx转发给后端(即包含Tomcat服务的服务器),然后由后端在进行返回响应给代理服务器,再由代理服务器返回响应给客户端。其本质就是是location规则的匹配

Nginx处理静态页面的效率高于Tomcat的处理能力;
若Tomcat的请求为1000次,则Ntginx的请求两位6000次;
Tomcat每秒的吞吐量位0.6M,Nginx的每秒吞吐量位3.6,;
Nginx处理静态资源的能力是Tomcat处理的6倍。
吞吐量可以理解成带宽流量,以每个请求0.5KB大小,并发每秒25万,0.5/1024MB*250000=122MB*8bit=977Mbps。
以10分钟有5000万用户平均每人访问2次为例,并发量为每秒(5000w*2)/(60*10)=16.7万,再double下,就说每秒25万并发量
1、搭建七层代理准备三台服务器Nginx作为负载均衡器,Tomcat作为应用服务器
nginx:20.0.0.100:80
tomcat1:20.0.0.101:80
tomcat2:20.0.0.102:8080 20.0.0.200:8081
初始化三台机器
- ###关闭firewalld
- [root@localhost ~]# systemctl stop firewalld.service
- ###关闭防火墙开机自启
- [root@localhost ~]# systemctl disable firewalld.service
- Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
- Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
- 关闭selinux
- [root@localhost ~]# setenforce 0
部署nginx 编译安装
- [root@localhost ~]# yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
- [root@localhost ~]# useradd -M -s /sbin/nologin nginx
- [root@localhost ~]# cd /opt/
- [root@localhost opt]# ls
- nginx-1.24.0.tar.gz rh
- [root@localhost opt]# tar xf nginx-1.24.0.tar.gz
- [root@localhost opt]# ls
- nginx-1.24.0 nginx-1.24.0.tar.gz rh
- [root@localhost opt]# cd nginx-1.24.0/
- [root@localhost 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 #启用 stream模块,提供4层调度
- ###编译安装
- [root@localhost nginx-1.24.0]# make -j2 && make install
-
- ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-stream
添加nginx服务
- ###把nginx服务的可执行程序文件放入路径环境变量的目录中便于系统识别
- [root@localhost ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
- ###修改nginx服务的配置文件
- [root@localhost nginx-1.24.0]# vim /lib/systemd/system/nginx.service
- [Unit] #服务的说明
- Description=nginx #描述服务
- After=network.target #依赖,当依赖的服务启动之后再启动自定义的服务
- [Service] #服务运行参数的设置
- Type=forking #是后台运行的形式,使用此启动类型应同时指定
- PIDFile=/usr/local/nginx/logs/nginx.pid #PID文件位置以便systemd能够跟踪服务的主进程
- 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 #可设置为多用户
-
- ###给予文件权限
- [root@localhost ~]# chmod 754 /lib/systemd/system/nginx.service
- ###启动nginx服务
- [root@localhost ~]# systemctl start nginx.service
- ###开机自启nginx服务
- [root@localhost ~]# systemctl enable nginx.service
- Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
测试访问ip地址

tomcat1部署
安装jdk
- [root@localhost opt]# cd /opt
- ###查询指定软件包的文件列表
- [root@localhost opt]# rpm -qpl jdk-8u201-linux-x64.rpm
- ###安装jdk
- [root@localhost opt]# rpm -ivh jdk-8u201-linux-x64.rpm
- ###查看jdk版本号
- [root@localhost opt]# java -version
- openjdk version "1.8.0_262"
- OpenJDK Runtime Environment (build 1.8.0_262-b10)
- OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)
然后配置jdk环境变量
vim /etc/profile

保存退出 然后 source /etc/profile
然后到根目录下 创建一个 XXX.java文件 我这里创建的是Hello.java文件
配置内容如图

保存退出

此时 jdk环境变量配置好了
安装tomcat

此时 到浏览器访问本地路径
出现tomcat服务 就是安装启动好了

部署第二台tomcat 操作一样 但是端口号不能一样
- [root@localhost ~]# vim /usr/local/tomcat/tomcat2/conf/server.xml
- ###22行,修改Server prot,默认为8005 -> 修改为8006
- <Server port="8006" shutdown="SHUTDOWN">
-
- ###69行,修改Connector port,HTTP/1.1 默认为8080 -> 修改为8081
- <Connector port="8081" protocol="HTTP/1.1"
-
- ###116行,修改Connector port AJP/1.3,默认为8009 -> 修改为8010
- <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />