Caused by: org.apache.catalina.LifecycleException: The configured protocol [org.apache.coyote.http11.Http11AprProtocol] requires the APR/native library which is not available
tomcat 8.5 버전에서 HTTP/2 를 사용하려면 tomcat native를 이용하면 HTTP/2를 이용할 수 있다
CENTOS 7 버전에서는 yum -y install tomcat-native 이용하여 간편하게 이용할 수 있지만
Centos 6 버전에서는 openssl 버전과 apr 버전이 낮은 관계( yum 설치된 버전)로 tomcat-native를 이용할 수 없지만
별도 설치(comfile)를 통해 이용할 수 있다.
tomcat native 란 : Apache 웹서버에 APR이라 불리는 성능좋은 네이티브 라이브러리 인데 이것을 TOMCAT에서 사용할수 있게 하는것이 tomcat native
tomcat native 라이브러리 종류 : JNI 래퍼 , ARP Libray , Openssl Libray
BIO Connector : Java blocking api 를 사용하여 구현
APR(native) Connector : JNI Libray를 사용하여 구현
NIO Connector : Java Nio api를 사용하여 구분
일반적으로 기본 tomcat은 프로토콜은 protocol=”HTTP/1.1″ 을 사용한다. 만약 기본인 상태값에서
-tomcat native library가 없는 경우에는 BIO Connector로 실행
-tomcat native libray가 있는 경우에는 APR Connector로 실행된다.
protocol을 BIO Connector로 지정은 아래와 같이 지정
1 |
Connector port="8080" protocol="org.apache.coyote.http11.Http11Protocol" |
protocol을 APR(native) Connector로 지정은 아래와 같이 지정
1 |
Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" |
protocol을 NIO Connector로 지정은 아래와 같이 지정
1 |
Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" |
1. 아래 log는 Centos 6.x 버전에서 tomcat의 HTTP/2를 이용하기 위해 tomcat-native를 이용하려고 하지만 에러가 발생한다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
29-Nov-2018 16:59:12.632 심각 [main] org.apache.catalina.core.StandardService.initInternal Failed to initialize connector [Connector [org.apache.coyote.http11.Http11AprProtocol-8443]] org.apache.catalina.LifecycleException: Failed to initialize component [Connector[org.apache.coyote.http11.Http11AprProtocol-8443]] at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:112) at org.apache.catalina.core.StandardService.initInternal(StandardService.java:552) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107) at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:875) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107) at org.apache.catalina.startup.Catalina.load(Catalina.java:638) at org.apache.catalina.startup.Catalina.load(Catalina.java:661) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:309) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492) <strong>Caused by: org.apache.catalina.LifecycleException: The configured protocol [org.apache.coyote.http11.Http11AprProtocol] requires the</strong> <strong> APR/native library which is not available</strong> |
2. 그럼 먼저 tomcat-native를 컴파일해서 설치를 진행해보자 기본적인 tomcat 폴더의 bin 폴데어 tomcat-native 소스 압축파일이 존재한다. 컴파일을 진행하면
아래와 같이 에러가 발생한다. 현재 설치된 apr 버전은 1.3.9 필요버전은 1.4.3 이상이라고. ㅠㅠ 그럼 apr를 설치해야지
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[root@localhost ~]# cd /usr/local/tomcat/bin/ [root@localhost bin]# cd tomcat-native-1.2.18-src/native/ [root@localhost native]# ./configure checking build system type... x86_64-pc-linux-gnu checking host system type... x86_64-pc-linux-gnu checking target system type... x86_64-pc-linux-gnu checking for a BSD-compatible install... /usr/bin/install -c checking for working mkdir -p... yes Tomcat Native Version: 1.2.18 checking for chosen layout... tcnative checking for APR... yes <strong>configure: error: Found APR 1.3.9. You need version 1.4.3 or newer installed.</strong> |
3. arp 기본 rpm 설치된 버전말고 상위버전으로 컴파일 진행 apr-util도 진행하자
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[root@localhost native]# cd /root [root@localhost ~]# wget http://apache.tt.co.kr//apr/apr-1.6.5.tar.gz [root@localhost ~]# tar xvfz apr-1.6.5.tar.gz [root@localhost ~]# cd apr-1.6.5 [root@localhost apr-1.6.5]# ./configure --prefix=/usr/local/apr && make && make install [root@localhost apr-1.6.5]# cd /root [root@localhost ~]# wget http://apache.tt.co.kr//apr/apr-util-1.6.1.tar.gz [root@localhost ~]# tar xvfz apr-util-1.6.1.tar.gz [root@localhost ~]# cd apr-util-1.6.1 [root@localhost apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/bin/apr-1-config [root@localhost apr-util-1.6.1]# make && make install |
4. 자 이제 다시 tomcat native 를 컴파일 다시 진행해보자
1 2 3 4 5 6 7 8 9 |
[root@localhost native]# ./configure --with-apr=/usr/local/apr/bin/apr-1-config checking for OpenSSL library... using openssl from /usr/${exec_prefix}/lib and /usr/include checking OpenSSL library version >= 1.0.2... Found OPENSSL_VERSION_NUMBER 0x1000105f (OpenSSL 1.0.1e 11 Feb 2013) Require OPENSSL_VERSION_NUMBER 0x1000200f or greater (1.0.2) configure: error: Your version of OpenSSL is not compatible with this version of tcnative' |
젠장 .. 이번에는 openssl 버전이 낮다고 최소 1.0.2 버전을 요구하네.. 현재 설치된 버전은 1.0.1e 버전인데 요구하니 설치해야지.. openssl 설치 후 tomcat native 컴파일 진행
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
[root@localhost ~]# wget https://www.openssl.org/source/openssl-1.0.2q.tar.gz [root@localhost ~]# tar xvfz openssl-1.0.2q.tar.gz [root@localhost ~]# cd openssl-1.0.2q [root@localhost openssl-1.0.2q]# ./config --prefix=/usr/local/openssl shared zlib [root@localhost openssl-1.0.2q]# make && make install [root@localhost openssl-1.0.2q]# echo /usr/local/openssl/lib > /etc/ld.so.conf.d/openssl.conf [root@localhost openssl-1.0.2q]# ldconfig [root@localhost openssl-1.0.2q]# cd /usr/local/tomcat/bin/tomcat-native-1.2.18-src/native/ [root@localhost native]# ./configure --with-apr=/usr/local/apr/bin/apr-1-config --with-ssl=/usr/local/openssl/ --with-java-home=/usr/local/java/ [root@localhost native]# make && make install [root@localhost native]# ls -l /usr/local/apr/lib/ 합계 5308 -rw-r--r--. 1 root root 10094 2018-11-29 17:15 apr.exp -rw-r--r--. 1 root root 1528250 2018-11-29 17:15 libapr-1.a -rwxr-xr-x. 1 root root 959 2018-11-29 17:15 libapr-1.la lrwxrwxrwx. 1 root root 17 2018-11-29 17:15 libapr-1.so -> libapr-1.so.0.6.5 lrwxrwxrwx. 1 root root 17 2018-11-29 17:15 libapr-1.so.0 -> libapr-1.so.0.6.5 -rwxr-xr-x. 1 root root 846529 2018-11-29 17:15 libapr-1.so.0.6.5 -rw-r--r--. 1 root root 1933846 2018-11-29 18:07 libtcnative-1.a -rwxr-xr-x. 1 root root 1068 2018-11-29 18:07 libtcnative-1.la lrwxrwxrwx. 1 root root 23 2018-11-29 18:07 libtcnative-1.so -> libtcnative-1.so.0.2.18 lrwxrwxrwx. 1 root root 23 2018-11-29 18:07 libtcnative-1.so.0 -> libtcnative-1.so.0.2.18 -rwxr-xr-x. 1 root root 1091662 2018-11-29 18:07 libtcnative-1.so.0.2.18 drwxr-xr-x. 2 root root 4096 2018-11-29 18:07 pkgconfig |
5. tomcat 시작시 해당 라이브러리를 불러올수 있게 catalina.sh 파일에 옵션을 추가해 주자
1 2 3 |
[root@localhost native]# vi /usr/local/tomcat/bin/catalina.sh CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib" |
그리고 나서 tomcat을 재시작해보자 catalina.out 로그 파일을 보면 아래와 같이 Loaded 된것을 확인 할 수 있다.
1 2 |
29-Nov-2018 18:09:17.231 정보 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded APR based Apache Tomcat Nat ive library [1.2.18] using APR version [1.6.5]. |
tomcat의 server.xml 파일을 열어서 tomcat native를 이용해서 ssl를 이용하면 된다
HTTP/1 HTTP/2 지원에 따라 아래와 같이 사용하면 된다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<!-- PEM SSL Password NONE / HTTP/1 / Tomcat Native 설치되어 있어야 함 / 미설치지 동작안됨 --> <Connector port="445" protocol="org.apache.coyote.http11.Http11AprProtocol" maxHttpHeaderSize="8192" maxThreads="150" enableLookups="false" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" SSLEnabled="true" scheme="https"> <SSLHostConfig> <Certificate certificateKeyFile="/etc/letsencrypt/live/jsp3.xinet.kr/privkey.pem" certificateFile="/etc/letsencrypt/live/jsp3.xinet.kr/cert.pem" certificateChainFile="/etc/letsencrypt/live/jsp3.xinet.kr/chain.pem" type="RSA" /> </SSLHostConfig> </Connector> <!-- PEM SSL Password True / HTTP/2 / Tomcat Native 설치되어 있어야 함 / 미설치지 동작안됨 --> <Connector port="443" protocol="org.apache.coyote.http11.Http11AprProtocol" maxHttpHeaderSize="8192" maxThreads="150" enableLookups="false" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" SSLEnabled="true" scheme="https"> <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /> <SSLHostConfig> <Certificate certificateKeyFile="/usr/local/tomcat/conf/ssl/jsp4.xinet.kr.key" certificateFile="/usr/local/tomcat/conf/ssl/jsp4.xinet.kr.crt" certificateChainFile="/usr/local/tomcat/conf/ssl/EncryptionEverywhereDVCA.crt" certificateKeyPassword="123456" type="RSA" /> </SSLHostConfig> </Connector> |