部署生產環境時踩到的一些坑


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導入數據庫腳本

quarz定時任務配置說明,修改配置文件還是修改表

SSL證書安全性的問題

Nginx轉發是考慮會話一致性的問題

請求加簽和密碼加簽的問題,使用RSA非對稱性加密的問題

使用Jmap、Jstat 和Jconsole等工具對JVM進行檢查


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM