《Nginx + 双Tomcat实战:域名解析、静态服务与反向代理、负载均衡全指南》

发布于:2025-07-13 ⋅ 阅读:(17) ⋅ 点赞:(0)

注意:本实验基于安装好nginx和tomcat11和tomcat9

没安装的可以参考本人博客

Nginx源码安装+静态站点部署指南(CentOS 7)-CSDN博客

同时部署两个不同版本的tomcat要如何配置环境变量-CSDN博客

保姆级tomcat的页面部署(静态)-CSDN博客

实验目标

  1. 掌握 Nginx静态资源托管(端口10010)。

  2. 实现 Nginx反向代理,通过域名 www.123.com 分发请求到不同Tomcat实例。

  3. 理解 路径匹配规则/tomcat1/ vs /tomcat2/)。


实验环境

  • 服务器:CentOS 7(IP: 10.1.1.160

  • 软件

    • Nginx 1.20

    • Tomcat9(端口8888) + Tomcat11(端口8080)

准备工作

1.找到主机的host文件,并添加配置如下

10.1.1.160 www.123.com

2.测试添加的ip是否可以解析域名

在本地终端上ping www.123.com

3.在浏览器输入设置好的www.123.com,出现以下界面 

Tomcat操作

两个tomcat除了版本,关闭端口,访问端口还有提示语不一样,其他都不需要修改

tomcat11   

关闭端口:8005  访问端口:8080  提示语:Tomcat -1

tomcat9

关闭端口:8006  访问端口:8888  提示语:Tomcat -2

以tomcat2举例(注意自己安装tomcat的目录)

1.修改提示语

区分两个tomcat,下面的 Tomcat -2 是指tomcat9版本

cd /opt/module/tomcat9/webapps/ROOT/

vim index.jsp

2.修改tomcat9的端口

关闭端口:

访问端口:

3.重启tomcat

4.查看tomcat状态

5.验证是否修改成功

浏览器输入10.1.1.160:8080

Nginx操作

实例一 :进行域名解析后端口 10010 的静态服务

vim /usr/local/nginx/conf/nginx.conf

    server {
      listen 10010;
      location / {
        root html/hello;
        index hello.html;
      }
    }

  • 作用

    • 监听 10010 端口,提供静态文件服务。

    • 访问 http://服务器IP:10010/ 时:

      • 返回 html/hello/hello.html 文件。

      • 如果 hello.html 不存在,Nginx 会报 403 或 404 错误。

  • 典型用途:测试或内部工具页面。

实例二:域名 www.123.com 的反向代理

修改配置文件,添加下面的server块

vim /usr/local/nginx/conf/nginx.conf

server {
    listen 80;
    server_name www.123.com;
    location / {
        proxy_pass http://10.1.1.160:8080;
        index index.jsp;
    }
}

  • 作用

    • 监听 80 端口,仅对域名 www.123.com 生效。

    • 将所有请求转发到 http://10.1.1.160:8080(如 Tomcat 服务)。

    • index index.jsp:指定默认索引文件(但对动态代理通常无效,可删除)。

  • 关键点

    • 需确保 10.1.1.160:8080 服务正常运行。

    • 浏览器访问 http://www.123.com 实际显示的是后端 8080 端口的内容。

  • 问题:缺少代理头设置(如 Host 头),可能导致后端服务无法获取真实客户端 IP。

实例三:通过路径前缀将请求分发到不同的后端 Tomcat 服务

1.准备两个tomcat的测试html脚本

mkdir -p /opt/tomcat11/webapps/tomcat1/
vim /opt/tomcat11/webapps/tomcat1/index.html

<!DOCTYPE html>
<html>
<head>
    <title>Tomcat1 Test</title>
</head>
<body>
    <h1>Tomcat1 is Working!</h1>
    <p>This page is served from Tomcat1 (8080 port)</p>
</body>
</html>

mkdir -p /opt/module/tomcat9/webapps/tomcat2/
vim /opt/module/tomcat9/webapps/tomcat2/index.html


<!DOCTYPE html>
<html>
<head>
    <title>Tomcat2 Test</title>
</head>
<body>
    <h1>Tomcat2 is Working!</h1>
    <p>This page is served from Tomcat2 (8888 port)</p>
</body>
</html>

2.打开nginx配置文件,修改Tomcat 服务如下

vim /usr/local/nginx/conf/nginx.conf

    server {
      listen 10011;
      server_name www.123.com;
      location /tomcat1/ {
        proxy_pass http://10.1.1.160:8080;
        index index.html index.jsp;
      }
      location /tomcat2/ {
        proxy_pass http://10.1.1.160:8888;
        index index.html index.jsp;
      }
    }
 

1. 核心作用

  • 监听 www.123.com 域名的 10011 端口

  • 根据请求的 URL 路径前缀,将流量转发到两个不同的 Tomcat 服务:

    • 路径以 /tomcat1/ 开头的请求 → 转发到 http://10.1.1.160:8080

    • 路径以 /tomcat2/ 开头的请求 → 转发到 http://10.1.1.160:8888

2. 实际访问示例

用户请求的 URL 实际代理的后端地址
http://www.123.com:10011/tomcat1/api http://10.1.1.160:8080/api
http://www.123.com:10011/tomcat2/login http://10.1.1.160:8888/login

 

 3.网页测试访问

Tomcat1的访问页面

http://10.1.1.160:10011/tomcat1/

http://www.123.com:10011/tomcat1/

Tomcat2的网页访问:

http://10.1.1.160:10011/tomcat2/

http://www.123.com:10011/tomcat2/

如果访问页面有乱码

(1) 修改 JSP/HTML 文件

在文件头部强制声明 UTF-8 编码:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- 如果是 HTML -->

(2) 修改 Tomcat 的 server.xml

确保 Connector 配置了 URIEncoding="UTF-8"

vi /opt/module/tomcat9/conf/server.xml

找到 8888 端口的 Connector,添加 URIEncoding

xml

<Connector 
    port="8888" 
    protocol="HTTP/1.1"
    URIEncoding="UTF-8"  <!-- 关键参数 -->
    connectionTimeout="20000"
    redirectPort="8443" 
/>

通过本次配置,您成功实现了以下功能:

  1. 域名解析与静态服务

    • 通过修改本地 hosts 文件,将 www.123.com 解析到服务器 IP(10.1.1.160)。

    • 配置 Nginx 监听 10010 端口,提供静态 HTML 服务(/usr/local/nginx/html/hello/hello.html)。

  2. Tomcat 多实例管理

    • 部署 Tomcat11(8080 端口) 和 Tomcat9(8888 端口),并修改默认提示语以区分服务。

    • 为每个 Tomcat 创建测试页面(tomcat1/index.html 和 tomcat2/index.html),验证服务可用性。

  3. Nginx 反向代理与路径分发

    • 通过 www.123.com 的 10011 端口 代理到不同 Tomcat 服务:

      • /tomcat1/ → 转发到 Tomcat11(8080 端口)

      • /tomcat2/ → 转发到 Tomcat9(8888 端口)

    • 支持动态内容(JSP)和静态内容(HTML)的代理转发。

  4. 编码问题修复

    • 通过调整 Tomcat 的 server.xmlURIEncoding="UTF-8")和 HTML 文件的元标签,解决中文乱码问题。

