[tomcat][session] tomcat-redis-session-manager의 timeout 설정이 제대로 안 먹는다면?
tomcat session clustering을 위해서 session container로서 tomcat-redis-session-manager를 사용하고 있다. https://github.com/jcoleman/tomcat-redis-session-manager 기본 설정 파라미터는 아래와 같다. <Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" /> <Manager className="com.radiadesign.catalina.session.RedisSessionManager" host="localhost" <!-- optional: defaults to "localhost" --> port="6379" <!-- optional: defaults to "6379" --> database="0" <!-- optional: defaults to "0" --> maxInactiveInterval="60" <!-- optional: defaults to "60" (in seconds) --> />
그런데, maxInactiveInterval 값을 7200초(=2시간)로 설정해놨는데도 세션이 30분 정도에 끊긴다는 제보를 받았다. 처음엔 그 사실이 의아했는데 소스를 찾아보고 그 이유를 알 수 있었다. RedisSessionHandlerValve.java 의 storeOrRemoveSession() 메소드에서 확인할 수 있다. import org.apache.catalina.Session; ... private void storeOrRemoveSession(Session session) { try { if (session != null) { if (session.isValid()) { log.trace("Request with session completed, saving session " + session.getId()); if (session.getSession() != null) { log.trace("HTTP Session present, saving " + session.getId()); manager.save(session); } else { log.trace("No HTTP Session present, Not saving " + session.getId()); } } else { log.trace("HTTP Session has been invalidated, removing :" + session.getId()); manager.remove(session); } } } catch (Exception e) { // Do nothing. } } 원인은 session이 유효한 지 체크한 후 유효하면 RedisSession을 갱신하는데, 체크하는 session은 Tomcat Session이었던 것이다. 그리고 보통 Tomcat session의 sesion-timeout값을 특별히 설정하지 않으면 default값이 30분이므로, 아무리 tomcat-redis-session-manager의 timout시간을 길게 늘려도 소용이 없었다는… 그래서 아래 내용을 원하는 시간으로 조정해주었다. web.xml <session-config> <session-timeout>30</session-timeout> </session-config> 끝. @ 사실, 크게 소용이 없다고 느껴지는 게, 몇 가지 이유 때문에 ELB에 sticky session을 설정해놔서… -_-)a








