nginx+tomcat+nfs →web集群部署

news2024/11/22 10:25:01

nginx+tomcat+nfs  →web集群部署

 一.安装前介绍

  1. NGINX是一个高性能的Web服务器和反向代理服务器。它能够处理静态内容,缓存请求结果,以及将请求转发给后端服务器。通过反向代理,NGINX能够实现请求的负载均衡、安全性增强、SSL加密等功能。此外,NGINX还具有强大的模块化架构和配置灵活性,可以轻松地定制以满足特定需求。
    Tomcat是一个开源的Java Servlet容器,用于提供Web应用程序的运行环境。它支持Java EE标准,并能够运行各种Java Web应用程序。通过部署Web应用程序到Tomcat上,我们可以轻松地实现动态内容的生成和交互功能。
    NFS(Network File System)是一种分布式文件系统协议,用于在网络上的计算机之间共享文件。通过NFS共享,我们可以将静态文件(如图片、CSS、JavaScript等)存储在一个集中的位置,并由所有Web服务器共享访问。这有助于提高文件的访问速度和可靠性,减少存储空间的使用和冗余。
    在构建高性能的Web应用服务器时,我们可以通过以下步骤将NGINX、Tomcat和NFS共享集成在一起:

  2. 安装NGINX并配置反向代理规则。在NGINX的配置文件中,指定代理服务器的地址、端口、、缓存设置等参数。
  3. 安装Tomcat并配置Web应用程序的运行环境。在Tomcat的配置文件中,指定应用程序的部署路径、内存限制等参数。
  4. 配置NFS共享以实现文件共享。这包括在NFS服务器上安装NFS服务、创建共享目录、在客户端上挂载共享目录。在挂载时,指定NFS服务器的地址、共享目录的路径等参数。
    通过以上步骤,我们可以构建一个高性能的Web应用服务器,实现负载均衡、反向代理、动态内容生成和文件共享等功能。在实际应用中,我们需要注意监控服务器的性能指标、调整配置参数以提高性能和可靠性、以及定期备份和维护服务器等措施。同时,我们还需要关注安全问题,如防止恶意攻击、保护敏感数据等。

二.服务器架构如下

 架构解析:nginx代理外部的web访问请求,由两台到多台tomcat服务器提供真实的web服务,为了保证所有用户访问网站的统一性,所有tomcat服务器的网站根目录指向NFS(图中Database服务器)共享目录。

架构作用:提升网站吞吐性能,保持web架构一定的冗余性(仅tomcat)

部署需要至少4台服务器,服务器操作系统版本centos7.9,外网通。

服务器部署顺序为:NFS→tomcat→nginx

您只需将对应脚本上传到对应服务器执行即可,tomcat安装包csdn搜索下载对应版本再上传到服务器对应目录即可(具体安装包版本运行脚本时有提示)。

三.部署脚本如下:

NFS:

#!/bin/bash
#function:nfs
#author:tommypeng 20220714 final version
##########################################
 if
  [  "$USER"  != "root"   ]
then
   echo "错误:非root用户,权限不足!"
  exit  0
fi
###############防火墙及SElinux############
systemctl stop firewalld && systemctl disable firewalld  && echo "防火墙已经关闭"
sed -i 's/SELINUX=.*/SELINUX=disabled/g'  /etc/selinux/config  && echo "关闭selinux"
echo  "脚本所需安装包请访问作者个人网站:https://www.huoshichong.cn/index.php/download.html"
sleep 10
###############网络############
ping -c 3   www.baidu.com
if
   [ $? -eq 0 ]
   then
   echo -e "\n\033[32m-----------------------------------------------\033[0m"
                    echo -e "\033[32m网络畅通,即将安装依赖包\033[0m"
   else 
     echo -e "\n\033[32m-----------------------------------------------\033[0m"
                    echo -e "\033[32m即将退出,请检查外网通讯 !\033[0m"
        exit  0
fi
##################NFS#####################
yum install -y rpc* nfs-utils  &&   echo  "NFS安装成功"
#################创建文件夹#################
mkdir /pengxiaogang  &&  chmod -R 777 /pengxiaogang  &&  echo  "共享文件夹创建成功"
cat >>  /etc/exports  <<  EOF
/pengxiaogang *(rw,sync)
EOF
 
############按顺序启动rpcbind和nfs服务################
systemctl start rpcbind  &&  systemctl start nfs  &&  echo "按顺序启动rpcbind和nfs服务成功"
##############配置生效##############
exportfs -r
##################测试####################
showmount -e localhost  &&  echo "I love you,I love BDQN!!" > /pengxiaogang/index.jsp
 
请查询好NFS服务器的IP地址备用,再另一台服务器运行tomcat脚本:

tomcat:

#!/bin/bash
#function:tomcat
#author:tommypeng 20220714 final version
##########################################
 if
  [  "$USER"  != "root"   ]
then
   echo "错误:非root用户,权限不足!"
  exit  0
fi
###############防火墙及SElinux############
systemctl stop firewalld && systemctl disable firewalld  && echo "防火墙已经关闭"
sed -i 's/SELINUX=.*/SELINUX=disabled/g'  /etc/selinux/config  && echo "关闭selinux"
echo  "脚本所需安装包请访问作者个人网站:https://www.huoshichong.cn/index.php/download.html"
sleep 10
############清理老旧包###########
rpm -qa | grep java  >  /root/888.txt
PLIST=$(cat  /root/888.txt)
for  PKGNAME   in    $PLIST
do
      rpm -e --nodeps   $PKGNAME   &&  echo  "老旧包已经清理完毕" 
done
rm -rf  /root/888.txt  &&  echo "临时文件已删除"
sleep 5
tarbagp=/usr/local
#判断文件是否存在,如果存在就不用下载了
function is_exist()
{
    if [ ! -f $tarbagp/$1 ];then
        echo  "请上传$1到/usr/local/"    
        ###return 2###
        exit 0
    fi
}
###############安装JDK############
cd $tarbagp
   #判断文件是否存在
   is_exist jdk-8u311-linux-x64.tar.gz 
   is_exist apache-tomcat-8.5.72.tar.gz
   if [ $? -eq 0 ];then
   echo  "安装包已经就位,准备安装"
   fi
   sleep  5
cd $tarbagp &&  tar -zxvf jdk-8u311-linux-x64.tar.gz   &&   mv jdk1.8.0_311  jdk1.8
##############配置环境变量##############
cat >> /etc/profile  <<EOF
export JAVA_HOME=/usr/local/jdk1.8/
 
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
 
export PATH=$PATH:$JAVA_HOME/bin
 
EOF
sleep 4
source /etc/profile
source /etc/profile
##########安装tomcat###########
cd $tarbagp
mkdir myDir
cp  $tarbagp/apache-tomcat-8.5.72.tar.gz  $tarbagp/myDir  &&  cd $tarbagp/myDir
tar -zxvf apache-tomcat-8.5.72.tar.gz  &&   mv apache-tomcat-8.5.72  tomcat8
cd $tarbagp/myDir/tomcat8/bin/
sleep  3 
####sed -i '#\#!/bin/sh  #a\\   JAVA_HOME=/usr/local/jdk1.8/ '  /usr/local/myDir/tomcat8/bin/catalina.sh
sed  '2aJAVA_HOME=/usr/local/jdk1.8/'   /usr/local/myDir/tomcat8/bin/catalina.sh
./startup.sh    
if [ $? -eq 0 ];then
   echo  "tomcat启动成功"
else
   echo "tomcat启动失败,看来这个脚本没有帮到你,您还是自己折腾吧"
   exit 1
 fi
 ###############NFS################
 read  -p  "请输入NFS服务器的IP  " nfsip
 mount -v -t nfs $nfsip:/pengxiaogang  /usr/local/myDir/tomcat8/webapps/ROOT 
 mount -v -t nfs $nfsip:/pengxiaogang  /usr/local/myDir/tomcat8/webapps/ROOT
 rm -rf  /usr/local/myDir/tomcat8/webapps/ROOT/index.jsp 
 ###默认首页目录/usr/local/myDir/tomcat8/webapps/ROOT#########
####默认安装目录/usr/local/myDir/tomcat8#######
 
 
在第三台服务器再次运行以上脚本,安装两台tomcat服务器完毕,您需要准备好这两台tomcat服务器的IP备用,运行nginx脚本时需要提供。

第四台服务器,安装nginx,用如下脚本安装:

