반응형
Caused by: java.sql.SQLException: Too many connections

해당 오류는 mysql에 연결된 클라이언트의 수가 일정수치 이상인 경우 나타난다.

 

 

확인방법
# mysql 접속
> mysql -u 계정 -p
> 비밀번호입력

# 현재 최대 동시 접속 가능 커넥션 수 확인
> show variables like 'max_connections';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| max_connections       | 151   |
+-----------------------+-------+
3 rows in set (0.174 sec)

# 현재 커넥션 관련 정보 확인
> show status like '%CONNECT%';
+-----------------------------------------------+-------+
| Variable_name                                 | Value |
+-----------------------------------------------+-------+
| Aborted_connects                              | 563   |
| Aborted_connects_preauth                      | 0     |
| Connection_errors_accept                      | 0     |
| Connection_errors_internal                    | 563   |
| Connection_errors_max_connections             | 563   |
| Connection_errors_peer_address                | 0     |
| Connection_errors_select                      | 0     |
| Connection_errors_tcpwrap                     | 0     |
| Connections                                   | 998   |
| Max_used_connections                          | 152   |
| Performance_schema_session_connect_attrs_lost | 0     |
| Slave_connections                             | 0     |
| Slaves_connected                              | 0     |
| Ssl_client_connects                           | 0     |
| Ssl_connect_renegotiates                      | 0     |
| Ssl_finished_connects                         | 0     |
| Threads_connected                             | 145   |
| wsrep_connected                               | OFF   |
+-----------------------------------------------+-------+

# Max_used_connections은 최대로 동시에 접속한 수를 의미한다.
# 그러나 맨 처음에 조회한 정보를 보면 최대 동시접속 가능 수는 max_connections=151로 되어있음

# 500으로 늘려봤다.
> set global max_connections=500;
# (타임아웃도 늘림)
> set wait_timeout=60;

# 재시작
> systemctl restart mysql

# 연결수 변경 확인
> show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 500   |
+-----------------+-------+

 

해당 처리 후 해당오류가 사라졌음을 확인했다.

 


참고
  • max_connections - 최대 동시 접속 가능 수 기본값=100
  • wait_timeout - 종료전까지 요청이 없이 기다리는 시간
  • Aborted_connects : MySQL 서버에 접속이 실패된 수
  • Max_used_connections : 최대로 동시에 접속한 수
  • Threads_connected : 현재 연결된 Thread 수

https://m.blog.naver.com/fromyongsik/40158255209

반응형
반응형

 

find ./ -name 'log4j.proper*'

 

log4j.propertise파일을 찾는다

 

결과는

 

./***-apache-tomcat-8.0.45/webapps/***/WEB-INF/classes/log4j.properties

 

이런식으로 나오게 되면 해당 log4j.propertise 파일을 확인한다.

 

vi ./***-apache-tomcat-8.0.45/webapps/***/WEB-INF/classes/log4j.properties

 

vi 편집기로 해당 파일을 확인한다.

 

log4j.rootCategory=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n log4j.category.org.springframework.beans.factory=DEBUG

 

ConsoleAppender을 사용하고 있어 CVE-2021-4104이슈(JMSAppeder사용하는 경우 이슈) 해당없음 확인함.

 

CVE-2021-4104 관련 링크

https://www.cve.org/CVERecord?id=CVE-2021-4104

반응형
반응형

몇일전 log4j 관련해서 취약점이 이슈가 되면서 해당 취약점에 대해 알아보게 되었다.

 

우선 이슈가 되고있는 해당 취약점은 log4j의 버전이 2.x.x부터 2.15.0 미만인 경우에 해당한다고해서

 

만약 이 구간에 해당한다면 권고 버전인 2.15.0으로 log4j를 업데이트 진행해야한다. (단, java8버전이 필요) 

 

java7버전의 마지막 지원되는 버전이 2.12.1이라고한다.

 

