前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java开发环境系列:一篇能帮你解决99%线上问题的Tomcat排雷日记

Java开发环境系列:一篇能帮你解决99%线上问题的Tomcat排雷日记

作者头像
架构师小跟班
发布2019-08-06 17:15:59
8160
发布2019-08-06 17:15:59
举报
文章被收录于专栏:架构师小跟班架构师小跟班

安装

下载地址:https://archive.apache.org/dist/tomcat/

推荐使用免安装版的Tomcat(放在没有中文和空格的目录下),直接解压就好,前提是已经安装了JDK并配置了环境变量。 Linux环境下解压命令:

unzip -o apache-tomcat-6.0.44-client.zip或:tar -xzvf apache-tomcat-7.0.69.tar.gz

测试

双击startup.bat,浏览器输入url:http://localhost:8080/,若弹出Tomcat主页(黑框不能关)则安装成功。 查看catalina.out日志文件, 如果有如下错误,找到conf\Catalina\localhost文件夹,里面有两个xml文件host-manager.xml、manager.xml,删掉他们在启动Tomcat就没问题了。

如何查看当前版本?

linux 下进入tomcat安装文件夹的bin目录下 执行./version.sh

windows下进入tomcat安装文件夹的bin目录下 执行./version.bat

如何配置管理员?

配置文件:/conf/tomcat-users.xml <?xml version="1.0" encoding="UTF-8"?> <tomcat-users>  <role rolename="manager"/>  <role rolename="admin"/>  <role rolename="manager-gui"/>  <role rolename="admin-gui"/>  <user username="admin" password="admin" roles="admin-gui,admin,manager-gui,manager"/> </tomcat-users> 注意:如果Eclipse中设置的“Server Locations”是“Use Tomcat installation(takes control of Tomcat installation)”,则不能直接修改tomcat安装目录/conf下的tomcat-users.xml,需要在Eclipse中修改该文件,且在启动tomcat时才会生效,生效时会自动更新tomcat安装目录下的tomcat-users.xml

如何解决端口冲突问题?

配置文件:/conf/server.xml 注意:8080为默认端口,可以将其修改为任意的端口,建议使用1024以上的端口,避免与公用端口冲突。 修改:重启应用。 <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/> 端口冲突 在cmd窗口下,netstat -ano,找到端口号对应的PID,在任务管理器中→进程→找到对应的进程,结束进程即可。

如何修改最大线程数?

server.xml <Connector port="8880" protocol="HTTP/1.1"                connectionTimeout="20000"                redirectPort="8443" maxThreads="1500" maxProcessors="450"                URIEncoding="UTF-8"/>

如何解决关闭一个Tomcat会将其他Tomcat同时关掉的问题?

原因: shutdown.bat文件有一句:if not "%CATALINA_HOME%" == "" goto gotHome,执行关闭命令的时候,程序会根据CATALINA_HOME去查找,这句话的意思是如果环境变量配置的这个路径不为空,就执行这个,否则就“set CATALINA_HOME=%CURRENT_DIR%”,也就是将当前的路径赋值给它。 解决办法就是在这一句的前面加上rem,将它给注释掉,这样每次执行命令的时候就只会对当前路径进行操作了。 即: rem if not "%CATALINA_HOME%" == "" goto gotHome 同理,如果启动tomcat时提示端口已被使用(address already in use),也有可能是因为关联启动了别的Tomcat导致占用了同一个端口,解决办法就是在startup.bat中这个地方加上rem。 如图:

运行多个服务

如果需要让一个Tomcat运行多个服务,只需要复制server.xml文件中的<Service>元素,并修改相应的参数,便可以实现一个Tomcat运行多个服务,当然必须在不同的端口提供服务。

设置WEB容器位置(针对eclipse)

如果为灰色,需要把tomcat下的所有項目移除。并右击,clean...之后方可設置,启动后将又变为黑色。(Eclipse默认把部署的项目放在workspace工作空间中,MyEclipse默认放在Tomcat安装路径下) 选择第二个,这样在Eclipse启动了tomcat服务器,我们也能访问到tomcat本地管理首页。否則只能在DOS下使用Tomcat的启动命令才能访问Tomcat本地管理首页。

Tomcat目录结构

bin: 启动和关闭tomcat的服务器.

conf: 这个路径比较重要.放的是tomcat服务器的配置文件.

lib: tomcat支持的jar包

存放Tomcat服务器的核心类库(JAR文件);

如需扩展Tomcat,可将第三方类库复制到这个目录下。

