生产环境中要以daemon方式运行tomcat

通常在开发环境中,我们使用$CATALINA_HOME/bin/startup.sh来启动tomcat, 使用$CATALINA_HOME/bin/shutdown.sh来关闭tomcat。 而在生产环境中,我们要配置tomcat使其以daemon方式运行,这是因为:

  • 以daemon运行不受终端影响,不会因为退出终端而停止运行
  • 可以让tomcat以普通用户身份运行,可以让tomcat随linux启动而启动

如何将tomcat配置成守护进程

将tomcat配置成守护进程需要借助apache-commons-daemon项目的jsvc工具, 该工具通常包含在tomcat包中(bin/commons-daemon-native.tar.gz)

1. 配置JAVA_HOME, CATALINA_HOME两个环境变量

export JAVA_HOME=/opt/jdk
export CATALINA_HOME=/opt/tomcat

2. 编译安装jsvc

cd $CATALINA_HOME/bin
tar -xvf commons-daemon-native.tar.gz
cd commons-daemon-1.0.x-native-src/unix
./configure
make
cp jsvc ../..

3. 创建运行tomcat的普通用户tomcat

useradd -s /sbin/nologin tomcat

4. 修改$CATALINA_HOME的所属用户户和用户组,使tomcat可以用tomcat这个普通用户运行

chown -R $CATALINA_HOME tomcat
chgrp -R $CATALINA_HOME tomcat

5. 修改制作tomcat启动脚本

$CATALINA_HOME/bin/daemon.sh是tomcat官方为我们提供的启动脚本,我们只需要修改即可。

将该脚本复制到/etc/init.d中

cp $CATALINA_HOME/bin/daemon.sh  /etc/init.d/tomcat

有注释位置加入chkconfig配置,使得该脚本可以被chkconfig识别,从而配置成开机启动

#chkconfig: 2345 85 15

由于service命令会去除系统环境变量,因此在脚本开始位置加入以下内容:

JAVA_HOME=/opt/jdk
CATALINA_HOME=/opt/tomcat
TOMCAT_USER=tomcat

6. 设置tomcat开机启动

chkconfig tomcat on

经过上面的配置,tomcat就能够以守护进程方式运行了,而且会随开机启动而启动。

7. 使用service方式启动关闭tomcat

service tomcat start
service tomcat stop

tomcat安全配置

1. 版本安全

升级当前tomcat版本为最新稳定版本。

在升级版本中,需要注意两点:

尽量避免跨大版本的升级

将当前老版本的server.xml , catalina.sh, web.xml和tomcat-users.xml进行备份,然后部署完新的tomcat后,将这些配置文件覆盖过去。

2. 隐藏版本信息

当tomcat出现404或其它错误时,就会显示当前版本信息,为避免针对某一版本的攻击,我们应该将其隐藏或伪装

版本信息的显示是由一个jar包控制的,该jar包存放在tomcat安装目录下的lib目录下,名称为catalina.jar.

通过jar xf命令解压这个jar包会得到两个目录META-INF和org, 通过修改org/apache/catalina/util/ServerInfo.properties文件中的serverinfo字段来实现更改tomcat版本信息:

[root@localhost ~]# cat org/apache/catalina/util/SererInfo.properties | grep -v '^$|#'
server.info=Apache Tomcat/7.0.53
server.number=7.0.53.0
serer.built=Mar 25 2014 06:20:16

当然还有另外一种方法来隐藏或伪装版本信息,这两种方法本质是一样的:

[root@localhost ~]# cd /usr/local/apache-tomcat-7.0.53/lib
[root@localhost lib]# mkdir -p org/apache/catalina/util
[root@localhost lib]# cd org/apache/catalina/util
[root@localhost util]# vim ServerInfo.properties
server.info=nolinux # 如果想修改成其它版本号,把这个地方的值改成其它值就行了

修改完成之后,重启tomcat即可看到效果!

tomcat的配置优化

1. 优化web.xml

servlet与其它适用于整个Web应用程序设置的配置文件,必须符合servlet规范的标准格式。通过它可以配置你web应用的相关选项,tomcat在启动的时候会读取这个文件,完成你开发的系统的一些初始化操作。

它可以做如下事情:

  • 提供基于servlet的相关配置
  • 增加监听器,监控session或在tomcat启动时,加载一些你希望加载的资源。比如创建数据库连接池等
  • 设置session过期时间,tomcat默认是30分钟
  • 更改应用的默认页面,通常为index.html/index.jsp等
  • 增加过滤器, 做一些你希望的过滤操作,比如敏感词汇的过滤
  • 增加一些jstl(标准标签库)的定义,方便在jsp中直接include进来
  • struts, spring或hibernate的一些配置等