그래서 프로젝트들의 log4j 버전을 먼저 확인하게 되었다.

 

우리는 메이븐을 사용하고 있고 pom.xml을 뒤져봐도 되지만

 

귀찮기도하고 한눈에 보기위해 간단하게 명령어를 쳐서 log4j jar 경로를 확인했다.

 

 find ./ -name 'log4j*.jar'

 

해당 명령어를 치게 되면, 내가 있는 위치 기준으로 관련파일들을 찾게 되고

 

아래와 같은 형태로 나온다.

 

./apache-tomcat-8.0.32/webapps/hyperic-sigar-1.6.4/sigar-bin/lib/log4j.jar
./apache-tomcat-8.0.32/webapps/WEB-INF/lib/log4j-1.2.17.jar

 

find 명령어가 아닌 다른방법으로는 log4j jar 파일경로를 새 파일에 저장하는 방법

 

find / -name “log4j-1.*.jar” > RESULT_log4j.txt; find / -name “log4j-core-2.*.jar” >> RESULT_log4j.txt
cat RESULT_log4j.txt

 

 

jar의 버전을 보면 log4j는 1.2.17으로 관련 취약점에 해당사항 없음으로 확인하였다. (pom.xml도 참고)

 

버전이 낮은 버전이라 추후 권고버전으로 업데이트가 필요할 듯 하다.

 

또 다른 이슈로  JMS Appender 사용 여부를 확인하는 방법

 

jar -tf ./apache-tomcat-8.0.45/webapps/WEB-INF/lib/log4j-1.2.17.jar | grep JMSAppender

 

반응형
반응형

서버 로그에 java.net.NoRouteToHostException: 호스트로 갈 루트가 없음

라는 오류가 찍힘. 

 

혹시 접속정보가 잘못 됬나 싶었는데 그것도 아님. 로그인 결과도 성공임 (loginCheck이 true)

FTPClient ftpClient = new FTPClient();

ftpClient.connect(String hostname, int port);

Boolean loginCheck =  ftpClient.login(String username, String password)

 

많은 삽질끝에 어이없게 방화벽 문제였다.

 

https://docs.oracle.com/javase/8/docs/api/

 

Java Platform SE 8

 

docs.oracle.com

api를 뒤져보니

 

public class NoRouteToHostException
extends SocketException

Signals that an error occurred while attempting to connect a socket to a remote address and port. Typically, the remote host cannot be reached because of an intervening firewall, or if an intermediate router is down.

 

번역 : 소켓을 원격 주소 및 포트에 연결하는 동안 오류가 발생했음을 알립니다. 일반적으로 간섭하는 방화벽 때문에 또는 중간 라우터가 다운된 경우 원격 호스트에 연결할 수 없습니다.


해결방법

 

방화벽 상태를 보니 켜져있다(최근에 이 서버 재기동하면서 방화벽이 자동으로 켜진듯)

# systemctl status firewalld

 

방화벽을 stop하고, 재부팅해도 활성화 되지 않도록 설정함.

# systemctl stop firewalld

# systemctl mask firewalld

 

 

반응형
반응형

 

8082로 온 포트를 443(SSL) 포트로 리다이렉트 포트 설정

(http로  온 요청을 https로)

 

톰캣/conf/server.xml

<Connector port="8082" protocol="HTTP/1.1"
connectionTimeout="200000" URIEncoding="UTF-8"
redirectPort="443" />

 

톰캣/conf/web.xml에 아래 코드를 추가

