案列:Nginx+Tomcat负载均衡、动静分离群集

news2024/9/28 20:39:31

一、案列:部署Tomcat(在192.168.10.102和192.168.10.103)

1.关闭防火墙

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

2.安装java环境

[root@localhost ~]# yum -y install java
[root@localhost ~]# java -version

3.安装tomcat

[root@localhost ~]# tar zxvf apache-tomcat-9.0.8.tar.gz 
[root@localhost ~]# mv apache-tomcat-9.0.8 /usr/local/tomcat8

4.启动tomcat

[root@localhost ~]# /usr/local/tomcat8/bin/startup.sh
[root@localhost ~]# netstat -anpt | grep java

5.创建测试网页

[root@localhost ~]# mkdir -p /web/webapp1
[root@localhost ~]# vim /web/webapp1/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
<html>   
<head>
     <title>JSP test1 page</title>
</head>
   <body>
     <% out.println("动态页面 1,http://www.test1.com");%>
   </body> 
   <body> 
    <div>动态页面的图片 1</div><br><img src="logo.jpg"> 
   </body> 
</html>

6.修改tomcat主配置文件

[root@localhost ~]# vim /usr/local/tomcat8/conf/server.xml 

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Context docBase="/web/webapp1" path="" />
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>

7.重启tomcat

[root@localhost ~]# /usr/local/tomcat8/bin/shutdown.sh 
[root@localhost ~]# /usr/local/tomcat8/bin/startup.sh 

8.客户端访问测试

http://192.168.10.102:8080 ##注意:此时看不到图片,图片要放到nginx上,由nginx解析

备注:

另外一台tomcat用同样的方法部署

二、nginx配置(在192.168.10.101)

1.安装nginx

