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 内存参数,大体上分为两种:
- 直接修改 startup.sh 这个脚本
- 修改 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 不能正常访问时将请求转发到另外一台服务器即可。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于