项目上生产时踩到的一些坑(待总结)

本贴最后更新于 2601 天前,其中的信息可能已经斗转星移

nginx 转发丢失 session 的问题

**问题描述:**在 Nginx 配置反向代理的时候,需要将一个特定的 URL 请求转发到一个带有页面的 Web 后台管理系统。部署完成之后发现该后管系统无法正常登陆,输入正确账号密码后报错密码错误,后台错误日志为:

java.lang.IllegalStateException: Cannot create a session after the response has been committed

**原因及解决: **

nginx 在每次传递请求时,如果没有传递 cookie,即上述添加项,服务器将视为两次请求,因此会重新生成一个新的 session,致使 session 数据丢失。
解决方法:
在 location / {}中添加 proxy_cookie_path /XXX/ /;即可。

Tomcat 配置 JVM 内存参数没有生效的问题

首先要知道怎么修改 Tomcat 的 JVM 内存参数,大体上分为两种:

  1. 直接修改 startup.sh 这个脚本
  2. 修改 Catalina.sh 脚本,因为执行 startup.sh 这个脚本时会去读 Catalina.sh 这个脚本里面配置的参数,配置的时候直接在注释
#   JAVA_OPTS       (Optional) Java runtime options used when any command
#                   is executed.

下追加 JVM 参数即可。

JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"
JAVA_OPTS="$JAVA_OPTS -Xms2048M -Xmx4096M -XX:PermSize=2048m -XX:MaxPermSize=4096m"
JAVA_OPTS="$JAVA_OPTS -Xloggc:/applog/log/gc-myapplication.log -XX:+PrintGCDateStamps -XX:+PrintGCDetails"
JAVA_OPTS="$JAVA_OPTS -XX:-OmitStackTraceInFastThrow -XX:ErrorFile=/applog/log/hs_err_%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/applog/log/"
JAVA_OPTS="$JAVA_OPTS -Ddruid.registerToSysProperty=true"

问题描述:
部署时碰到的问题是采用第二种方式配置时没有生效,具体表现时执行 ps -ef | grep tomcat 这条指令时看不到进程信息中的 jvm 参数。

**原因及解决: **
简单来说就是之前因为为了解决数据库连接池问题时修改了 catalina.sh 这个脚本,当时插入的代码是

set JAVA_OPTS="-Ddruid.registerToSysProperty=true"

经过大牛指点,使用 set JAVA_OPTS 修改参数时会没办法正常读取后面的“ JAVA_OPTS=”配置的参数,同样修改为一样的

JAVA_OPTS="$JAVA_OPTS -Ddruid.registerToSysProperty=true"

就可以了。

web 应用启动 Druid 数据源报错“unregister mbean error”的问题

问题描述:
Tomcat 中部署了两个 web 应用,启动时报错抛异常

ERROR [com.alibaba.druid.stat.DruidDataSourceStatManager] – unregister mbean error
javax.management.InstanceNotFoundException: com.alibaba.druid:type=DruidDataSourceStat
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean………

原因及解决:
这个问题在搜索时发现很多人都碰到过,推测原因一说是当 tomcat 中部署了两个 web 项目时且均有数据源的连接时就有问题(与我部署项目的情况相符),另一说时版本问题,暂时原因悬而未决...
修改 Tomcat 下的 catalina.sh:
在最后面,不要放在前面或者中间的逻辑判断附近
增加此句代码:
set JAVA_OPTS="-Ddruid.registerToSysProperty=true"
或者在开头 JAVA_OPTS 处添加
JAVA_OPTS="$JAVA_OPTS -Ddruid.registerToSysProperty=true"

编写 JSP 使 NFV 监测应用是否健康的问题

**问题描述:**项目上线后客户要求在每个 web 容器里面都要做应用的健康检测和数据库的健康检测。因为集群中大概有 8 台服务器上都部署了 web 应用,每个应用都是双机部署。而用户请求又是通过 NFV 负载均衡机到达的 web 应用集群,所以客户要求在负载均衡机转发请求的时候需要做服务器和应用以及数据的健康检测,即一个请求过来经过负载均衡机时要判断该服务器 web 端口是否还通,web 应用是否还能正常访问,以及数据是否还能通过 web 应用正常连接(后来该条要求去掉了)。
JSP 写法(注释部分为测试数据库是否正常连接)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page info="database handler"%>
<%@ page import="java.util.*"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.servlet.*"%>
<%@ page import="javax.servlet.http.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<%
	
/* 	String driver = "oracle.jdbc.driver.OracleDriver";
	
	String url = "JDBC:oracle:thin:@120.24.101.229:1522:orcl";
	
	String user = "idsp_ifp";
	
	String password = "123456"; */
	
	out.print("success");
	
	/* try {

		Class.forName(driver);
		
		Connection conn = DriverManager.getConnection(url, user, password);
	
		Statement statement = conn.createStatement();
	
		String sql = "SELECT  1 FROM DUAL";
		
		ResultSet rs = statement.executeQuery(sql);

		if (rs.next()) {
			out.print("success");
		}
		rs.close();
		conn.close();
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
	} catch (SQLException e) {
		e.printStackTrace();
	} catch (Exception e) {
		e.printStackTrace();
	} */

%>
</body>


</body>
</html>

解决:
其实解决方法很简单,服务器健康检测只需要监听 tomcat 使用的 web 端口即可。而应用的健康检测则需要我们单独写一个 jsp,只需要简单的打印一个关键字,而 NFV 负载均衡机只需要一直检测这个 jsp 即可,当 JSP 不能正常访问时将请求转发到另外一台服务器即可。

配置文件部署在应用之外方便更改的问题

logback 日志输出位置和输出级别的问题

Tomcat 更改 log 日志打印位置的问题

Tomcat server.xml 配置最大并发连接数的问题

生产版本对应 svn 版本控制 Tag 的问题

使用 Druid 对数据库连接的密码进行加密

Oracle 导入数据库脚本

quartz 定时任务配置说明,修改配置文件还是修改表

SSL 证书安全性的问题

Nginx 转发是考虑会话一致性的问题

请求加签和密码加签的问题,使用 RSA 非对称性加密的问题

使用 Jmap、Jstat 和 Jconsole 等工具对 JVM 进行检查

  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    149 引用 • 257 回帖
  • 总结
    205 引用 • 1748 回帖 • 2 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...