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

nginx轉發丟失session的問題

問題描述: 在Nginx配置反向代理的時候,須要將一個特定的URL請求轉發到一個帶有頁面的Web後臺管理系統。部署完成以後發現該後管系統沒法正常登錄,輸入正確帳號密碼後報錯密碼錯誤,後臺錯誤日誌爲:html

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

**緣由及解決: **java

nginx在每次傳遞請求時,若是沒有傳遞cookie,即上述添加項,服務器將視爲兩次請求,所以會從新生成一個新的session,導致session數據丟失。
解決方法: 在 location / {}中添加 proxy_cookie_path /XXX/ /;便可。nginx

Tomcat配置JVM內存參數沒有生效的問題

首先要知道怎麼修改Tomcat的JVM內存參數,大致上分爲兩種:web

  1. 直接修改startup.sh 這個腳本
  2. 修改Catalina.sh腳本,由於執行startup.sh這個腳本時會去讀Catalina.sh這個腳本里面配置的參數,配置的時候直接在註釋
# JAVA_OPTS (Optional) Java runtime options used when any command # is executed.

下追加JVM參數便可。sql

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這個腳本,當時插入的代碼是tomcat

set JAVA_OPTS="-Ddruid.registerToSysProperty=true"

通過大牛指點,使用set JAVA_OPTS修改參數時會沒辦法正常讀取後面的「 JAVA_OPTS=」配置的參數,一樣修改成同樣的安全

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

就能夠了。ruby

web應用啓動Druid數據源報錯「unregister mbean error」的問題

問題描述: Tomcat中部署了兩個web應用,啓動時報錯拋異常bash

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進行檢查

相關文章
相關標籤/搜索