#!/bin/bash
#function:nginx代理
#author:tommypeng 20220714 final version
##########################################
 if
  [  "$USER"  != "root"   ]
then
   echo "错误:非root用户,权限不足!"
  exit  0
fi
###############防火墙及SElinux############
systemctl stop firewalld && systemctl disable firewalld  && echo "防火墙已经关闭"
sed -i 's/SELINUX=.*/SELINUX=disabled/g'  /etc/selinux/config  && echo "关闭selinux"
###############网络############
ping -c 3   www.baidu.com
if
   [ $? -eq 0 ]
   then
   echo -e "\n\033[32m-----------------------------------------------\033[0m"
                    echo -e "\033[32m网络畅通,即将安装依赖包\033[0m"
   else 
     echo -e "\n\033[32m-----------------------------------------------\033[0m"
                    echo -e "\033[32m即将退出,请检查外网通讯 !\033[0m"
        exit  0
fi
#######################依赖包###################
yum -y install  gcc gcc-c++ autoconf automake libtool make openssl openssl-devel pcre pcre-devel  wget
#############下载安装包##############
cd  /usr/local/src/    &&   wget  http://nginx.org/download/nginx-1.8.1.tar.gz 
if
   [ $? -eq 0 ]
   then
   echo -e "\n\033[32m-----------------------------------------------\033[0m"
                    echo -e "\033[32m安装包已经下载成功\033[0m"
   else 
     echo -e "\n\033[32m-----------------------------------------------\033[0m"
                    echo -e "\033[32m哟吼,滚犊子的下载失败了,即将退出 !\033[0m"
        exit  0
fi
###############编译及安装#############
    cd  /usr/local/src/  &&      tar -zxvf nginx-1.8.1.tar.gz
if [ $? -eq 0 ];then
cd  /usr/local/src/nginx-1.8.1
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre
make  && make install
             if  [ $? -eq 0 ];then
                    echo -e "\n\033[32m-----------------------------------------------\033[0m"
                    echo -e "\033[32m nginx编译安装成功 !\033[0m"
             else
                    echo -e "\033[32m nginx编译安装失败,请检查! \033[0m"
                    exit 1
             fi
    fi
mv  /usr/local/nginx/conf/nginx.conf   /usr/local/nginx/conf/nginx.conf.bak    &&  echo "已备份默认配置文件,即将重建配置文件含反向代理"
sleep 5
read -p  "请输入第一台tomcat服务器的IP  "   tomcata
read -p  "请输入第二台tomcat服务器的IP  "   tomcatb
cat >>  /usr/local/nginx/conf/nginx.conf  <<EOF
#user  nobody;
worker_processes  1;
 
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
#pid        logs/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
 
http {
    include       mime.types;
    default_type  application/octet-stream;
    upstream backend{
                                                             server  $tomcata:8080; 
                                                             server  $tomcatb:8080;      
                                                              }
 
    #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        on;
    #tcp_nopush     on;
 
    #keepalive_timeout  0;
    keepalive_timeout  65;
 
    #gzip  on;
 
    server {
        listen       80;
        server_name  localhost;
 
        #charset koi8-r;
 
        #access_log  logs/host.access.log  main;
 
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://backend;
        }
 
        #error_page  404              /404.html;
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
 
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
 
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
 
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
 
 
   # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;
 
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
 
 
   # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;
 
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;
 
    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;
 
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;
 
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
 
}
EOF
/usr/local/nginx/sbin/nginx -t 
 if  [ $? -eq 0 ];then
                    echo -e "\n\033[32m-----------------------------------------------\033[0m"
                    echo -e "\033[32m nginx配置测试成功 !\033[0m"
             else
                    echo -e "\033[32m nginx配置测试失败,请检查,6秒后退出! \033[0m"
                    sleep  6
                    exit 1
fi
/usr/local/nginx/sbin/nginx
if  [ $? -eq 0 ];then
                    echo -e "\n\033[32m-----------------------------------------------\033[0m"
                    echo -e "\033[32m nginx启动成功 !\033[0m"
             else
                    echo -e "\033[32m nginx启动失败,请检查,8秒后退出! \033[0m"
                    sleep  8
                    exit 1
