【网站架构部署与优化】Tomcat优化、Tomcat多实例部署

news2024/9/27 5:35:57

文章目录

  • Tomcat优化
    • Tomcat 配置文件参数优化
      • 示例配置
    • Tomcat JVM 参数配置
      • 参数解释
      • 注意
    • 总结
      • Tomcat 配置文件参数优化 (`server.xml`)
        • 1. 线程池参数
        • 2. 网络连接参数
        • 3. 性能优化参数
      • Java 虚拟机(JVM)调优
        • 1. 堆内存设置
        • 2. 新生代和老年代设置
        • 3. 垃圾收集器设置
        • 4. 其他性能优化参数
      • 常见错误及解决方法
  • Tomcat多实例部署
    • 1. 安装JDK和Tomcat
    • 2. 配置Tomcat环境变量
    • 3. 修改Tomcat配置文件
    • 4. 更新启动和停止脚本
    • 5. 启动Tomcat实例
    • 6. 浏览器访问测试

Tomcat优化

高并发、资源利用效率和稳定性等因素。为了提升 Tomcat 的运行效率和稳定性,我们可以从操作系统、Tomcat 配置文件以及 Java 虚拟机(JVM)三个方面进行优化。

Tomcat 配置文件参数优化

Tomcat 的配置文件主要是 conf/server.xml,其中 <Connector> 标签是优化的重点之一。以下是一些常用的优化参数及其解释:

  • redirectPort:当 HTTP 连接器接收到 HTTPS 请求时,重定向到的端口。
  • maxThreads:Tomcat 可创建的最大线程数,即支持的最大并发连接数。默认值可能较低,根据服务器硬件和负载情况调整。
  • minSpareThreads:Tomcat 启动时初始化的线程数,即最小空闲线程数。
  • maxSpareThreads:最大备用线程数,一般不需要设置,默认为-1(无限制)。
  • processorCache:线程池中的线程在空闲时会被缓存起来,以便快速响应新的请求。这个值可以根据 maxThreads 设定或设为-1。
  • URIEncoding:Tomcat 容器的 URL 编码格式,通常设置为 UTF-8。
  • connectionTimeout:网络连接超时时间,单位毫秒。
  • enableLookups:是否反查域名。为了提高性能,应设置为 false
  • disableUploadTimeoutconnectionUploadTimeout:与上传文件相关的超时设置。
  • acceptCount:当所有处理请求的线程都在使用时,可接受的最大请求队列长度。
  • maxKeepAliveRequests:长连接的最大请求数。
  • compressioncompressionMinSizecompressableMimeType:控制是否对响应进行 GZIP 压缩及其相关设置。

示例配置

以下是一个示例配置,展示了如何在 server.xml 文件中调整 <Connector> 的参数:

vim /usr/local/tomcat/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1" 
           connectionTimeout="20000" 
           redirectPort="8443"
           <!-- 以下配置项在第71行之后插入 -->
           minSpareThreads="50" 
           <!-- 设置Tomcat启动时创建的最小空闲线程数,确保始终有一定数量的线程准备处理请求 -->
           enableLookups="false" 
           <!-- 禁用DNS查询,提高处理请求的速度 -->
           disableUploadTimeout="true" 
           <!-- 禁用上传超时,允许长时间上传文件 -->
           acceptCount="300" 
           <!-- 设置当所有线程都在处理请求时,允许的最大连接队列长度 -->
           maxThreads="500" 
           <!-- 设置Tomcat能够创建的最大线程数,即最大并发处理能力 -->
           processorCache="500"
           <!-- 设置处理器缓存大小,用于提升并发请求处理能力 -->
           URIEncoding="UTF-8" 
           <!-- 设置URL编码格式为UTF-8,确保正确处理各种字符集 -->
           maxKeepAliveRequests="100"
           <!-- 设置一个长连接上允许的最大请求数,超过此数将关闭连接 -->
           compression="on" 
           <!-- 启用响应数据的GZIP压缩,减少传输数据量 -->
           compressionMinSize="2048" 
           <!-- 设置响应报文的最小压缩大小,只有大于此值的报文才会被压缩 -->
           compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png"
           <!-- 指定可以进行压缩的MIME类型 -->
/>

查看 Tomcat 线程:
在 Linux 系统中,你可以使用 ps 命令结合 -T-p 选项来查看指定 Tomcat 进程的线程信息:

ps -T -p <PID>