由于在生产环境中,tomcat不会直接对公网提供服务,前端肯定有apache或nginx,因此,默认主页或自定义错误页,我们都在前端的apache或nginx中完成;另外也有可能是由程序员在项目内的WEB-INF/web.xml中去做定义。

在tomcat新版本中,默认已经禁止列目录功能。

下面是几种觉的功能,在web.xml中的表现形式:

站点默认主页:

自定义错误页:

定义会话超时时间:

禁止列目录:

2. tomcat-user.xml的优化

该文件中包含用户名,角色及密码。 负责提供webapps下manager项目的登录认证管理。

在生产环境中,我们需要将该文件全部注释。

3. 优化server.xml

maxThreads连接数限制:

maxThreads是tomcat所能接受的最大连接数。 一般设置不要超过8000, 如果你的网站访问量非常大可使用多个tomcat实例的方法,即在一个服务器上启动多个tomcat,然后做负载均衡。

tomcat和php不同,php可以按照cpu和内存的情况去配置连接数,所以上万很正常。 但java还需要注意jvm的参数配置。如果不注意就会因为jvm参数过小而崩溃。

多个虚拟主机:

强烈建议不要使用tomcat的虚拟主机功能,推荐一个tomcat实例启动一个站点。即,可以启动多个tomcat,而不是一个tomcat里包含多个虚拟主机。 因为tomcat是多线程,共享内存,任何一个虚拟主机中的应用崩溃,都会影响到所有的应用程序。

压缩传输:

tomcat也支持gzip压缩功能。 可以在server.xml配置文件中的Connector节点中配置如下参数,来实现对指定资源类型进行压缩。

compression="on"             # 打开压缩功能
compressionMinSize="50" # 启用压缩的输出内容大小,默认为2KB
noCompressionUserAgents="gozilla, traviata" # 对于以下的浏览器,不启用压缩
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" # 哪些资源类型需要压缩

要注意的是,对于文本信息比如txt, html, css,javascript进行压缩,效果非常好。而对文件,图片,视频不要压缩。

4. 管理AJP端口:

AJP是为tomcat与HTTP服务器之间通信而定制的协议,能提供较高的通信速度和效率。如果前端是apache的话,会使用到AJP这个连接器,如果是nginx,就用不上了,因此需要注销掉:

<!--
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
-->

5. 更改关闭tomcat实例的指令

server.xml中定义了可以直接关闭tomcat实例的管理端口。 我们通过 telnet连接上该端口之后,输入shutdown即可关闭。值得注意的是,虽然实例关闭了,但是进程还是存在的。由于默认的端口和指令都很简单,默认端口是8005, 指令为SHUTDOWN. 因此我们要改得复杂一点(当然,新版本的tomcat管理端口监听在127.0.0.1):

<Server port="8005" shutdown="9SDKJ29jksjf23sjf0LSDF92JKS9DKkjsd">

6. 更改tomcat服务监听端口:

<Connector port="8080" address="172.16.100.1" />

7.关闭war自动部署:

<Host name="localhost"  appBase=""
unpackWARs="false" autoDeploy="false">

8. 禁用tomcat管理页面:

删除webapps目录下的所有文件,还涉及到管理页面的2个配置文件host-manager.xml和manager.xml也要删除,这两个文件在tomcat安装 目录下的conf/Catalina/localhost目录下。

9. 使用普通用户启动tomcat

在启动之前需要将tomcat安装目录下所有文件的属主和属组都设置为指定的用户。

tomcat生产服务器性能优化

1. tomcat内存优化

tomcat内存优化主要是对tomcat启动参数优化,我们可以在tomcat启动脚本catalina.sh中设置JAVA——OPTS参数。

JAVA_OPTS='-Xms1024m -Xmx2048m -XX:PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m'

参数说明:

-server  启用jdk 的 server 版;
-Xms java虚拟机初始化时的最小内存;
-Xmx java虚拟机可使用的最大内存;
-XX:PermSize 内存永久保留区域
-XX:MaxPermSize 内存最大永久保留区域

-Xmx 默认为物理内存的1/4, 实际建议不大于4GB;一般建议设置-Xms = -Xmx

-server   一定要作为第一个参数,在多个cpu时性能 佳

-Xms    初始heap大小,使用的最小内存,cpu性能 高时可以设置的大一些