fi
echo "
常用命令:
# 进入生成目录
cd  /usr/local/nginx
# 测试
/usr/local/nginx/sbin/nginx -t
# 查看编译模块信息
/usr/local/nginx/sbin/nginx -V
# 启动
/usr/local/nginx/sbin/nginx
# 重新载入配置文件
/usr/local/nginx/sbin/nginx  -s reload
# 重启
/usr/local/nginx/sbin/nginx  -s reopen
# 停止
/usr/local/nginx/sbin/nginx  -s stop  "

四.测试
 
以上四台您部署完毕后,访问nginx服务器的ip

如果出现如下界面则表示集群部署成功!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1830032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s上使用ConfigMap 和 Secret

使用ConfigMap 和 Secret 实验目标&#xff1a; 学习如何使用 ConfigMap 和 Secret 来管理应用的配置。 实验步骤&#xff1a; 创建一个 ConfigMap 存储应用配置。创建一个 Secret 存储敏感信息&#xff08;如数据库密码&#xff09;。在 Pod 中挂载 ConfigMap 和 Secret&am…

youlai-boot项目的学习—工程构建与运行

开发环境 系统:mac OS Ventura 13.2.1 终端: item2 Homebrew: 4.3.5 IDE: IntelliJ IDEA 2024.1.1 (Ultimate Edition) 代码分支 仓库&#xff1a;https://gitee.com/youlaiorg/youlai-boot.git 分支&#xff1a; master commit: 9a753a2e94985ed4cbbf214156ca035082e02723 …

【工作】计算机行业相关的十六类工作简介

本文简单介绍了计算机行业相关的工作类别&#xff0c;共16种&#xff0c;包括常见招聘要求与平均工资。平均工资信息来源&#xff1a;米国企业点评职场社区glassdoor&#xff08;https://www.glassdoor.com/index.htm&#xff09; &#xff08;一&#xff09;软件工程师 软件…

FreeRtos-13资源管理

一、临界资源是什么 要独占式地访问临界资源,有3种方法: 1.公平竞争:比如使用互斥量,谁先获得互斥量谁就访问临界资源,这部分内容前面讲过。 谁要跟我抢,我就灭掉谁: 2.中断要跟我抢?我屏蔽中断 3.其他任务要跟我抢?我禁止调度器,不运行任务切换 二、暂停调度器…

STM32高级控制定时器(STM32F103):计数模式

目录 概述 1 计数模式介绍 2 加计数模式 2.1 加计数模式介绍 2.2 计数序列案例 3 减计数模式 3.1 减计数模式介绍 3.2 应用实例 4 居中对齐模式&#xff08;向上/向下计数&#xff09; 4.1 功能介绍 4.2 应用实例 概述 本文主要介绍STM32F10X定时器计数功能的相关知…

【iOS】自定义cell及其复用机制

文章目录 cell的复用注册非注册两者的区别 自定义cell cell的复用 当用户滚动 UITableView 或 UICollectionView 时,只有少量可见的 cell 会被实际创建和显示。对于那些暂时不可见的 cell,系统会将它们缓存起来以备将来复用。这就是所谓的 cell 复用机制。 为什么需要cell的复…

深度神经网络——深度学习中的 RNN 和 LSTM 是什么?

引言 自然语言处理和人工智能聊天机器人领域许多最令人印象深刻的进步都是由 递归神经网络&#xff08;RNN&#xff09; 和长短期记忆&#xff08;LSTM&#xff09;网络。 RNN 和 LSTM 是特殊的神经网络架构&#xff0c;能够处理顺序数据&#xff0c;即按时间顺序排列的数据。…

插入排序-C语言版本

前言 插入排序是很重要的排序&#xff0c;著名的希尔排序就是从插入排序演变过来的&#xff0c;所以我们需要并且很多时候有些面试也是会面试插入排序的&#xff0c;所以需要好好捋清楚插入排序的逻辑是什么 插入排序gif 插入排序单趟实现 1&#xff0c;插入排序我们需要假设最…

【高端精品】最新手机版微信小程序(拼多多+京东)全自动操作项目

现代互联网经济的发展带来了新型的盈利方式&#xff0c;通过微信小程序的拼多多和京东进行商品自动巡视&#xff0c;为商家带来增的流量&#xff0c;同时为使用者带来利润。这种盈利方式无需复杂操作&#xff0c;用户仅需启动相应程序&#xff0c;商品信息便会被系统自动收集。…