[root@localhost ~]# yum -y install pcre-devel zlib-devel gcc*
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# tar zxvf nginx-1.12.0.tar.gz 
[root@localhost ~]# cd nginx-1.12.0
[root@localhost nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
[root@localhost nginx-1.12.0]# make && make install

[root@localhost nginx-1.12.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

2.编辑测试网页文件

[root@localhost ~]# vim /usr/local/nginx/html/index.html 
<body> 
<h1>静态页面</h1> 
<p>这是个静态页面</p> 
</body>

3.添加图片

[root@nginx ~]# mkdir /usr/local/nginx/html/img //创建静态文件目录 
[root@nginx ~]# cp /root/logo.jpg /usr/local/nginx/html/img

4.修改主配置文件

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
(1)在http配置项中添加
upstream tomcat_server {
        server 192.168.10.102:8080 weight=1;
        server 192.168.10.103:8080 weight=1;
}
(2)在server配置项中添加
charset utf-8;
location / {
       root   html;
       index  index.html index.htm;
}

location ~ .*\.jsp$ {
        proxy_set_header HOST $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Client-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://tomcat_server;
}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        root /usr/local/nginx/html/img;
        expires 30d;
}

备注:

proxy_set_header HOST $host;

把原http请求中的Header中的Host字段放到转发的请求报文里,后端的web服务器利用这个host判断请求的是哪个虚拟主机

proxy_set_header X-Real-IP $remote_addr;

使用$remote_addr变量获得用户的真实ip,$remote_addr一般都是设置第一个代理上面。当一个请求通过多个代理服务器时,用户的IP将会被代理服务器IP覆盖

proxy_set_header Client-IP $remote_addr;

获取客户端ip地址

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

从客户的真实ip为起点,穿过多层级的proxy ,最终到达web 服务器,都会记录下来。所以在获取用户真实ip的时候,最后一个nginx配置此变量,用来获取客户端的ip地址

5.启动nginx

[root@localhost ~]# nginx

6.修改tomcat的配置文件,并重启tomcat

  <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%a %r %t %{X-Real-IP}i" resolveHosts="false" />

注意:

在nginx配置文件中用X-Real-IP保存了客户端的真是IP地址,在tomcat中就需要将X-Real-IP解析出来,显示到tomcat的日志中。

7.测试

浏览器打开网站

(1)静态网站测试

http://192.168.10.101

(2)动态网站测试

http://192.168.10.101/index.jsp

(3)查看tomcat的日志文件
[root@localhost ~]# cat /usr/local/tomcat/logs/localhost_access_log.2024-07-09.txt
192.168.10.1 - - [09/Jul/2024:11:12:36 +0800] "GET / HTTP/1.1" 200 221
192.168.10.1 - - [09/Jul/2024:11:12:36 +0800] "GET /logo.jpg HTTP/1.1" 404 1081
192.168.10.1 - - [09/Jul/2024:11:12:39 +0800] "GET / HTTP/1.1" 200 221
192.168.10.1 - - [09/Jul/2024:11:12:39 +0800] "GET /logo.jpg HTTP/1.1" 404 1081
192.168.10.101 - - [09/Jul/2024:11:29:51 +0800] "GET /index.jsp HTTP/1.0" 200 221
192.168.10.101 - - [09/Jul/2024:11:29:52 +0800] "GET /index.jsp HTTP/1.0" 200 221
192.168.10.101 - - [09/Jul/2024:11:29:55 +0800] "GET /index.jsp HTTP/1.0" 200 221
192.168.10.101 GET /index.jsp HTTP/1.0 [09/Jul/2024:11:32:59 +0800] 192.168.10.1
192.168.10.101 GET /index.jsp HTTP/1.0 [09/Jul/2024:11:32:59 +0800] 192.168.10.1
192.168.10.101 GET /index.jsp HTTP/1.0 [09/Jul/2024:11:33:00 +0800] 192.168.10.1
192.168.10.101 GET /index.jsp HTTP/1.0 [09/Jul/2024:11:33:00 +0800] 192.168.10.1

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

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

相关文章

微软发布E2 TTS: 一种简单但效果优秀的文本转语音技术

本文介绍了一种名为“Embarrassingly Easy Text-to-Speech&#xff08;E2 TTS&#xff09;”的文本转语音系统。 该系统通过将输入文本转换为填充标记字符序列&#xff0c;并基于音频填充值任务训练流匹配基mel频谱生成器&#xff0c;实现了人类水平的自然度和最先进的说话人相…

大模型应用中什么是SFT(监督微调)?

大模型应用中什么是SFT&#xff08;监督微调&#xff09;&#xff1f; 一、SFT的基本概念 监督微调&#xff08;Supervised Fine-Tuning, SFT&#xff09;是对已经预训练的模型进行特定任务的训练&#xff0c;以提高其在该任务上的表现。预训练模型通常在大量通用数据上进行训…

APP项目开发的费用估计

APP项目的开发方式主要有以下几种&#xff0c;需要注意的是&#xff0c;以下只是一些估算值&#xff0c;实际的开发成本可能会有所不同。建议您在开发APP项目之前&#xff0c;先咨询专业的开发公司&#xff0c;获取详细的报价。北京木奇移动技术有限公司&#xff0c;专业的软件…

QT开发积累——qt中的注释和多行注释的几种方式,函数方法注释生成

目录 引出qt中的注释和多行注释方法的注释生成 总结日积月累&#xff0c;开发集锦方法参数加const和不加const的区别方法加static和不加static的区别Qt遍历list提高效率显示函数的调用使用&与不使用&qt方法的参数中使用&与不使用&除法的一个坑 项目创建相关新建…

爬虫-豆瓣读书排行榜

获取数据 requests库 获取数据环节需要用到requests库。安装方式也简单 pip install requests 爬取页面豆瓣读书 Top 250 用requests库来访问 import requests res requests.get(https://book.douban.com/top250/) 解析&#xff1a; 导入requests库调用了requests库中的…

人生苦短,我用Python+Docker

今天用一个简单的例子&#xff0c;介绍下如何使用Docker进行Python部署。 前期准备 本地需要有Python环境&#xff1b; 一个Linux的服务器并已经装好Docker &#xff1b; 能把代码上传到服务端的工具。 本文的本地环境是Win10Python3.12&#xff0c;服务器使用Ubuntu的云服…

二进制安装nexus

今天安装nexus&#xff0c;想看看别人怎么安装的&#xff0c;结果找了一圈&#xff0c;没有一个靠谱的&#xff0c; 有些题目是二进制安装nexus&#xff0c;内容是东家长李家短胡扯&#xff0c;一个字&#xff0c;不要脸&#xff1b; 详细安装步骤如下&#xff0c;一起学习&…

打通智能体「自我进化」全流程!复旦推出通用智能体平台AgentGym

AI通用智能体的自我进化能力&#xff0c;并非遥不可及。 LLM-based Agent&#xff0c;已经不再需要人类监督者的帮助&#xff0c;开始实现「自我进化」&#xff01; 这个智能体在学习了专家轨迹以后&#xff0c;获得了基础的通用能力&#xff0c;能够在更广泛、更真实的未知环…

ELK集群搭建

ELK集群搭建 文章目录 ELK集群搭建1.环境准备2.Elasticsearch环境搭建1.创建es账户并设置密码2.选择对应版本进行下载3.编辑配置文件4.设置JVM堆大小 #7.0默认为4G5.创建es数据及日志存储目录6.修改安装目录和存储目录权限 3.系统优化1.增加最大文件打开数2.增加最大进程数3.增…

kettle中调用restful接口时的SSL信任证书问题

1、找第三方获取SSL证书&#xff0c;&#xff08;本案例为自签名证书&#xff09; C:\Program Files\Java\jdk1.8.0_241\jre\lib\security>keytool -import -alias aliyun-maven -keystore cacerts -file E:\entSoftware\aliyun-maven.cer 输入密钥库口令: …………一堆证…

电脑怎样连接打印机?详细步骤告诉你!

在现代办公环境中&#xff0c;打印机是必不可少的设备之一。无论是打印文档、图片还是其他资料&#xff0c;连接打印机都是我们日常工作中的基本操作。然而&#xff0c;不同类型的打印机和连接方式可能会让人感到困惑。本文将介绍电脑怎样连接打印机的3种方法&#xff0c;帮助您…

MySQL 数据库基础概念

一、什么是数据库&#xff1f; 数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储和管理数据的仓库。 每个数据库都有一个或多个不同的 API 用于创建&#xff0c;访问&#xff0c;管理&#xff0c;搜索和复制所保存的数据。 我们也可以将数据存储在文件中&…

[计网初识1] TCP/UDP

学习内容 1.TCP建立链接的3次握手&#xff0c;断开连接的4次挥手 2.TCP报文段组成 内容 1.TCP 建立连接的3次握手? 假设主动方是客户端&#xff0c;被动方是服务端。 第一次 客户端给服务端发送 “hello,我是客户端” (TCP段中 SYN1) 第二次 服务端给客户端发送"我接…

【C++项目】从零实现一个在线编译器

前言 身为一名程序员&#xff0c;想必大家都有接触过像leetcode这样的刷题网站&#xff0c;不知你们在刷题的过程中是否思考过一个问题&#xff1a;它们是如何实现在线编译运行的功能。如果你对此感到好奇&#xff0c;那么本文将一步步带你来实现一个简易在线编译器。 项目概…

【ai_agent】从零写一个agent框架(四)用rust制作一个python的虚拟运行环境。

前言 为了增加框架的扩展性和适用性&#xff0c;我们要能够在流程节点中运行python脚本。 这个时候需要考虑几个问题&#xff1a; 1 为什么是python&#xff1f; 思考&#xff1a;老实说我并不喜欢python&#xff0c;我更倾向于lua这种短小轻快的脚本。在我之前写的规则引擎…

简单仿写SpringIOC

gitee地址&#xff08;需要自取&#xff09;ioc_Imitation: 简单仿写IOC (gitee.com) 项目目录结构 Autowired Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface Autowired { }Component Target(ElementType.TYPE) Retention(RetentionPoli…

云服务器centos7报错:Cannot find a valid baseurl for repo: base/7/x86_64

报错显示 我是使用FinalShell连接centos7&#xff1b; 如下图所示&#xff0c;尝试更新显示Cannot find a valid baseurl for repo: base/7/x86_64 网上找了很多教程最后没在点子上&#xff0c;最后我用gpt解决的&#xff0c;这里仅仅做一下记录&#xff08;因为我会忘记^_^&…

pnpm workspace使用教程【Monorepo项目】

目录 前言一、pnpm简介特点&#xff1a;对比 二、 创建项目添加文件 pnpm-workspace.yaml目录结构pnpm workspace: 协议修改配置文件执行 安装 三、命令解析执行包命令所有包操作命令 四、实例代码 前言 前面两篇&#xff0c;我们讲了 yarn workspace 和 lerna &#xff0c; …

枚举类 (enum)

目录 一、为什么要有枚举类&#xff1f; 二、枚举的简介 三、自定义枚举类 四、使用enum关键字 五、注意事项 一、为什么要有枚举类&#xff1f; 假如我们有这样的一个需求&#xff1a;设计季节类&#xff0c;并创建对象。 我们就需要以下操作&#xff0c;创建Season类&…

基于FPGA的数字信号处理(16)--定点数的舍入模式(7)6种舍入模式的总结

前言 在前面的6篇文章中&#xff0c;分别对6中舍入模式做了详细的介绍&#xff0c;本文在前文的基础上&#xff0c;再对这6种舍入模式做一个对比和总结。 6种舍入模式 在数据处理过程中&#xff0c;为了防止数据溢出而增加位宽是一种很常见的处理方式&#xff0c;但是随着算法链…