这里 <PID> 是 Tomcat 进程的 ID。这个命令会列出该进程下所有的线程及其相关信息。
你的配置和解释已经很详细了,但有一些地方需要根据现代JVM(特别是从Java 8开始)的实际情况进行调整和澄清。下面是对你原始配置和说明的详细整理及更新:

Tomcat JVM 参数配置

对于2C4G(2核CPU,4GB内存)的服务器环境,以下是一个推荐的JVM配置示例,适用于Tomcat运行在Java 8或更高版本上:

vim /usr/local/tomcat/bin/catalina.sh

配置添加在 Tomcat 的 bin 目录下 catalina.sh 里,位置在 cygwin=false 前。

# 在 catalina.sh 中设置 JAVA_OPTS
JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -Xmn768m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/tomcat/temp/oom.hprof -XX:ParallelGCThreads=2 -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Djava.awt.headless=true -XX:+DisableExplicitGC"

# 确保这行在 cygwin=false 之前
cygwin=false

参数解释

  • -server:启用Server模式的JVM,适用于长时间运行的服务端应用。一定要作为第一个参数,在多个CPU时性能佳。
  • -Xms:堆内存的初始大小,是分配JVM的初始内存,默认为物理内存的1/64。一般来讲,此值设的大点,程序会启动的快一点。
  • -Xmx:堆内存的最大大小,是分配JVM的最大内存,默认为物理内存的1/4。如果程序运行需要占用更多的内存,超出了这个设置值,就会抛出OutOfMemory异常。
  • 默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。
  • 因此建议-Xms与-Xmx设成一样的值,均设为物理内存的一半。其目的是为了能够在java垃圾回收机制清理完堆区内存后不需要重新计算堆区内存的大小而浪费资源。
  • -Xmn:堆内新生代的大小,通过这个值也可以得到老生代的大小:-Xmx减去-Xmn。官方推荐配置为整个堆的 3/8。
  • 堆区进一步细化分为:新生代、中生代、老生代。
  • java中每新new一个对象所占用的内存空间就是新生代的空间,当java垃圾回收机制对堆区进行资源回收后,那些新生代中没有被回收的资源将被转移到中生代,中生代的被转移到老生代。
  • 整个JVM堆大小 = 新生代大小 + 老生代大小 + 永久代大小
  • -Xss:设置每个线程可使用的内存大小,即栈的大小。一般情况下,设置256k就足够了,此配置将会影响此进程中并发线程数的大小。
  • -XX:ParallelGCThreads:配置并行收集器的线程数,即:同时有多少个线程一起进行垃圾回收。当 CPU 数量小于8,此值建议配置等于 CPU 数量。
    -XX:PermSize:设置非堆内存初始值,即持久代内存大小,默认是物理内存的1/4
    -XX:MaxPermSize:最大非堆内存的大小,即最大持久代内存大小,默认是物理内存的1/4
  • 非堆区内存是不会被java垃圾回收机制进行处理的,且最大堆内存与最大非堆内存的和不能超出操作系统的可用内存。
  • XMX和XMS设置一样大,MaxPermSize和PermSize设置一样大,这样可以减轻伸缩堆大小带来的压力。
  • -XX:+HeapDumpOnOutOfMemoryError 和 -XX:HeapDumpPath:当发生内存溢出时,自动导出堆转储文件,有助于分析内存泄漏问题。
  • -XX:+UseG1GC:从Java 7 Update 4及更高版本开始,推荐使用G1垃圾收集器(Garbage-First)。它比CMS收集器(在Java 9中被标记为废弃)提供了更好的性能和更短的停顿时间。
  • -XX:MaxGCPauseMillis:尝试控制垃圾收集的最大停顿时间(以毫秒为单位)。注意,这是一个目标值,JVM会尽力实现,但不保证总是能达到。
  • -Djava.awt.headless=true:对于不需要图形用户界面的服务器环境,这个设置可以避免AWT尝试加载图形库。
  • -XX:+DisableExplicitGC:禁用显式垃圾收集调用,防止System.gc()被误调用,这可能导致不必要的性能下降。

注意

  • 永久代(PermGen):从Java 8开始,永久代(PermGen space)被元空间(Metaspace)所取代。因此,-XX:PermSize-XX:MaxPermSize 参数不再使用,取而代之的是 -XX:MetaspaceSize-XX:MaxMetaspaceSize。对于大多数应用来说,默认设置(元空间大小根据需要动态增长)就足够了,除非你有特殊需求。
  • CMS收集器:在Java 9及更高版本中,CMS收集器已被标记为废弃,并在Java 14中被完全移除。因此,如果你计划使用较新版本的Java,请考虑使用G1或其他收集器。
  • 内存分配:确保JVM的内存设置不会超出物理内存的限制,否则可能会导致系统交换(swapping),这会严重影响性能。