实例四:tomcat的带权重的负载均衡

核心功能

  1. 定义负载均衡组 (upstream)

    nginx

    upstream tomcat-server {
        server 10.1.1.160:8080 weight=1;  # Tomcat11
        server 10.1.1.160:8888 weight=3;  # Tomcat9
    }
    • 将两个Tomcat实例组成集群

    • 权重分配

      • 10.1.1.160:8888(Tomcat9)接收 75% 的请求(权重3/(1+3))

      • 10.1.1.160:8080(Tomcat11)接收 25% 的请求

  2. 创建负载均衡入口 (server)

    nginx

    server {
        listen 10013;
        location / {
            proxy_pass http://tomcat-server;  # 指向upstream组
        }
    }
    • 监听10013端口,将所有请求转发到tomcat-server集群

    • 自动按权重轮询分发请求

最终效果

  • 访问 http://www.123.com:10010/ → 返回 Nginx 静态页面(hello.html)。

  • 访问 http://www.123.com:10011/tomcat1/ → 显示 Tomcat11 的服务页面(8080 端口)。

  • 访问 http://www.123.com:10011/tomcat2/ → 显示 Tomcat9 的服务页面(8888 端口)。

  • 访问 http://www.123.com:10013/ → 每显示 三次Tomcat9 的服务页面再显示一次Tomcat11的服务页面

技术价值

  • 灵活路由:通过 Nginx 的路径匹配,实现同一域名下多后端服务的无缝切换。

  • 资源隔离:Tomcat 多实例独立运行,避免端口冲突,便于版本管理和灰度发布。

  • 高效代理:Nginx 作为反向代理,提升请求处理效率,并隐藏后端服务器细节。

至此,您已构建了一个支持 静态服务 + 动态代理 + 多实例分发+权重负载均衡 的完整 Web 服务架构! 🚀


网站公告

今日签到

点亮在社区的每一天
去签到