nginx+tomcat+nfs →web集群部署

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.mzph.cn/web/28503.shtml

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

相关文章

Linux中文件查找相关命令比较

Linux中与文件定位的命令有find、locate、whereis、which&#xff0c;type。 一、find find命令最强&#xff0c;能搜索各种场景下的文件&#xff0c;需要配合相关参数&#xff0c;搜索速度慢。在文件系统中递归查找文件。 find /path/to/search -name "filename"…

位运算算法:编程世界中的魔法符号

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一. 常见位运算总结 二、常见位运算题目 2.1 位1的个数 2.2 比特数记位&#xff08;典型dp&#xff09; 2.3 汉明距离 2.4 只出现一次的数字&#xff08;1&#xff09; 2.5 只出…

OpenGL系列(六)变换

在三角形和纹理贴图示例中&#xff0c;顶点使用的是归一化设备坐标&#xff0c;在该坐标系下&#xff0c;顶点的每个轴的取值为-1到1&#xff0c;超出范围的顶点不可见。 基于归一化设备坐标的物体的形状随着设备的大小变换而变化&#xff0c;这里产生的第一个问题是&#xff0…

三极管的理解

三极管的放大使用 基极集电极之间可理解为电子扩展 电化学效应&#xff1b;产生载流子多少&#xff0c;从而射集间而流动大小 电化学效应&#xff0c;电子漂移现象&#xff0c;基极与集电极的电流的作用在于产生载流子 电流的流动&#xff0c;需要载流子&#xff0c;从而基极…

Linux初识地址空间

前言 上一期我们对进程优先级、命令行参数以及环境和变量做了介绍&#xff01;以前我们就提到过一个问题有了运行队列为什么还要有优先级&#xff1f;本期将带你揭晓&#xff01; 本期内容介绍 虚拟地址空间的引入 虚拟地址空间的介绍 如何理解地址空间 为什么要有地址空间 如…

Elasticsearch:智能 RAG,获取周围分块(一)

作者&#xff1a;来自 Elastic Sunile Manjee 在检索增强生成 (RAG) 领域&#xff0c;一个持续存在的挑战是找到输入大型语言模型 (LLM) 的最佳数据量。数据太少会导致响应不足或不准确&#xff0c;而数据太多会导致答案模糊。这种微妙的平衡启发我开发了一个专注于智能分块和利…

花钱就能过?PMP到底有没有用

在项目管理领域&#xff0c;PMP&#xff08;Project Management Professional&#xff09;认证常被看作是专业能力的金牌标准。 然而&#xff0c;伴随着这一认证的普及&#xff0c;也出现了一些质疑声&#xff0c;比如“PMP认证是否只是金钱和时间的投入就能获得的证书&#xf…

Mybatis工作流程和插件开发

在了解插件开发之前&#xff0c;我们先总体的来梳理一下Mybatis的大致执行流程&#xff1a; 1.new SqlSessionFactoryBuilder().build(inputStream):先根据配置文件&#xff08;包含了全局配置文件和映射配置文件&#xff09;初始化一个对象Configuration&#xff08;这里对象里…

Java | Leetcode Java题解之第155题最小栈

题目&#xff1a; 题解&#xff1a; class MinStack {Deque<Integer> xStack;Deque<Integer> minStack;public MinStack() {xStack new LinkedList<Integer>();minStack new LinkedList<Integer>();minStack.push(Integer.MAX_VALUE);}public void …

哈喽GPT-4o——对GPT-4o 文本创作的思考与看法

目录 用法1&#xff1a;创作小说用法2&#xff1a;创作散文用法3&#xff1a;创作诗歌1、古诗2、现代诗 用法4&#xff1a;创作儿童故事用法5&#xff1a;创作剧本 大家好&#xff0c;我是哪吒。 都说ChatGPT4o是目前文本创作的最强大模型&#xff0c;它都可以用于哪些方面的文…

