AWS EC2를 사용하여 Apache [WS] 와 Tomcat[WAS]을 구성했습니다.
ws
Red Hat Enterprise Linux 9 (HVM), SSD Volume Type
t2.micro
yum install net-tools
sudo yum -y update
# Apache 설치 , ※Apache 기본 설치 Directory : /etc/httpd
# 참고 : https://ko.linux-console.net/?p=2178
yum -y update
yum install httpd -y
# httpd 실행
systemctl start httpd
# 시스템 부팅이 될 때마다 무조건 httpd 켜지게 하기
systemctl enable httpd
# httpd 실행 상태 확인
systemctl status httpd
# netstat을 통해 httpd 가 80포트를 사용중인지 확인!
netstat -tnlp
httpd 가 기본적으로 읽는 Directory는 /var/www/html
/var/www/html
안에 임의로 만든 index.html
을 넣고 테스트 해보자.
# 테스트 방법
# /var/www/html 로 접근
cd /var/www/html
# html을 하나 만들자
touch index.html
# index.html 에 들어가서 내가 알아볼 수 있는 내용 수정
vi index.html
# http://{AWS EC2 WS 서버 IP} 접속 후, index.html에 적은 내용이 보이는지 확인
여기서 데이터를 읽지 못한다면 권한 문제가 있을 수 있다.
ls -al
을 통해 권한을 확인하자 r 권한이 있어야 브라우에서 확인이 가능하다.sudo chmod 744 index.html
로 읽기 권한을 부여하자.vi /etc/httpd/conf/httpd.conf
# ServerName 설정 - 필요한 이름으로
ServerName example:80
# 사용하는 DocumentRoot에 맞춰서 설정
<Directory "/home/example">
AllowOverride None
# Allow open access:
Require all granted
</Directory>
# Apache의 Response Header 에서 Apache 버전 정보 제거하기
# - 하지 않으면 버전 유추로 인해서 해킹의 위험성 올라감!!
# 파일 맨 마지막에 해당 내용 추가
ServerTokens Prod
ServerSignature off
해당 파일
혹은 VirtualHost
의 DocumentRoot
설정시 /var/www/html
말고 다른 경로를 사용할 경우 접속시 Forbidden 이 뜰 수 도 있다.You don't have permission to access this resource.
- 이건 SELinux 문제이다.
- 참고 : https://yuttong.tistory.com/13, https://www.happyjung.com/lecture/2481
- 직접 끄기 [비 추천]
# 직접 끄기
vi /etc/sysconfig/selinux
SELINUX=enforcing → disabled [ 비활성화 ]
# 현재 SELinux의 동작 모드 확인
getenforce
# Enforce 라면 Permissive 모드 로 변경하기
sudo setenforce 0
# 현재 SELinux의 동작 모드 다시 확인 - Permissive 인지 확인
getenforce
# 하나의 파일이나 디렉터리를 변경할 경우
chcon -t httpd_sys_content_t /example/test
# chmod와 같이 하위 파일이나 디렉터리를 모두 변경할 경우
chcon -R -h -t httpd_sys_content_t /example/test
# -R : 하위 모든 파일과 디렉터리의 보안사항을 변경한다.
# -h : 심볼릭링크를 따르지 않도록 한다.
EC2 생성
was
Red Hat Enterprise Linux 9 (HVM), SSD Volume Type
t2.micro
EC2 접속 후 환경설정
yum install net-tools
sudo yum -y update
★★★ 꼭 꼭 사용하시는 Tomcat의 JDK 버전을 확인하고 진행해주세요!!! ★★★
# jdk1.8
yum -y update
yum list java*jdk-devel
yum install java-1.8.0-openjdk-devel.x86_64 -y
# openjdk version "1.8.0_332" 나오는지 확인
java -version
vi /etc/profile
# 해당 내용으로 수정
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64
JRE_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64/jre
CATALINA_HOME=/usr/local/tomcat
CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/lib-jsp-api.jar:$CATALINA_HOME/lib/servlet-api.jar
PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:/bin:/sbin
export JAVA_HOME JRE_HOME CATALINA_HOME CLASSPATH PATH
source /etc/profile
10.0.8
로 다운받아서 진행]yum install wget -y
wget http://archive.apache.org/dist/tomcat/tomcat-10/v10.0.8/bin/apache-tomcat-10.0.8.tar.gz
mv apache-tomcat-10.0.8.tar.gz /usr/local/
cd /usr/local/
tar -xzvf /usr/local/apache-tomcat-10.0.8.tar.gz
#심볼릭 링크
ln -s /usr/local/apache-tomcat-10.0.8 /usr/local/tomcat
ln -s /usr/local/tomcat /root/tomcat
#톰캣 구동 프라퍼티 설정
vi /usr/local/tomcat/bin/setenv.sh
# 둘 중 택 1 - Tomcat에서 WAR를 시작할때 setenv.sh 파일을 읽어서 구동을 합니다.
# dev
export JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=dev -Duser.language=ko -Duser.country=KR"
# prod
export JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=prod -Duser.language=ko -Duser.country=KR"
chmod +x /usr/local/tomcat/bin/setenv.sh
#mod_jk는 ajp 프로토콜을 사용합니다.
#톰캣이 mod_jk 연결을 받을 수 있도록 tomcat 환경설정 수정
vi /usr/local/tomcat/conf/server.xml
#아래 부분 찾아서 주석 제거해주고, secretRequired="false"부분 추가
<Connector protocol="AJP/1.3"
address="0.0.0.0"
port="8081"
redirectPort="8443" secretRequired="false" />
#톰캣 서버 정보 노출 하지 않기
#톰캣으로 직접 접속하지 않는 경우 (mod_jk 쓰는 경우) : 해당 부분 주석처리하기.
#톰캣으로 직접 접속하는 경우 : server="Server" 추가
<Connector port="8080" protocol="HTTP/1.1" ...
#톰캣 스타트
/usr/local/tomcat/bin/startup.sh
#톰캣 종료
/usr/local/tomcat/bin/shutdown.sh
AWS EC2 WAS 서버 인바운드 포트
에 내가 mod_jk
로 설정한 포트 (8081
) 열어주기 - 할당할 IP는 WS IP 주소로 할당
업로드할 WAR 파일의 이름이 "ROOT" 가 아니라면, 직접 파일명을 server.xml에 추가해줘야 한다.
# Tomcat의 server.xml 파일을 연다
sudo vi /usr/local/tomcat/conf/server.xml
# Host 태그를 찾는다. <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
# Host 태그 밑에 해당 내용을 추가한다.
# 그리고 docBase에는 원하는 파일명을 넣는다. 예시 ) example-SNAPSHOT1.war 파일을 사용할 경우
<Context path="/" docBase="example-SNAPSHOT1" reloadable="false" > </Context>
# Tomcat 재시작
sudo /usr/local/tomcat/bin/shutdown.sh
sudo /usr/local/tomcat/bin/startup.sh
WAR 배포가 잘 되지 않는다면 Tomcat의 버전을 확인해야 합니다. Tomcat이 사용하는 JDK 버전이 11로 올라가면서 JavaEE를 Jakarta로 사용하게 되면서 호환이 잘 안됩니다.
해당 글을 참고해주세요
mod_jk
설치wget
을 다운로드 받는다yum install wget -y
tar xvfz tomcat-connectors-1.2.48-src.tar.gz
tomcat-connectors-1.2.48-src / native
폴더에 들어간다cd tomcat-connectors-1.2.48-src/native/
apxs(APache eXtenSion)
는 httpd-devel
이 필요합니다.sudo yum install httpd-devel
gcc
가 필요합니다. 없으면 설치합니다.sudo yum install gcc
./configure --with-apxs=/usr/bin/apxs
redhat-rpm-config
를 설치sudo dnf install redhat-rpm-config
make
file apache-2.0/mod_jk.so
apache-2.0/mod_jk.so: ~~~
sudo cp apache-2.0/mod_jk.so /usr/lib64/httpd/modules/
/etc/httpd/conf.d
로 이동sudo cd /etc/httpd/conf.d
httpd-jk.conf
파일을 만들어준다.sudo touch httpd-jk.conf
httpd-jk.conf
파일에 해당 내용을 넣는다.LoadModule jk_module modules/mod_jk.so
<IfModule jk_module>
JkWorkersFile conf.d/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
#JkShmFile 내용 반드시 넣어줄 것 - Selinux 보안때문에 공유 메모리파일 위치 반드시 명시해야함
JkShmFile run/mod_jk.shm
JkMountFile conf.d/uriworkermap.properties
</IfModule>
workers.properties
파일을 만들어준다.sudo touch workers.properties
workers.properties
파일에 해당 내용을 넣는다.worker.list=exampleWorker # 사용할 worker 이름
worker.secbank.type=ajp13 # AJP 1.3
worker.secbank.host=192.168.0.2 # 연결할 WAS의 IP로 변경한다.
worker.secbank.port=8081 # 연결한 port
uriworkermap.properties
파일을 만들어준다.sudo touch uriworkermap.properties
uriworkermap.properties
파일에 해당 내용을 넣는다.# 예시
# 확장자가 do 및 jsp 인 모든 url패턴에 대해서 tomcat으로 전송
# (ex http://example.com/test.jsp)
# /*.do=exampleWorker
# /*.jsp=exampleWorker
#assets 하위 내용을 제외한 모든 요청은 tomcat으로 전송
/*=exampleWorker
!/assets/*=exampleWorker
# SELinux 를 Permisive로 변경
setenforce 0
mod_jk
연결하기/etc/httpd/conf.d
에서 mod_jk
로 연결할 VirtualHost conf
파일을 연다example.com.conf
를 연다면<VirtualHost *:80>
안에 해당 내용을 넣어주세요JkMountFile conf.d/uriworkermap.properties
# 필터링 할 조건의 파일을 삽입workers.properties
설정도 제대로 되어있는지 재 확인 (IP 주소 및 포트)AWS EC2 WAS 서버 인바운드 포트
에 내가 mod_jk
로 설정한 포트 (8081
) 랑 IP로 열려있는지 확인mod_jk
연결을 마무리 했다면 WS Apache 퍼블릭 IP로 접속 해서 WAS의 Tomcat 데이터를 잘 읽어오는지 확인server.xml
을 확인해야 한다address
제대로 확인<!-- Define an AJP 1.3 Connector on port 8081 -->
<Connector protocol="AJP/1.3"
address="0.0.0.0"
port="8081"
redirectPort="8443" secretRequired="false"/>
mod_jk
실행 테스트apachectl configtest
mod_jk
연동을 테스트 합니다.sudo service httpd restart
Initializing shm:/etc/httpd/run/mod_jk.shm.75459 errno=13. Unable to start due to shared memory failure.
httpd_t
가 map
, write
관련 권한이 있어야 합니다sudo semanage port -a -p tcp -t http_port_t 8081
setenforce 0
Apache 웹서버
로 브라우저에서 접근 후 Tomcat 사이트가 제대로 나온다면 ok 입니다.sudo service httpd start
sudo service httpd restart
sudo service httpd stop
vi /etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/
디렉토리에서 .conf
로 끝나는 모든 구성 파일을 로드하도록 구성됩니다.IncludeOptional conf.d/*.conf
내용이 존재함/etc/httpd/conf.d
폴더로 들어간다.cd /etc/httpd/conf.d
.conf
파일을 만든다. 예를 들면) example.com.conf
파일을 만든다.sudo touch example.com.conf
example.com.conf 파일에 해당 내용을 넣는다.
#example.com.conf
<VirtualHost *:80>
ServerName example.com # Virtual Host => Host로 들어오는 값이랑 비교할 값
ServerAlias dev.example.com www.example.com # => Alias 설정을 해주면 해당 값들도 같이 해당 가상 호스트로 잡힌다.
ServerAdmin webmaster@example.com
DocumentRoot /home/example/www # 폴더
</VirtualHost>
sudo /usr/local/tomcat/bin/startup.sh
sudo /usr/local/tomcat/bin/shutdown.sh
sudo vi /usr/local/tomcat/conf/server.xml