<security-constraint>
	<web-resource-collection>
		<web-resource-name>SSL Forward</web-resource-name>
		<url-pattern>/*</url-pattern>
	</web-resource-collection>
	<user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
	</user-data-constraint>
</security-constraint>

톰캣 재기동하면 적용된다.

 

이렇게만 하면 요청이 302 code로 redirect됨(임시 redirect)

 

구글은 307 요청이길래 차이점을 찾아봄

redirection유형  사용 사례
302 콘텐츠가 일시적으로 이동되었으며 HTTP 방식이 변경될 수 있습니다.
307 콘텐츠가 일시적으로 이동되었으며 HTTP 메서드는 그대로 유지되어야 합니다.

그냥 302로 해야지......

 

다음포스팅은 haproxy에서 http요청을 https로 리다이렉트 하는 글을 기록해야지

반응형
반응형

오류 찾다가 오류가 안나오고 이래서 그냥 System.out.println 써서 직접 디버깅할려고 catalina.out 파일을 찾았더니

이 파일 자체가 생성이 안되고 있었다.

 

catalina.out 로그파일을 생성하는 방법은 간단하다.

 

우선 톰캣디렉토리에가서 아래와 같은 명령어를 친다

##### bin 디렉토리로 이동
cd bin

##### catalina.sh 파일을 편집기(vi)로 연다
vi catalina.sh

 

vi로 파일을 연 상태에서 방향키로 움직여서 (또는 키보드 [ / ]키로 검색) 해당 텍스트가 있는 위치에 가서

if [ -z "$CATALINA_OUT" ] ; then

#CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out 

CATALINA_OUT=/dev/null

 

키보드 [ i ]키를 눌러 insert 가능한 상태로 변하게 되면 아래와같이

[ # ]을 변경해준다.

if [ -z "$CATALINA_OUT" ] ; then

CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out 

#CATALINA_OUT=/dev/null

 

그리고 빠져나오기 위해 :wq로 저장하고 나와서

톰캣을 재기동해주면

톰캣디렉토리/logs에 catalina.out파일이 생성된 것을 볼 수 있다.

 

 

 

 

 

반응형
반응형

 

정의
여러 서버에 요청을 분산시키는 TCP 및 HTTP 기반 애플리케이션을 위한 고가용성 로드 밸런서 및 프록시 서버를 제공하는 무료 오픈소스 소프트웨어이다.
로드밸런싱 (Load Balancing) 이란?

부하 분산을 위해서 가상 ip를 통해 여러 대의 서버에 접속을 분배하는 기능
서버는 클라이언트의 요청이 많아지게되면 서버에는 부하가 걸리게 된다. 이를 해결하기 위한 방법은 크게 두가지가 있다.
1. Scale-up : 서버 사양을 높임
2. Scale-out : 부하를 여러 대의 서버에 분산함

즉, HAProxy는 Scale-out을 위해 로드밸런싱을 해주는 소프트웨어이다.

 

 

구성

 

https://1995-dev.tistory.com/99

L4 Switch, L7 Switch가 제공하는 로드 밸런싱 기능을 제공.
HAProxy는 오픈 소스로 소프트웨어 로드밸런싱을 기능을 제공.
HAProxy 설정 추가를 통해 Scale-Out 도 가능.
HAProxy VRRP (Virtual Router Redundancy Protocol) 지원.
이중화(M / S) Master 장애 시 Slave가 Master VIP (Virtual IP)를 가져와 Master로 승격됨.
반응형
동작

https://1995-dev.tistory.com/99

1. 최초 접근 시 서버에 요청 전달
2. 응답 시 쿠키(Cookie)에 서버 정보 추가 후 반환
3. 재 요청 시 Proxy에서 쿠키 정보 확인 후 최초 요청 서버로 전달
4. 다시 접근 시 쿠키를 추가할 필요 없이 서버에 전달 (클라이언트에 쿠키 정보가 계속 존재하여 재사용)

 

출처
  1. https://leffept.tistory.com/309
  2. https://en.wikipedia.org/wiki/HAProxy
  3. https://1995-dev.tistory.com/99
반응형
반응형

 

# 공인아이피
nslookup myip.opendns.com. resolver1.opendns.com

 

결과 

빨간색 영역에 공인아이피 출력됨

 

# 사설아이피
ipconfig

 

결과 : IPv4 주소가 사설아이피이다.

 

반응형

+ Recent posts