生产环境中tomcat的配置的更多相关文章

  1. 【原】Storm Local模式和生产环境中Topology运行配置

    Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...

  2. 生产环境中使用脚本实现tomcat start|status|stop|restart

    一.在实际生产环境中tomcat启动是在bin目录下采用自带脚本startup.sh启动:使用shutdown.sh关闭.如下图: 再如果对于新手来讲在不知道路径情况下重启是一件头痛的事情(注意没有r ...

  3. 一个完整配置例nginx.conf(生产环境中使用)

    一个完整的nginx配置案例,生产环境 一个完整配置例(生产环境中使用) user nobody nobody; worker_processes 4; worker_rlimit_nofile 51 ...

  4. mysql8在生产环境中的配置

    一,配置文件的位置 [root@yjweb ~]# ll /etc/my.cnf -rw-r--r-- 1 root root 935 Mar 11 16:52 /etc/my.cnf 说明:通常我们 ...

  5. CentOS系统中Tomcat安装配置

    Tomcat简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache.Sun和其他一些公司及个人共同开发而 ...

  6. 【生产环境】Tomcat运行一段时间后访问变慢分析历程

    环境运行一天或者几天,网站访问就很卡,手机端app访问页面出现白屏.Tomcat运行一段时间后访问变慢,但是cpu,内存都正常.日志也是发现不了啥.... 问题的原先分析 1.环境配置(cpu,内存, ...

  7. 理解Docker(6):若干企业生产环境中的容器网络方案

    本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  8. 生产环境中CentOS7部署NET Core应用程序

    NET Core应用程序部署至生产环境中(CentOS7) 阅读目录 环境说明 准备你的ASP.NET Core应用程序 安装CentOS7 安装.NET Core SDK for CentOS7. ...

  9. 生产环境中使用Docker Swarm的一些建议

    译者按: 实践中会发现,生产环境中使用单个Docker节点是远远不够的,搭建Docker集群势在必行.然而,面对Kubernetes, Mesos以及Swarm等众多容器集群系统,我们该如何选择呢?它 ...

随机推荐

  1. 通达OA系统优化-对mysql数据库减肥

    OA系统冗余数据过多,访问效率受到影响,现需要对历史数据进行一次清理,以提高OA访问速度 大的数据主要体现在流程上,流程数据主要放在flow_run,flow_run_data,flow_run_pr ...

  2. 脚本检测CDN节点资源是否与源站资源一致

    需求: 1.所有要检测的资源url放到一个单独文件中 2.检测cdn节点资源大小与源站文件大小是否一致 3.随机抽查几个资源,检查md5sum是否一致 4.使用多线程,可配置线程数 代码目录: hex ...

  3. Jquery hover方法使用及 mouseenter与mouseleave和 mouseover与mouseout的区别

    定义和用法 hover() 方法规定当鼠标指针悬停在被选元素上时要运行的两个函数. jQuery 1.7 版本前该方法触发 mouseenter 和 mouseleave 事件. jQuery 1.8 ...

  4. javascript判断是用什么设备打开

    var userAgentInfo = navigator.userAgent //查看浏览器用于 HTTP 请求的用户代理头的值 var agents = ["Android", ...

  5. Json学习整理

    1:javascript对JSON的支持 2:java对JSON的支持 alibaba->fastjson 封装工具类: import com.alibaba.fastjson.JSONObje ...

  6. Reactor模型-多线程程版

    1.概述 在Reactor单线程版本的设计中,I/O任务乃至业务逻辑都由Reactor线程来完成,这无疑增加了Reactor线程的负担,高负载情况下必然会出现性能瓶颈.此外,对于多处理器的服务器来说, ...

  7. easyUI基础入门

    头部需要引人文件:<!DOCTYPE html><html><head> <meta charset="utf-8"> <ti ...

  8. Spring集成shiro做登陆认证

    一.背景 其实很早的时候,就在项目中有使用到shiro做登陆认证,直到今天才又想起来这茬,自己抽空搭了一个spring+springmvc+mybatis和shiro进行集成的种子项目,当然里面还有很 ...

  9. C#--整型与字节数组byte[]之间的转换

    using System; int  i = 123;byte [] intBuff = BitConverter.GetBytes(i);     // 将 int 转换成字节数组lob.Write ...

  10. Webpack安装和命令

    1.定位到创建的目录 cd H:\webpacktest 2.初始化: npm init 3.一路回车 4.执行(安装到项目的依赖项中) npm install webpack --save-dev ...