톰캣을 일반 권한의 계정으로 실행해야 하는데, 80이나 443 등 1024 아래의 well-known 포트를 사용해야 하는 경우가 있다. 톰캣 외에도 스프링부트(spring boot)나 와일드플라이(wildfly) 등 자바 기반의 서버 프로그램은 모두 해당하는 내용이다.
이럴 경우 sudo 또는 setcap을 이용하여 해당 포트를 사용할 수 있다.
sudo
https://man7.org/linux/man-pages/man8/sudo.8.html
sudo는 일반 계정에서 명령어 사용 시 명령어 앞에 "sudo"를 입력하는 방식으로 사용하며, 이렇게 "sudo ls"와 같이 사용하면 root 권한으로 "ls" 명령어를 사용한 것과 동일한 효과가 있다(로그인 스크립트까지 적용하려면 "-i" 옵션으로 ".bash_profile" 파일 등을 적용할 수 있다.). sudo 명령어를 사용하기 위해서는 먼저 sudoer로 등록되어야 한다. 등록하는 방법은 /etc/sudoers.d/ 경로에 사용할 계정(여기서는 tomcat)의 sudo 설정파일을 만드는 것이다.
1. visudo 명령어를 이용하여 sudo 설정파일을 생성한다. (vi로 할 경우, 설정 오류가 발생했을 때 체크해 주지 않기 때문에 visudo를 사용하는 것이 좋다.)
sudo visudo -f /etc/sudoers.d/tomcat
2. 톰캣이 systemctl에 시스템 등록이 되어 있는 경우 아래와 같이 내용을 입력한다.
NOPASSWD 부분은 sudo systemctl 명령어 실행 시 패스워드 입력을 받지 않는 설정이다.
tomcat ALL=(ALL:ALL) ALL
tomcat ALL=(ALL) NOPASSWD:/usr/bin/systemctl start tomcat
tomcat ALL=(ALL) NOPASSWD:/usr/bin/systemctl stop tomcat
tomcat ALL=(ALL) NOPASSWD:/usr/bin/systemctl restart tomcat
tomcat ALL=(ALL) NOPASSWD:/usr/bin/systemctl status tomcat
tomcat ALL=(ALL) NOPASSWD:/usr/bin/systemctl start tomcat.service
tomcat ALL=(ALL) NOPASSWD:/usr/bin/systemctl stop tomcat.service
tomcat ALL=(ALL) NOPASSWD:/usr/bin/systemctl restart tomcat.service
tomcat ALL=(ALL) NOPASSWD:/usr/bin/systemctl status tomcat.service
systemctl에 등록이 되어 있지 않은 경우, 아래와 같이 직접 tomcat/bin 내의 실행파일을 사용하도록 설정한다.
tomcat ALL=(ALL:ALL) ALL
tomcat ALL=(ALL) NOPASSWD:/opt/tomcat/bin/startup.sh
tomcat ALL=(ALL) NOPASSWD:/opt/tomcat/bin/shutdown.sh
setcap
setcap(8) - Linux manual page (man7.org)
setcap (set file capability) 은 파일의 가능성(?)을 설정하는 명령어로, 톰캣이 구동되는 java 실행 파일에 권한을 설정하게 된다.
1. setcap 명령어를 사용할 경우, 먼저 톰캣이 구동되는 자바 실행 파일의 실제 경로를 확인한다.
$ which java
/usr/bin/java
$ readlink -f /usr/bin/java
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el8_6.x86_64/jre/bin/java
2. java 파일에 setcap 명령어를 실행한다.
sudo setcap 'cap_net_bind_service=+ep' /data/java/jdk1.7.0_80/bin/java
sudo setcap 'cap_net_bind_service=+ep' /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el8_6.x86_64/jre/bin/java
여기까지 하고 확인을 해 보면 새로운 에러가 발생하고 있다.
$ java -version
java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
3. 공유 라이브러리 설정
위의 에러를 확인하기 위해 공유 라이브러리 설정을 추가로 해야 한다.
libjli.so를 검색한 후,
$ find . -name libjli.so
./lib/amd64/jli/libjli.so
./jre/lib/amd64/jli/libjli.so
/etc/ld.so.conf.d/java.conf 파일을 생성 후, 위에서 찾은 경로의 파일 경로(절대경로를 사용)에서 파일명을 뺀 나머지 경로 부분만을 복사하여 넣는다.
sudo vi /etc/ld.so.conf.d/java.conf
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el8_6.x86_64/lib/amd64/jli
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el8_6.x86_64/jre/lib/amd64/jli
이렇게까지 하고 바로 java -version을 했을 때 아까와 동일한 libjli.so 관련 에러가 발생했다.
자세히 보니 sudo java -version은 잘 되지만 java -version으로만 에러가 발생하는 것이었다.
그러다가 테스트 도중 계정을 exit로 로그아웃 했다가 바로 다시 로그인해서 확인했는데, 갑자기 잘 되고 있다.
어쩌면 셸을 다시 실행해야 적용이 되는 건가 하는 추측이 든다.
--
위의 과정을 거친 후 결과적으로 setcap을 이용한 톰캣 80, 443 포트 설정도 성공이었다.
'IT > 리눅스' 카테고리의 다른 글
마리아디비(MariaDB) 백업 설정 (0) | 2024.07.26 |
---|---|
마리아디비(MariaDB) 리눅스(Linux)에 설치하기 (0) | 2024.07.26 |
Bash Programming-2.Redirection (0) | 2024.07.22 |
Bash Programming-1.HelloWorld (0) | 2024.07.13 |
리눅스 시그널 Linux Signal (0) | 2024.07.12 |