总结

tomcat优化.docx

Tomcat 配置文件参数优化 (server.xml)

在 Tomcat 的主配置文件 server.xml 中,可以调整多个参数以优化性能。以下是一些常用的优化参数及其说明:

1. 线程池参数
  • maxThreads: 最大线程数,默认值为 200。根据服务器负载和业务需求调整。
  • minSpareThreads: 最小空闲线程数,默认值为 10。可根据实际情况调整以减少创建新线程的开销。
  • maxSpareThreads: 最大备用线程数,默认值为 -1(无限制)。一般不需要设置,除非有特殊需求。
2. 网络连接参数
  • URIEncoding: 指定 Tomcat 容器的 URL 编码格式,如 UTF-8
  • connectionTimeout: 网络连接超时时间,单位毫秒,默认值为 20000 毫秒。
  • acceptCount: 当所有请求处理线程都忙时,可接受的连接队列长度,默认值为 100。
3. 性能优化参数
  • enableLookups: 是否通过反查域名来获取主机名,建议设置为 false 以提高性能。
  • compression: 是否对响应数据进行 GZIP 压缩,建议设置为 onforce 以减少传输数据量。
  • compressionMinSize: 压缩响应的最小值,默认为 2048 字节。
  • compressableMimeType: 指定需要压缩的 MIME 类型。

Java 虚拟机(JVM)调优

Tomcat 作为 Java 程序,运行在 JVM 上,因此 JVM 的调优对 Tomcat 性能至关重要。以下是一些常用的 JVM 启动参数:

1. 堆内存设置
  • -Xms: 设置 JVM 初始化堆内存大小,建议与 -Xmx 设置相同值以避免内存波动。
  • -Xmx: 设置 JVM 最大堆内存大小,建议设置为物理内存的 50% 左右。
2. 新生代和老年代设置
  • -XX:NewSize-XX:MaxNewSize: 分别设置新生代初始大小和最大大小。
  • -Xmn: 新生代大小(Eden + 2*Survivor),可替代 -XX:NewSize-XX:MaxNewSize
  • -XX:SurvivorRatio: Eden 区与 Survivor 区的比例。
3. 垃圾收集器设置
  • -XX:+UseSerialGC: 使用串行垃圾收集器。
  • -XX:+UseParallelGC-XX:+UseParallelOldGC: 使用并行垃圾收集器,分别针对新生代和老年代。
  • -XX:+UseConcMarkSweepGC 和相关参数: 使用 CMS 垃圾收集器,适用于对停顿时间敏感的应用。
4. 其他性能优化参数
  • -XX:+UseBiasedLocking: 启用偏向锁优化。
  • -XX:+DisableExplicitGC: 禁止程序中显式调用 System.gc()
  • -XX:+UseCMSInitiatingOccupancyOnly-XX:CMSInitiatingOccupancyFraction: 控制 CMS 垃圾收集器的触发时机。

常见错误及解决方法

  1. Java Heap Space 溢出
    • 错误: java.lang.OutOfMemoryError: Java heap space
    • 解决方法: 调整 -Xms-Xmx 的值,增加 JVM 堆内存大小。
  2. PermGen Space 溢出
    • 错误: java.lang.OutOfMemoryError: PermGen space
    • 解决方法: 在 JDK 8 之前,使用 -XX:MaxPermSize 设置永久代大小;JDK 8 及以上版本已移除永久代,使用元空间(Metaspace)。
  3. StackOverflowError
    • 错误: java.lang.StackOverflowError
    • 解决方法: 检查并修改导致栈溢出的代码,如减少递归深度、优化函数调用等。

Tomcat多实例部署

部署多个Tomcat实例可以在同一台服务器上运行多个独立的Web应用,提高资源利用率和系统灵活性。

1. 安装JDK和Tomcat

首先,确保已安装JDK。然后下载并解压Tomcat到指定目录,并创建两个Tomcat实例的目录结构。

cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mkdir /usr/local/tomcat
mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1
cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat2

2. 配置Tomcat环境变量

编辑/etc/profile.d/tomcat.sh文件,为每个Tomcat实例设置独立的环境变量。

vim /etc/profile.d/tomcat.sh
# tomcat1
export CATALINA_HOME1=/usr/local/tomcat/tomcat1
export CATALINA_BASE1=/usr/local/tomcat/tomcat1
export TOMCAT_HOME1=/usr/local/tomcat/tomcat1