虚拟化 之四 详解 jailhouse 使能和创建 Cell 的工作流程

完整的 Jailhouse 组件主要由内核模块(jailhouse.ko)、虚拟机管理程序固件(jailhouse*.bin)、管理工具(jailhouse 命令行程序及一些 Python 脚本)以及配置文件(.cell)这四部分组成。用户使用它们来启用虚拟机管理程序、创建 Cell、加载 inmate 二进制文件以及运行和停止…

CCPD数据集

官网&#xff1a;https://github.com/detectRecog/CCPD 其它介绍&#xff1a;https://blog.csdn.net/qianbin3200896/article/details/103009221 CCPD (Chinese City Parking Dataset, ECCV) provinces ["皖", "沪", "津", "渝", &…

跟着刘二大人学pytorch(第---13---节课之RNN高级篇)

文章目录 0 前言0.1 课程视频链接&#xff1a;0.2 课件下载地址&#xff1a; 1 本节课任务描述模型的处理过程训练循环初始化分类器是否使用GPU构造损失函数和优化器每个epoch所要花费的时间遍历每个epoch时进行训练和测试记录每次测试的准确率加入到列表中 具体实现&#xff0…

0基础可以直接学python自动化测试吗?

可以直接学习Python自动化测试&#xff0c;即使没有编程基础。Python是一种易于学习和上手的编程语言&#xff0c;也是自动化测试领域中最受欢迎的语言之一。下面是一篇超详细和规范的文章&#xff0c;将从零开始介绍Python自动化测试的基础知识。 1. 安装Python和开发环境 首…

项目进度和成本管理

1.如何正确标识出软件项目活动&#xff1f; 正确标识软件项目活动是项目管理中的一个重要步骤&#xff0c;它有助于确保项目的顺利进行和成功完成。以下是一些标识软件项目活动的步骤和建议&#xff1a; 项目范围定义&#xff1a;首先明确项目的目标和范围&#xff0c;这将帮助…

初识前端开发

目的 &#xff1a;开发一个网站 -前端开发&#xff1a;html 、css、javaScript -web框架&#xff1a;接收请求处理 -mysql数据库&#xff1a;存储数据的地方 快速上手&#xff1a; 基于Flask web框架让你快速搭建一个网站出来 学习&#xff1a; 基于Django框架 初识HTML …

刷代码随想录有感(106):动态规划——分割等和子集(01背包问题)

题干&#xff1a; 代码&#xff1a; class Solution { public:bool canPartition(vector<int>& nums) {int sum 0;for(int i : nums){sum i;}if(sum % 2 ! 0)return false;int target sum / 2;vector<int>dp(10001, 0);for(int i 0; i < nums.size(); …

Windows11和Ubuntu22双系统安装指南

一、需求描述 台式机电脑&#xff0c;已有Windows11操作系统&#xff0c;想要安装Ubuntu22系统&#xff08;版本任意&#xff09;。其中Windows安装在Nvme固态上&#xff0c;Ubuntu安装在Sata固态上&#xff0c;双盘双系统。开机时使用Grub控制进入哪个系统&#xff0c;效果图…

Python进阶:从函数到文件的编程艺术!!!

第二章&#xff1a;Python进阶 模块概述 函数是一段可重复使用的代码块&#xff0c;它接受输入参数并返回一个结果。函数可以用于执行特定的任务、计算结果、修改数据等&#xff0c;使得代码更具模块化和可重用性。 模块是一组相关函数、类和变量的集合&#xff0c;它们被封…

第 2 章:Spring Framework 中的 IoC 容器

控制反转&#xff08;Inversion of Control&#xff0c;IoC&#xff09;与 面向切面编程&#xff08;Aspect Oriented Programming&#xff0c;AOP&#xff09;是 Spring Framework 中最重要的两个概念&#xff0c;本章会着重介绍前者&#xff0c;内容包括 IoC 容器以及容器中 …