이 글은 단순한 작업 기록을 넘어, 비슷한 문제를 겪을 동료들에게 가이드가 될 수 있도록 작성하였습니다.
단순히 "배포에 성공했다" 는 결과보다, 그 과정에서 마주친 수많은 'Permission Denied' 와 '접속불가' 메시지들을 어떻게 논리적으로 해결했는지 초점을 맞췄습니다. 저와 같은 주니어 개발자분들에게 이 글이 도움이 됐으면 좋겠습니다.
대두분을 로컬 환경에서 테스트를 하고 Git 에 배포하는 과정만 하다가 실제 서비스를 24시간 꺼지지 않는 별도의 서버에 돌아가게 만들어보라는 요청에 Maven 과 Spring 기반의 프로젝트를 회사 원격 서버에 올리는 임무를 진행했습니다.
Terminus 를 통해 서버에 접속하여 보안상 공용 계정이 아닌 내 전용 계정을 생성하여 작업을 진행하였습니다.
톰캣을 설치하고, 빌드된 ---.war 파일을 톰캣의 webapps 폴더에 넣는 것까지는 순조로웠습니다.
"너 권한 있어?"
톰캣을 실행하기 위해 bin 폴더로 이동해 ./startup.sh 를 입력하였지만 아래와 같은 오류가 발생했습니다.
-bash: ./startup.sh: Permission denied
리눅스는 다중 사용자 시스템입니다. 파일마다 읽기(r), 쓰기(w), 실행(x) 권한이 소유자, 그룹, 기타 사용자별로 엄격히 나뉩니다.
따라서 root 계정으로 접속하여 sudo 명령어를 사용해 권한을 주었습니다.
# 1. root 계정으로 전환 (또는 관리자 권한 사용)
sudo su -
# 2. 톰캣 폴더 전체의 소유권을 내 계정(my-user)으로 변경
# -R 옵션은 하위 폴더와 파일까지 모두 적용한다는 뜻입니다.
chown -R my-user:my-user /usr/local/lib/apache-tomcat-9.0
# 3. 실행 파일(.sh)들에 실행 권한 부여
chmod +x /usr/local/lib/apache-tomcat-9.0/bin/*.sh
# 4. 다시 내 계정으로 돌아와 실행!
./startup.sh
포트 문제
기본적으로 톰캣은 8080 포트를 사용합니다.
하지만 이미 회사에서는 다른 서비스가 해당 포트를 사용하고 있기도 했고 보안 및 관리상의 이유로 포트를 변경해야 했습니다.
따라서 포트를 4080 으로 변경하였습니다.
server.xml 수정
톰캣의 모든 핵심 설정은 conf/server.xml 에 담겨 있습니다.
<Connector port="8080" protocol="HTTP/1.1" ... />
<Connector port="4080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
따라서 위와 같이 수정을 하였습니다.
또한 위와 같이 설정 후에 리눅스 자체 방화벽에서도 4080 포트를 허용해 주어야 했습니다.
sudo firewall-cmd --permanent --add-port=4080/tcp
sudo firewall-cmd --reload
포트포워딩
방화벽까지 열었는데도 외부에서 접속이 되지 않았습니다.
구글링을 해보니 서버 구조에 있었습니다.
실제 서버 내부에 Oracle VM VirtualBox 를 통해 가상 머신(VM) 이 돌아가고 있었습니다.
포트포워딩을 사용하는 이유
저희 회사에서는 실제 주소(공인 IP) 가 하나인데, 그 안에 여러 개의 가상 컴퓨터가 살고 있습니다.
외부에서 데이터가 들어오면 호스트서버에 도착을 하게 됩니다. 하지만 호스트를 이러한 데이터가 어떤 VM 으로 가야 하는지 모르고 있습니다. 따라서 60600 번 포트로 오는 건, 내부 VM 의 4080 포트로 전달해야 한다 라는 규칙을 정하는 것입니다.
당연한 말이지만 60600 이라는 포트도 호스트 서버의 방화벽에서 열어주어야 합니다.
Jenkins 를 이용한 CI/CD 자동화
원격 서버에 최종 배포를 완료하고, CI/CD 를 자동화 하기 위해 Jenkins 를 이용하였습니다.
Jenkins 설정에서 호스트주소를 제대로 입력했음에도 배포가 되지 않아 찾아보니 톰캣에서 거부를 하고 있었습니다. Jenkins 가 톰캣의 Manager App 에 접근하여 파일을 업로드 하려면, 권한을 가진 계정 정보가 톰캣 설정에 등록이 되어야 합니다.
<tomcat-users>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="my-user" password="my-password" roles="manager-gui,manager-script"/>
</tomcat-users>
위와 같이 tomcat-users.xml 에 계정 정보에 대한 설정을 완료하여 해결을 하였습니다.
마치며
1. 리눅스는 권한으로 시작해서 권한으로 끝난다.
2. 네트워크 층이 있다. 호스트 방화벽뿐만 아니라 VM 의 포트포워딩 구조를 이해해야 서비스가 보인다.
3. CI/CD 는 양방향 약속이다. Jenkins 뿐만 아니라 받는 쪽(Tomcat) 에서도 허용을 해주어야 한다.
'Java' 카테고리의 다른 글
| 빈 검증에 대하여 (1) | 2026.03.23 |
|---|---|
| 필터와 인터셉터 (0) | 2026.03.16 |
| 마이바티스 (0) | 2026.03.05 |
| ConcurrentHashMap 에 대하여 (3) | 2025.06.06 |
| 유용한 람다식 함수들 (2) | 2025.02.04 |