# tomcat2
export CATALINA_HOME2=/usr/local/tomcat/tomcat2
export CATALINA_BASE2=/usr/local/tomcat/tomcat2
export TOMCAT_HOME2=/usr/local/tomcat/tomcat2

使环境变量生效:

source /etc/profile.d/tomcat.sh

3. 修改Tomcat配置文件

编辑第二个Tomcat实例的server.xml文件,确保各实例的端口号不冲突。

vim /usr/local/tomcat/tomcat2/conf/server.xml
# 修改Server端口
<Server port="8006" shutdown="SHUTDOWN">
# 修改HTTP Connector端口
<Connector port="8081" protocol="HTTP/1.1">
# 修改AJP Connector端口
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />

4. 更新启动和停止脚本

编辑每个Tomcat实例的startup.shshutdown.sh文件,添加相应的环境变量。

# 对于tomcat1
vim /usr/local/tomcat/tomcat1/bin/startup.sh
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1

vim /usr/local/tomcat/tomcat1/bin/shutdown.sh
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1

# 对于tomcat2
vim /usr/local/tomcat/tomcat2/bin/startup.sh
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2

vim /usr/local/tomcat/tomcat2/bin/shutdown.sh
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2

5. 启动Tomcat实例

分别启动两个Tomcat实例,并检查端口监听情况。

/usr/local/tomcat/tomcat1/bin/startup.sh
/usr/local/tomcat/tomcat2/bin/startup.sh

netstat -natp | grep java

6. 浏览器访问测试

通过浏览器访问两个Tomcat实例,验证是否正常运行。

http://192.168.80.101:8080
http://192.168.80.101:8081

注意

  • 确保每个Tomcat实例的端口号唯一,避免冲突。
  • 在修改配置文件和脚本时,务必小心谨慎,防止误操作导致服务中断。
  • 定期检查和更新Tomcat实例及其依赖库,确保系统安全性和稳定性。

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

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

相关文章

基于springboot+vue 旅游网站的设计与实现

基于springbootvue 旅游网站的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c…

【中级通信工程师】终端与业务(五):市场与通信市场

【零基础3天通关中级通信工程师】 终端与业务(五)&#xff1a;市场与通信市场 本文是中级通信工程师考试《终端与业务》科目第五章《市场与通信市场》的复习资料和真题汇总。终端与业务是通信考试中最基础的科目之一&#xff0c;复习重点包括通信市场的概念、通信市场结构、以…

【IOS】申请开发者账号(公司)

官网&#xff1a;Apple Developer (简体中文) 申请开发者账号前提 如果是第一次申请建议注册一个新的apple id作为组织的开发者账号。&#xff08;确保apple id的个人信息是真实的&#xff0c;不能是网名或者是其他名。后续的申请步骤需要能和apple id的个人信息对上。&#…

嵌入式开发 —— IO口高阻态模式

目 录 高阻态输入模式一、区别于浮空输入二、高阻态输入的优点 高阻态输入模式 MCU管脚的高阻态模式是电路的一种输出或输入状态。在这种状态下&#xff0c;电路的输入端或输出端对地或对电源的电阻非常大&#xff0c;在实际应用中与引脚悬空类似。 电气特性 1、高电阻值&…

C#入门教程

目录 1.if分支语句 2.面向对象 3.static简单说明 1.if分支语句 我们的这个C#里面的if语句以及这个if-else语句和C语言里面没有区别&#xff0c;就是打这个输出上面的方式不一样&#xff0c;c#里面使用的是这个console.writeline这个指令&#xff0c;其他的这个判断逻辑都是一…

技术美术百人计划 | 《5.1.3 PBR-基于物理的灯光》笔记

1. 辐射度学 定义&#xff1a;辐射度学是一门以整个电磁波段的电磁辐射能测量为研究的科学。 而计算机图形学中涉及的辐射度学&#xff0c;则集中于整个电磁波普中光学谱段中的可见光谱段的辐射能的计算。 1.1. 立体角 概念&#xff1a;单位球体上的一块区域对应的球面部分的…

计算机毕业设计 中医院问诊系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

uniapp自定义底部tabBar

使用场景&#xff1a;在一个非tabbar页面&#xff0c;想要有底部导航效果&#xff0c;故自定义效果&#xff0c;系统原底部导航栏仍在正常使用 效果&#xff1a; 布局&#xff1a; <template><view class"tab-bar" :style"{height: height px}"…

《征服数据结构》哈夫曼树(Huffman Tree)