logs: tomcat的日志记录.

temp: tomcat的临时文件的路径.

webapps:存放开发的项目的.一般情况下 一个项目会是一个文件夹.

该目录用于自动部署web应用;

将Web应用复制在该目录下,Tomcat会将该应用自动部署在容器中。

work: JSP被编译后文件存放的路径.(若发布新版本后页面仍显示老版本内容,可以将work目录下的文件清空,重新启动Tomcat),保存Web应用运行过程中编译生成的.class文件;该文件可以删除,但是每次启动Tomcat服务器时系统将再次建立该目录。

WEB工程/项目的目录结构

    web工程

            |--存放html 、css、js、img

            |--WEB-INF

            |-- web.xml  (当前项目配置文件)

            |-- classes   存放java类编译后的文件.

            |-- lib 需要使用的第三方的jar包.

内存溢出问题如何解决?

在Eclipse中,内存溢出(报不能创建JAVA虚拟机错时,也可能是这里配错了。) 1、双击Tomcat,点击Open launch configuration,Arguments, 2、在VM arguments文本域最后边加: -Xms256m -Xmx1024m -XX:MaxPermSize=256m MyEclipse中 1、依次选择Preferences,Servers,Tomcat,Tomcat 6.x 2、在Optional program arguments后面加上: -Xms256m -Xmx1024m -XX:MaxPermSize=256m Linux系统下 1、在Tomcat安装目录下的/bin目录下:修改catalina.sh,加入: JAVA_OPTS='-server -XX:PermSize=256M -XX:MaxPermSize=512m -Xmx15360m' 2、使用【chmod 777 catalina.sh】给catalina.sh赋权。

JSP页面乱码问题如何排查和解决?

JSP页面中告诉浏览器使用什么编码: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> HTML中设置: <meta http-equiv="content-type" content="text/html;charset=utf-8"> Servlet中设置: response.setContentType("text/html;charset=utf-8"); response.getWriter().print(str); 服务器接收浏览器传递的中文参数:

如果是POST请求: request.setCharacterEncoding("utf-8"); String userName = request.getParameter(); 注:getParameter()获取POST请求参数默认使用ISO-8859-1编码,setCharacterEncoding()方法仅对POST请求有效。 如果是GET请求: String name = request.getParameter("username"); name = new String(name.getBytes("iso-8859-1"),"utf-8"); 在Tomcat容器的server.xml中配置URIEncoding: <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" /> 浏览器地址栏编码 http://localhost:8080/servlet/regist?name="张三" 如果在浏览器地址栏中直接给出带参数的URL,不是通过超链接方法访问服务器,那么这个参数是GBK编码的。没有办法处理这问题,因为在页面使用UTF-8编码,Servlet需要用UTF-8来解码,而此时URL中编码是GBK。但直接在地址栏中根本就不应该直接输入带有参数的URL,只有超链接中的URL是受页面的编码控制的。

IE6对UTF-8不友好(使用JS处理) IE6对UTF-8不是很友好!它会把两个字节当成一个中文来处理,当字节数为奇数时,那么就最后一个字节就会丢失。例如我们的GET参数是“大家好”,对于UTF-8编码而言,它就是9个字节,因为中文在UTF-8编码中3个字节,三个汉字对应9个字节。IE6认为2个字节是一个汉字,那么最后一个字节不会发送到服务器端,IE6很不安全。 处理这个问题的办法是把GET请求中的参数使用JavaScript做URL编码,URL编码后的内容就不再是中文了,这样IE6也就不会丢失字节了。 <a href='javascript:_go()'>Encoding</a> <script type="text/javascript"> function _go() { location.href = encodeURI("EncodingServlet?name=大家好"); } </script>

http://localhost/encoding/EncodingServlet?name=%E5%A4%A7%E5%AE%B6%E5%A5%BD 在使用URL编码后,大家好已经变成了%E5%A4%A7%E5%AE%B6%E5%A5%BD。这样就不会再丢失字节了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装
  • 测试
  • 如何查看当前版本?
  • 如何配置管理员?
  • 如何解决端口冲突问题?
  • 如何修改最大线程数?
  • 如何解决关闭一个Tomcat会将其他Tomcat同时关掉的问题?
  • 运行多个服务
  • 设置WEB容器位置(针对eclipse)
  • Tomcat目录结构
  • WEB工程/项目的目录结构
  • 内存溢出问题如何解决?
  • JSP页面乱码问题如何排查和解决?
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档