문제 상황
프로젝트 환경을 새로 설정하면서 원본 서버의 설정을 대상 서버로 복제하는 작업을 진행했습니다. 원본 서버는 Tomcat에서 SSL(443번 포트)이 활성화된 상태로 잘 동작하고 있었기 때문에, 대상 서버에서도 동일한 설정을 적용했습니다.
그러나, Tomcat을 시작하자마자 아래와 같은 에러가 발생했습니다
Caused by: java.net.BindException: 주소가 이미 사용 중입니다
at sun.nio.ch.Net.bind0(Native Method)
...
Tomcat의 로그를 확인해보니, 443번 포트가 이미 사용 중이라는 내용이었습니다. 하지만 원본 서버에서는 이런 문제가 없었기 때문에 한참 헤매게 되었습니다.
원인 분석
대상 서버를 자세히 살펴보니, **Apache HTTP 서버(httpd)**가 설치되어 있었습니다.
Apache HTTP 서버는 기본적으로 80번(HTTP) 포트와 443번(HTTPS) 포트를 사용합니다. Tomcat에서도 443번 포트를 사용하려고 설정되어 있었기 때문에, 두 서버가 충돌하면서 포트 사용 문제가 발생한 것입니다.
결국 대상 서버에 HTTP 서버가 설치된 사실을 몰랐던 것이 문제의 원인이었습니다.
해결 방법
이 문제를 해결하기 위해 아래 단계를 거쳤습니다:
포트 충돌 확인 먼저, 대상 서버에서 443번 포트를 누가 사용 중인지 확인했습니다
sudo lsof -i :443
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 1234 root 10u IPv4 12345 0t0 TCP *:https (LISTEN)
- 해결 방안 선택
- Apache HTTP 서버를 비활성화 또는 제거
- Tomcat의 SSL 포트를 변경
- Apache를 리버스 프록시로 설정하여 Tomcat과 연동
- Apache HTTP 서버 중지
sudo systemctl stop httpd
sudo systemctl disable httpd
교훈
- 환경 확인의 중요성
새로운 서버 환경에서는 **기본적으로 설치된 서비스(예: HTTP 서버)**가 무엇인지 먼저 확인해야 합니다. 특히, 잘 알려진 포트(80, 443 등)는 다른 서비스가 사용하고 있을 가능성이 높습니다. - 효율적인 디버깅 방법
포트 충돌 문제를 해결하기 위해서는 다음 명령어를 적극적으로 활용하면 좋습니다:- netstat -tuln → 현재 사용 중인 포트 확인
- lsof -i :<port> → 특정 포트를 점유하고 있는 프로세스 확인
- 원본 서버와 대상 서버의 차이점 확인
원본 서버에서 아무 문제가 없더라도, 대상 서버의 환경이 다를 수 있다는 점을 항상 염두에 두어야 합니다.
마무리
이번 경험은 단순한 포트 충돌이었지만, 대상 서버 환경을 제대로 이해하지 않고 설정을 복제하려다 발생한 문제였습니다. 다음부터는 환경 구성 전에 기본 설정을 꼼꼼히 확인하고, 효율적인 디버깅 과정을 통해 시간을 절약할 수 있을 것 같습니다.
비슷한 문제를 겪고 계신 분들께 도움이 되었길 바랍니다!
'Trouble Shooting > java' 카테고리의 다른 글
Tomcat의 JVM 메모리 설정 문제 해결 (setenv.sh 수정) (0) | 2024.11.21 |
---|