摘要&#xff1a; 1&#xff0c;哈夫曼树的介绍 2&#xff0c;哈夫曼树的构造 3&#xff0c;哈夫曼树带权路径长度计算 4&#xff0c;哈夫曼树的编码 5&#xff0c;哈夫曼树的解码 1&#xff0c;哈夫曼树的介绍 哈夫曼树(Huffman Tree)也叫霍夫曼树&#xff0c;或者赫夫曼树&am…

游戏怎么录制?王者荣耀游戏录制指南:iOS与电脑端全面教程

在王者荣耀的战场上&#xff0c;每一个五杀、每一次极限逃生都可能成为你游戏生涯中的高光时刻。但这些瞬间往往转瞬即逝&#xff0c;如何将它们永久保存&#xff0c;成为你游戏历程中不可磨灭的印记呢&#xff1f;本文将为你揭晓答案。无论你是手持iPhone的iOS用户&#xff0c…

正则中捕获组和非捕获组区别

捕获组和非捕获组 一. 捕获组&#xff08;Capturing Groups&#xff09;二. 非捕获组&#xff08;Non-Capturing Groups&#xff09;三. 区别四. 选择使用 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;…

GESP等级考试C++二级-数学函数

C的cmath库中有丰富的数学函数&#xff0c;通过这些函数可以进行相应的数学计算。 1 cmath库的导入 通过import指令导入cmath库&#xff0c;代码如图1所示。 图1 导入cmath库的代码 2 abs()函数 abs()函数用来获取指定数的绝对值&#xff0c;代码如图2所示。 图2 abs()函数…

【递归】7. leetcode 404 左叶子之和

1 题目描述 题目链接&#xff1a;左叶子之和 2 解答思路 递归分为三步&#xff0c;接下来就按照这三步来思考问题 第一步&#xff1a;挖掘出相同的子问题 &#xff08;关系到具体函数头的设计&#xff09; 第二步&#xff1a;只关心具体子问题做了什么 &#xff08;关系…

macOS安装Redis教程, 通过brew命令, 时间是2024年9月26日, redis版本是0.7.2

搜索: brew search redis安装Redis: brew install redis关于启动命令的提示: To start redis now and restart at login:brew services start redis Or, if you dont want/need a background service you can just run:/opt/homebrew/opt/redis/bin/redis-server /opt/home…

【图像处理】多幅不同焦距的同一个物体的平面图象,合成一幅具有立体效果的单幅图像原理(二)

实现多幅不同焦距图像合成一幅具有立体效果的图像可以使用以下算法和开源库&#xff1a; 实现算法 图像对齐 使用特征点匹配&#xff08;如 SIFT、SURF 或 ORB&#xff09;来对齐图像。利用 RANSAC 算法剔除离群点&#xff0c;估计变换矩阵。 深度图生成 基于图像的焦距和视角…

Teams集成-会议侧边栏应用开发-会议转写

Teams应用开发&#xff0c;主要是权限比较麻烦&#xff0c;大量阅读和实践&#xff0c;摸索了几周&#xff0c;才搞明白。现将经验总结如下&#xff1a; 一、目标&#xff1a;开发一个Teams会议的侧边栏应用&#xff0c;实现会议的实时转写。 二、前提&#xff1a; 1&#x…

探索5 大 Node.js 功能

目录 单线程 Node.js 工作线程【Worker Threads】 Node.js 进程 进程缺点 工作线程 注意 集群进程模块【Cluster Process Module】 内部发生了什么&#xff1f; 为什么要使用集群 注意&#xff1a; 应用场景&#xff1a; 内置 HTTP/2 支持 这个 HTTP/2 是什么&…

OpenHarmony(鸿蒙南向)——平台驱动指南【PWM】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 PWM即脉冲宽度调制&#xff08;Pulse Width Modul…

【Linux】部署 flask

文章目录 一、安装Python3环境二、将本地开发环境的依赖项目生成清单文件三、创建虚拟环境启用虚拟环境退出虚拟环境 四、添加自定义系统服务(很重要) 一、安装Python3环境 1.首先安装编译环境(后续需要从python官网获取Python3的源码自己编译python yum install zlib-devel …

案例研究丨国控星鲨利用DataEase释放数据潜能,重塑业务视野

国药控股星鲨制药&#xff08;厦门&#xff09;有限公司&#xff08;以下简称为国控星鲨&#xff09;始创于1952年&#xff0c;前身为厦门鱼肝油厂&#xff0c;距今已经有70余年历史&#xff0c;是国家商务部认定的“中华老字号”企业。2011年&#xff0c;国药控股与厦门轻工集…