《现代通信原理与技术》码间串扰和​​​​​​​无码间串扰的眼图对比实验报告

实 验&#xff1a;码间串扰和无码间串扰的眼图对比实验报告 摘 要&#xff1a; 在数字通信系统中&#xff0c;码间串扰&#xff08;Inter-Symbol Interference, ISI&#xff09;是影响信号质量和系统性能的重要因素之一。本实验通过MATLAB软件生成并对比了受码间串扰影响和未…

记录一个flink跑kafka connector遇到的问题

【报错】 D:\Java\jdk1.8.0_231\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2022.2.3\lib\idea_rt.jar56647:D:\Program Files\JetBrains\IntelliJ IDEA 2022.2.3\bin" -Dfile.encodingUTF-8 -classpath D:\Java\jdk1.8.0_231\jre\lib\cha…

ubuntu搭建java开发环境IDEA版

一.安装 OpenJDK 更新包列表&#xff1a; sudo apt update安装 OpenJDK&#xff1a; 你可以选择安装不同版本的 OpenJDK&#xff0c;例如 11 或 17&#xff0c;这个是安装 OpenJDK 11 的命令&#xff1a; sudo apt install openjdk-11-jdk验证安装&#xff1a; 安装完成后…

C++ 59 之 纯虚函数和抽象类

#include <iostream> #include <string> using namespace std;class Cal { // 类中有纯虚函数&#xff0c;这个类也叫做抽象类&#xff0c;无法实现实例化 public:int m_a;int m_b;// 虚函数// virtual int getRes(){// return 0;// }// 纯虚函数 作用和虚函数…

机器学习-课程整理及初步介绍

简介: 机器学习是人工智能的一个分支&#xff0c;它使计算机系统能够从经验中学习并改进其在特定任务上的表现&#xff0c;而无需进行明确的编程。机器学习涉及多种算法和统计模型&#xff0c;它们可以从数据中学习规律&#xff0c;并做出预测或决策。机器学习的应用非常广泛&…

【Unity】如何做一个很平滑的行人动画,且可以根据行人速度动态调整动画速度?

首先我们定一下不同速度对应的行人动作状态&#xff0c;设计为四种状态&#xff1a; 静止站立Stand&#xff1a;0~maxStandSpeed走路Walk&#xff1a;minWalkSpeed~maxWalkSpeed慢跑Jog&#xff1a;minJogSpeed~maxJogSpeed快跑Run&#xff1a;大于MinRunSpeed 我们可以使用A…

自学SAP是学习ECC版本还是S4版本?

很多人想学SAP&#xff0c;问我应该学ECC版本还是S4版本&#xff0c;我的建议如果你是自学的话&#xff0c;我个人建议使用ECC版本就行&#xff0c;因为这两个版本前台业务和后台配置的操作差异并不大&#xff0c;主要差异在于数据库的差异&#xff0c;前台业务操作和后台系统配…

用户态协议栈02-arp reply实现

在上一节DODK的UDP收发中发送udp包的时候&#xff0c;需要向物理机的arp表中添加一个静态的arp记录。这在生产环境中显然是不可以的。在内核的协议栈中&#xff0c;会将自己的ip和mac在局域网中进行广播&#xff0c;并且记录其他电脑的ip和mac。在需要发送数据包的时候&#xf…

6月15号作业

使用手动连接&#xff0c;将登录框中的取消按钮使用第二中连接方式&#xff0c;右击转到槽&#xff0c;在该槽函数中&#xff0c;调用关闭函数 将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0…

18. 《C语言》——【Nice2016年校招笔试题引发的思考】

亲爱的读者&#xff0c;大家好&#xff01;我是一名正在学习编程的高校生。在这个博客里&#xff0c;我将和大家一起探讨编程技巧、分享实用工具&#xff0c;并交流学习心得。希望通过我的博客&#xff0c;你能学到有用的知识&#xff0c;提高自己的技能&#xff0c;成为一名优…

证明 泊松分布 的期望和方差

泊松分布 泊松分布&#xff08;Poisson Distribution&#xff09;是描述在固定时间间隔内某事件发生次数的概率分布&#xff0c;特别适用于稀有事件的统计。假设随机变量 ( X ) 表示在时间间隔 ( t ) 内某事件发生的次数&#xff0c;并且该事件在单位时间内发生的平均次数为 (…