지난 포스팅까지는 톰캣을 설치완료하였다.
이제는 아파치 서버를 설치하고 톰캣과 연동해보자.
왜 아파치서버와 톰캣서버를 연결해야하는가?? 이미 이와 관련한 지식은 많이 포스팅 되어있으니 생략.
이번 포스팅은 인터넷에 떠도는 포스팅이 아닌 직접 실행해보고 에러를 잡아본 내용들을 게시하려고한다. 인터넷에 떠도는 그 예시들은 오류도 많고 생략된 부분들도 많아 직접 실행해보고 확인한 내용들로 게시하려고 한다.
여러분들의 시간을 절약해줄것이다.
여기서 게시할 내용은 mod_jk 방식으로 할것이다. 보편적으로 많이 사용하는 방식이기 때문이다.
자 이제 잘 따라오시길 바란다.
1. 아파치 설치
먼저 apache 서버를 설치하자.
$ sudo yum install httpd -y
이러면 설치가 완료될 것이다.
2. 톰캣 커넥터 설치
그리고 이제 톰캣 커넥터가 필요하다. 톰캣 커넥터는 직접 설치가 필요하다.
wget이 없다면 먼저 설치를 해줘야한다.
$ sudo yum install wget -y
$ sudo wget http://mirror.apache-kr.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz
$ sudo tar xvfz tomcat-connectors-1.2.48-src.tar.gz # 압축해제
$ sudo mv tomcat-connectors-1.2.48-src/ /usr/local/src # 별도 폴더로 이동시켜 관리.
tomcat-connector 압축을 해제했으니 이제 설치해야한다.
설치를 위해서는 몇가지 모듈이 필요하다. 모듈을 설치하지 않으면 커넥터 설치가 안된다.
$ sudo yum install -y autoconf libtool perl httpd-devel
준비되었으니 이제 설치를 해보자.
$ sudo cd /usr/local/src/tomcat-connectors-1.2.48-src/native/ # 압축 해제한 폴더로 이동.
$ sudo ./buildconf.sh
$ sudo ./configure --with-apxs=/usr/bin/apxs
$ sudo make && sudo make install # 설치 고고
$ sudo find / -name "mod_jk.so"
- 이때 파일이 검색 되면 제대로 설치된 것임.
- 혹시 검색이 안되면
$ sudo ls /etc/httpd/modules/mod_jk.so 해보자. 있을것이다.
이렇게되면 일단 설치는 완료이다.
하지만 우리에겐 설정해야할 일이 남아있다.
3. 아파치 서버 설정
vi 사용법을 잠깐 설명하자면
/ 입력시 하단 커서 생김. 검색 단어 입력후 엔터. n 아래로 검색, N 위로 검색
1) httpd.conf 파일에 들어가서 LoadModule 을 찾아 아래 설정을 입력하자.
$ sudo vi /etc/httpd/conf/httpd.conf
....
LoadModule jk_module /etc/httpd/modules/mod_jk.so
<VirtualHost *:80>
ServerName localhost
# 확장자 jsp, json, xml, do를 가진 경로는 woker tomcat으로 연결하는 구문.
JkMount /*.jsp balancer
# 워커의 이름을 적는것. balancer는 밑에 로드밸런서 이다.
JkMount /*.json balancer
JkMount /*.xml balancer
JkMount /*.do balancer
</VirtualHost>
<ifModule mod_jk.c>
# JkShmFile 내용 반드시 넣어줄 것 - Selinux 보안때문에 공유 메모리파일 위치 반드시 명시해야함
JkShmFile /etc/httpd/run/mod_jk.shm
# 워커 설정파일 위치
JkWorkersFile /etc/httpd/conf/workers.properties
# 로그 위치
JkLogFile /etc/httpd/logs/mod_jk.log
# 로그레벨 설정
JkLogLevel info
# 로그 포맷에 사용할 시간 형식을 지정한다.
JkLogStampFormat "[%y %m %d %H:%M:%S] "
# Our JK shared memory file
JkMountFile /etc/httpd/conf/uriworkermap.properties
</ifModule>
....
2) 워커 파일을 생성해준다.
$ sudo vi /etc/httpd/conf/workers.properties
worker.list=balancer
#위에서 본 balancer. 이걸 적어줘야함.
#worker.list=instance1,instance2
# 로드밸런서를 쓰지 않는다면 이렇게 적으면 됨.
worker.instance1.port=8009
worker.instance1.host=localhost
worker.instance1.type=ajp13
worker.instance1.lbfactor=1
worker.instance2.port=8109
worker.instance2.host=localhost
worker.instance2.type=ajp13
worker.instance2.lbfactor=1
############# 로드밸런서 설정. 쓰지 않는다면 추가 안함.
worker.balancer.type=lb
worker.balancer.balance_workers=instance1,instance2
# 톰캣 server.xml에서 jvmRoute 이름으로 사용
worker.balancer.sticky_session=TRUE
3) 로드밸런서 설정하기
로드 밸런스는 부하 분산기술이다. 위에 보면 host를 따로 설정할수도 있어서 서버가 여러대일경우 사용해도 될것이다. 나는 일단 gcp내부의 톰캣에서 포트별로 나누는것을 해보겠다. 실제 서비스 서버에서는 무의미하지만 연습이니 한번 해보자.
파일을 생성해주고 여기는 다음 내용을 추가해준다. 딱 한줄이면 된다.
$ sudo vi /etc/httpd/conf/uriworkermap.properties
/*=balancer
4. 톰캣설정.
$ sudo vi /usr/share/tomcat8/conf/server.xml
...
<Connector protocol="AJP/1.3"
address="::1"
port="8009"
URIEncoding="UTF-8"
redirectPort="8443"
secretRequired="false" />
<Connector protocol="AJP/1.3"
address="::1"
port="8109"
URIEncoding="UTF-8"
redirectPort="8443"
secretRequired="false" />
...
<Engine name="Catalina" defaultHost="localhost" jvmRoute="instance1">
...
</Engine>
<Engine name="Catalina" defaultHost="localhost" jvmRoute="instance2">
...
</Engine>
...
다시한번 말하지만 이건 내부에서 로드밸런싱을 구현하려다보니 이렇게 하는거지
이건 절대로 아무런 효과가 없음. 2대 이상의 서버에서 구현해야함.
각각의 서버에서 이렇게 해야한다 라는걸 의미.
이렇게 하면 끝??? 노노
5. 아파치와 톰캣의 디렉토리 설정
이제 아파치의 디렉토리와 톰캣의 디렉토리를 연결해야함.
아파치의 디렉토리는 /var/www/html
톰캣의 디렉토리는 /usr/share/tomcat8/webapps/ROOT
이게 다르게 되면 위에서 톰캣을 연결하도록 한 확장자는 jsp, xml, json, do 밖에 없는데
js 파일이나 css 파일은 불러오지 못하는 결과를 낳지... 꼭 필요한 과정~!!!!!
다시 아파치 서버의 설정파일로 간다.
$ sudo vi /etc/httpd/conf/httpd.conf
....
#DocumentRoot "/var/www/html" #기존 설정을 톰캣 디렉토리로 변경해줌
DocumentRoot "/usr/share/tomcat8/webapps/ROOT"
....
#<Directory "/var/www/html"> #기존 설정을 톰캣 디렉토리로 변경해줌
<Directory "/usr/share/tomcat8/webapps/ROOT">
...
6. 서버의 재시작
이렇게 하고 나서 설정파일을 다시 불러오기위해 톰캣과 아파치서버를 재시작 해보자.
$ sudo systemctl restart httpd
$ sudo systemctl restart tomcat8
이제 "서버의 IP"/index.jsp 로 접속해보면
뒤에 포트를 쓰지 않고도 잘 접속된다.
아직 루트로 접속하는 방법은 찾아봐야함. 루트로 접속시 아파치 서버의 웰컴페이지가 뜨게된다.
에러 모음
실제 구현하면서 만났던 에러들이다. 참고하자.
1)공유 메모리 파일 생성 실패
[Tue May 19 09:43:23.356912 2020] [core:notice] [pid 11758:tid 140552852773120] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
[Tue May 19 09:43:23.357493 2020] [jk:emerg] [pid 11758:tid 140552852773120] Initializing shm:/etc/httpd/logs/mod_jk.shm.11758 errno=13. Unable to start due to shared memory failure.
[Tue May 19 09:43:23.357500 2020] [jk:emerg] [pid 11758:tid 140552852773120] Initializing shm:/etc/httpd/logs/mod_jk.shm.11758 errno=13. Unable to start due to shared memory failure.
-> 이것은
$ sudo setenforce 0
테스트모드를 의미하는 명령어로 해결했으나 이것도 아직 해결못함. 더 검색해야함.
sudo yum -y install policycoreutils-python-utils
semanage 사용하기
안되는 이유?
2) 톰캣에러
Service Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
톰캣 실행에러시 발생된다고함. 톰캣에서 에러발생하지않았는지 확인하자.
3) 톰캣 secretRequired 에러
(참조 : https://tomcat.apache.org/tomcat-7.0-doc/changelog.html)
● tomcat8.service - Apache Tomcat Web Application Container
Loaded: loaded (/usr/lib/systemd/system/tomcat8.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2020-05-20 13:29:11 KST; 1min 11s ago
Process: 23579 ExecStop=/usr/libexec/tomcat8/catalina.sh stop (code=exited, status=0/SUCCESS)
Main PID: 23600 (java)
Tasks: 34 (limit: 22144)
Memory: 150.7M
CGroup: /system.slice/tomcat8.service
└─23600 /usr/lib/jvm/jre/bin/java -Djava.util.logging.config.file=/usr/share/tomcat8/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.awt.h>
May 20 13:29:16 willbsoon-gcp-vm tomcat8[23600]: at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
May 20 13:29:16 willbsoon-gcp-vm tomcat8[23600]: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
May 20 13:29:16 willbsoon-gcp-vm tomcat8[23600]: at java.lang.reflect.Method.invoke(Method.java:498)
May 20 13:29:16 willbsoon-gcp-vm tomcat8[23600]: at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:343)
May 20 13:29:16 willbsoon-gcp-vm tomcat8[23600]: at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:474)
May 20 13:29:16 willbsoon-gcp-vm tomcat8[23600]: Caused by: java.lang.IllegalArgumentException: The AJP Connector is configured with secretRequired="true" but the secret attribute is either >
May 20 13:29:16 willbsoon-gcp-vm tomcat8[23600]: at org.apache.coyote.ajp.AbstractAjpProtocol.start(AbstractAjpProtocol.java:274)
May 20 13:29:16 willbsoon-gcp-vm tomcat8[23600]: at org.apache.catalina.connector.Connector.startInternal(Connector.java:1091)
May 20 13:29:16 willbsoon-gcp-vm tomcat8[23600]: ... 12 more
May 20 13:29:16 willbsoon-gcp-vm tomcat8[23600]: 20-May-2020 13:29:16.456 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 3627 ms
active 상태라고는 하지만 로그에는 secretRequired="true" 때문에 에러가 발생.
tomcat에서 SSL을 사용하지 않는 경우 문제가 발생한다고 함.
server.xml 의 <Connector> 설정에 secretRequired="false" 를 추가해줘야 한다
이만~~
'Cloud Platform > GCP' 카테고리의 다른 글
웹서버 작업 폴더 (0) | 2020.08.03 |
---|---|
GCE GPU 사용시 GCP error: Quota 'GPUS_ALL_REGIONS' exceeded. Limit: 0.0 globally 에러 (0) | 2020.06.22 |
구글 클라우드 플랫폼 vm을 만들어보자 3번째(관리자 비밀번호, 자바, 톰캣 - yum 으로 톰캣 설치, harbottle) (0) | 2020.05.14 |
지난 몇일, 혹은 지난 몇달간 웹서버 연결 실패 원인... 서브네팅, 서브넷마스크 (0) | 2020.05.14 |
구글 클라우드 플랫폼 vm을 만들어보자 2번째(putty, putty gen 사용 접속) (0) | 2020.04.24 |
댓글