nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > Nginx+Tomcat负载均衡、动静分离群集

Nginx+Tomcat负载均衡、动静分离群集全过程

作者:ikun·

Nginx与Tomcat分别作为高性能Web服务器和Java应用容器,常用于负载均衡与动静分离,提升系统性能与可用性,Nginx处理静态资源及反向代理,Tomcat承载动态业务,二者协作可优化架构并应对高并发场景

一、 nginx 简介

Nginx 是一款轻量级的高性能 Web 服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协议下发行。

其特点是占有内存少,并发能力强,在同类型的网页服务器中表现优异,常用于处理高并发场景。

1. 核心功能

高性能

反向代理与负载均衡

高可用性

模块化设计

2. 典型应用场景

Web 服务器

反向代理与负载均衡

HTTP 终端代理

API 网关

3. 对比 apache

特性NginxApache
架构事件驱动(异步非阻塞)多进程 / 线程(同步阻塞)
并发处理高(单进程数万连接)中等(受进程 / 线程数限制)
资源消耗
模块扩展需编译时添加运行时动态加载
配置复杂度简洁(基于块结构)灵活但复杂

4. 适用场景

5. 基础配置示例

以下是一个简单的 Nginx 配置文件片段,展示了静态网站托管和反向代理的基本配置:

# 全局配置
worker_processes auto;
error_log /var/log/nginx/error.log warn;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # 静态网站配置
    server {
        listen 80;
        server_name example.com;

        root /var/www/html;
        index index.html;

        location / {
            try_files $uri $uri/ =404;
        }
    }

    # 反向代理配置
    server {
        listen 80;
        server_name api.example.com;

        location / {
            proxy_pass http://backend_server:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

二、 tomcat 简介

Apache Tomcat 是一个开源的 Servlet 容器,由 Apache 软件基金会开发和维护。

它实现了 Java Servlet、JavaServer Pages (JSP)、Java Expression Language (EL) 和 WebSocket 等技术规范,是运行 Java Web 应用程序的核心平台。

1. 核心功能

轻量级

开源免费

扩展性强

与 Apache HTTP Server 集成

2. 基本架构

Tomcat 的核心组件包括:

3. 典型应用场景

Java Web 应用部署

微服务架构

开发测试环境

与其他服务器配合

4. 配置示例

以下是一个简化的server.xml配置片段,展示了基本的 HTTP 连接器和虚拟主机配置:

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  
  <Service name="Catalina">
    <!-- HTTP连接器 -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    
    <!-- 引擎 -->
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      
      <!-- 虚拟主机 -->
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <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>
    </Engine>
  </Service>
</Server>

5. 与 nginx 的协作模式

在生产环境中,Tomcat 通常与 Nginx 配合使用:

Nginx 作为反向代理

server {
    listen 80;
    server_name example.com;
    
    location / {
        proxy_pass http://tomcat_server:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

动静分离

负载均衡

Nginx 通过 upstream 模块将请求分发到多个 Tomcat 实例:

upstream tomcat_cluster {
    server tomcat1:8080;
    server tomcat2:8080;
}

server {
    listen 80;
    location / {
        proxy_pass http://tomcat_cluster;
    }
}

6. 性能优化建议

(1) 调整 JVM 参数

修改catalina.shsetenv.sh,设置合适的堆内存和垃圾回收器:

JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC"

(2) 优化连接器

server.xml中调整 HTTP 连接器参数:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
           maxThreads="200" acceptCount="100" />

(3) 禁用不必要的服务

注释掉server.xml中不需要的组件(如 AJP 连接器)。

(4) 使用 APR 连接器

对于高并发场景,启用 APR(Apache Portable Runtime)以提升性能:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" />

三、 实验步骤

1. 实验环境

部署nginx+tomcat负载均衡需要以下设备

tomcat1 服务器192.168.10.102
tomcat2 服务器192.168.10.103
nginx 服务器192.168.10.101

2. 准备 tomcat 网站

##两台tomcat服务器配置一致
[root@localhost /]# dnf -y install java         //安装实验需要的环境
[root@localhost /]# mkdir -p /web/webapp1
[root@localhost webapp1]# ls
index.jsp
 
##第一台tomcat服务器
[root@localhost webapp1]# cat index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
<html>   
<head>
     <title>JSP test2 page</title>   </head>
   <body>
     <% out.println("动态页面 1,http://www.test2.com");%>
   </body> 
   <body> 
    <div>动态页面的图片 1</div><br><img src="logo.png"> 
   </body> 
</html>
 
 
##第二台tomcat服务器
[root@localhost webapp1]# cat index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
<html>   
<head>
     <title>JSP test2 page</title>   </head>
   <body>
     <% out.println("动态页面 2,http://www.test2.com");%>
   </body> 
   <body>  
   <div>动态页面的图片 2</div><br><img src="logo.png"> ##为了方便验证两台服务器页面可以不一致
   </body> 
</html>

3. 修改 nginx 的配置文件

[root@nginx /]# vim /usr/local/nginx/conf/nginx.conf
##这个要写在http部分
 upstream my_tomcat {
            server 192.168.10.102:8080 weight=1;
            server 192.168.10.103:8080 weight=2;
    }
 
 
##新添加的localtion部分
location ~ .*\.jsp$ {
                proxy_set_header HOST $host; 
                proxy_pass http://my_tomcat;
}
 
##检查配置文件是否有误
[root@nginx /]# nginx -t
 
##重载nginx服务
[root@nginx /]# nginx -s reload

4. 修改 tomcat 的配置文件

##两台服务器都要配置
[root@localhost /]# vim /usr/local/tomcat/conf/server.xml       
<Context docBase="/web/webapp1" path="" reloadable="false">        ##在150行添加
            </Context>
 
docBase  ##指定网页的路径
path=""  ##定义 Web 应用的访问路径(上下文路径)
reloadabel   ##控制 Tomcat 是否自动检测应用文件的修改并重新加载应用 
false(默认值)   ##不自动重新加载,修改文件后需手动重启 Tomcat 或应用。
true            ##开启自动重新加载
 
##重启两台服务器,使配置文件生效
[root@localhost /]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost /]# /usr/local/tomcat/bin/startup.sh

5. 验证

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文