certbot을 통한 SSL 적용(apache) 및 HTTP/2 적용

Share

Last Updated on 12월 29, 2023 by Jade(정현호)

Let's Encrypt를 통한 무료 인증서 발급

Let's Encrypt 는 사용자에게 무료로 SSL/TLS 인증서를 발급해주는 비영리 기관이며 한번 발급받으면 90일간 사용이 가능하고 만료 30일 전에 갱신 가능 합니다.


인증서 발급은 certbot 이나 certbot-auto 을 이용하면 됩니다. 

* certbot - 패키지 설치시 ,  certbot-auto - letencrypt 에서 바이너리를 직접 받은 경우

* 진행하는 환경은 CentOS 7.8 / Apache 2.4 입니다.
* Oracle Cloud 생성 부터 APM 스택구성 ~ 워드프레스 구성 연재 포스팅에서 중간글 입니다.

[관련된 이전글]
오라클 클라우드 프리티어 - 무료 VPS 사용(1)
리눅스에 APM(Apache+PHP+Mysql) 통한 웹 서비스 시작
웹 기반 mysql 관리 툴 - phpmyadmin 설치
상위 국가 무료 도메인 발급 받기 및 서브 도메인 설정
여러 도메인을 활용한 가상호스트 설정

* Ubuntu 에 Nginx+PHP+MariaDB 환경은 아래 글을 참조하시면 됩니다.

               

Diffie-Hellman Key 생성

Diffie 와 Hellman 이 1976년도에 발표한 비밀키 교환 방식의 알고리즘입니다

Client와 Server가 각자 선택한 정수와 소수를 이용하여 비밀키를 만들고 이를 통해 데이터를 암호화입니다.

DH, DHE, ECDHE가 있으며 DHE(2048bits), ECDHE를 쓰는 것이 가장 좋으며
 Key Exchange 방식 중에서 가장 권고되는 방식(ECDHE) 라고 합니다

그래서 Diffie-Hellman 생성하여 사용할 것입니다.
만들 수 있는 키 길이는 1024 / 2048 / 4096bit 이 되고 4096bit 로 만드는 것이 현재로는 가장 안전 합니다

다만 생성하는 시스템의 성능에 따라 10분이상 소요가 될 수도 있습니다. 그래서 먼저 Diffie-Hellman  생성을 터미널에 실행해두고 다음 단계를 진행하시는 게 좋을 것 같습니다.

Apache 를 소스 컴파일한 환경이면 편하신 곳에 키를 생성하면 됩니다
포스팅에서는 /usr/local/apache2.4/conf/extra/  이곳에 키를 생성할 것입니다.


CenstOS 에 YUM으로 APM을 설치한 환경이라면 /etc/httpd/conf.d 위치에 파일을 생성하시면 될 것 같습니다.

[root]# openssl dhparam -out /usr/local/apache2.4/conf/extra/dhparam.pem 4096

or 

[root]# openssl dhparam -out /etc/httpd/conf.d/dhparam.pem 4096


* 키가 생성 중이면 터미널을 유지하고 아래 내용으로 계속 진행합니다.
          

certbot 설치

진행하는 환경은 Centos 7.8 / Apache 2.4 입니다.
Source Compile 로 설치된 APM 과 YUM(RPM) 으로 설치된 APM 모두 동일 합니다.

certbot 패키지 설치

[root]# yum -y install epel-release

[root]# yum -y install certbot

YUM 으로 진행한 APM 환경은 mod_ssl 를 설치해야 합니다
[root]# yum -y install mod_ssl
            

인증서 발급 방식

Let's Encrypt 가 인증서를 발급하는 방식에는 3가지가 있으며, certbot을 이용하여 발급을 진행합니다.

standalone

standalone 명령어를 사용하면 certbot에 내장된 세팅을 사용해서 도메인만으로 인증서가 발급되고, 갱신 절차도 자동으로 처리됩니다 *.example.com 형태의 와일드카드 서브 도메인 인증서는 발급할 수 없습니다.

인증이나 갱신 시 임시 서버가 80, 443번 포트를 사용하기 때문에 운영 중인 서버가 해당 포트를 쓰게 된다면, 발급 또는 갱신 시 마다 잠시 서버를 내려야 하는 문제가 있습니다.

webroot

webroot 명령어를 사용하면 자신의 웹 서버에서 작동중인 웹사이트를 이용해서 인증서를 발급하고, 갱신 절차도 자동으로 처리된다. *.example.com 형태의 와일드카드 서브 도메인 인증서는 발급할 수 없다.

운영중인 사이트의 / (root) 디렉토리에 도메인 인증을 위해 외부에서 접근 가능한 경로를 제공하고, Let’s Encrypt 측에서 해당 경로로 접속해 인증을 하는 방식입니다.
이 방식의 경우 웹 데몬 서비스의 종료는 필요치 않습니다.

dns

도메인이 연결된 DNS에 TXT 레코드를 생성해서 인증서를 발급하는 방식으로, 인증서 발급 과정에 웹 서버가 필요 없고 *.example.com 형태의 와일드카드 서브 도메인 인증서를 발급할 수 있습니다.

매번 인증서를 갱신할 때마다 DNS에 TXT 레코드를 새로 생성해야 하므로, 외부에서 TXT 레코드를 입력할 수 있도록 DNS가 API를 제공하는 경우에는 갱신 과정을 자동으로 처리할 수 있습니다.

certbot을 통한 인증서 발급요청 과정중, 기재된 TXT Record를 아래와 같이 dns에 등록하여 인증을 받는 형식이고
_acme-challenge.hoing.io. 3600 IN TXT "xxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx"
TXT key 레코드가 바뀐다는 점이 있어서 별도의 처리가 필요합니다.
* 나무위키 참조


그리고 SSL인증서를 발급받기 위해서는 도메인이 반드시 필요 합니다
SSL 설정을 테스트해보거나 빠르게 SSL을 적용해보려면 무료 도메인 발급 서비스를 이용해보는 것도 한가지의 방법입니다

[참조] freenom 을 통해 최상위 국가 무료 도메인 발급


포스팅에서는 webroot 방식으로 진행하겠습니다 도메인이 2개이며 따로 발급을 받았습니다.

/bin/certbot certonly --webroot  \
--email admin@hoing.io --agree-tos \
-w /경로/경로/wordpress -d www.hoing.io -d hoing.io \
-w /경로/경로/phpsub -d phpsub.hoing.io

/bin/certbot certonly --webroot  \

--email admin@fedoralinux.or.kr --agree-tos \
-w /경로/경로/fedoralinux -d www.fedoralinux.or.kr -d fedoralinux.or.kr


간단 설명

- 인증서 발급 인증을 webroot 방식을 이용함
- 이용약관 동의는 자동으로 이뤄짐( agree tos )
- 이메일 주소는 xxx 으로 함
-  -w /site/wordpress 인증을 위한 외부접근 가능 경로 , -d www.hoing.io -d hoing.io 는 인증 도메인입니다.
- webroot 은 와일드카드(*) 형태가 불가능하여 ssl을 사용할 서브 도메인까지 같이 별도로 등록해야 합니다.
- 위는 제가 사용한 커맨드입니다(경로는 예시)


발급 완료 후 발급 내역 확인

[root]# /bin/certbot certificates

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
Certificate Name: www.hoing.io
Serial Number: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Domains: www.hoing.io hoing.io phpsub.hoing.io
Expiry Date: 2020-12-19 15:39:08+00:00 (VALID: 89 days)
Certificate Path: /etc/letsencrypt/live/www.hoing.io/fullchain.pem
Private Key Path: /etc/letsencrypt/live/www.hoing.io/privkey.pem
Certificate Name: www.fedoralinux.or.kr
Serial Number: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Domains: www.fedoralinux.or.kr fedoralinux.or.kr
Expiry Date: 2020-12-19 15:39:59+00:00 (VALID: 89 days)
Certificate Path: /etc/letsencrypt/live/www.fedoralinux.or.kr/fullchain.pem
Private Key Path: /etc/letsencrypt/live/www.fedoralinux.or.kr/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


위와 같이 경로 와 인증서 만료 일자 등을 확인할 수 있습니다.

파일 위치는 공통적으로 /etc/letsencrypt/live 아래 도메인명 으로 디렉토리가 생성되어 파일이 생성됩니다. 
           

Apache 설정

먼저 설정에 따라 방화벽을 오픈 해줍니다.

[root]# firewall-cmd --permanent --add-port=443/tcp

[root]# firewall-cmd --reload;firewall-cmd --list-all

* 서버 환경에 따라 cloud의 route table 에도 경로 추가합니다.


httpd-ssl.conf 파일 재생성 


# ssl 설정 파일을 에서 변경할 사항이 많아서 default 설정 파일을 rename 후 새로 만들겠습니다.

# Source Compile 아파치 경로 및 파일 rename
[root]# cd /usr/local/apache2.4/conf/extra/
[root]# mv httpd-ssl.conf   httpd-ssl.conf.ori

# YUM 아파치 경로 및 파일 rename
[root]# cd /etc/httpd/conf.d
[root]# mv ssl.conf   ssl.conf.ori


# 파일 생성, 아래 내용으로 파일을 작성합니다.

Listen 0.0.0.0:443

SSLCipherSuite "TLS_AES_128_GCM_SHA256 \

TLS_AES_256_GCM_SHA384 \
TLS_CHACHA20_POLY1305_SHA256 \
ECDHE-ECDSA-AES128-GCM-SHA256 \
ECDHE-ECDSA-AES256-GCM-SHA384 \
ECDHE-ECDSA-AES128-SHA \
ECDHE-ECDSA-AES256-SHA \
ECDHE-ECDSA-AES128-SHA256 \
ECDHE-ECDSA-AES256-SHA384 \
ECDHE-RSA-AES128-GCM-SHA256 \
ECDHE-RSA-AES256-GCM-SHA384 \
ECDHE-ECDSA-CHACHA20-POLY1305 \
ECDHE-RSA-CHACHA20-POLY1305 \
ECDHE-RSA-AES128-SHA \
ECDHE-RSA-AES256-SHA \
ECDHE-RSA-AES128-SHA256 \
ECDHE-RSA-AES256-SHA384 \
DHE-RSA-AES128-GCM-SHA256 \
DHE-RSA-AES256-GCM-SHA384 \
DHE-RSA-AES128-SHA \
DHE-RSA-AES256-SHA \
DHE-RSA-AES128-SHA256 \
DHE-RSA-AES256-SHA256 \
EDH-RSA-DES-CBC3-SHA"

SSLProxyCipherSuite "TLS_AES_128_GCM_SHA256 \

TLS_AES_256_GCM_SHA384 \
TLS_CHACHA20_POLY1305_SHA256 \
ECDHE-ECDSA-AES128-GCM-SHA256 \
ECDHE-ECDSA-AES256-GCM-SHA384 \
ECDHE-ECDSA-AES128-SHA \
ECDHE-ECDSA-AES256-SHA \
ECDHE-ECDSA-AES128-SHA256 \
ECDHE-ECDSA-AES256-SHA384 \
ECDHE-RSA-AES128-GCM-SHA256 \
ECDHE-RSA-AES256-GCM-SHA384 \
ECDHE-ECDSA-CHACHA20-POLY1305 \
ECDHE-RSA-CHACHA20-POLY1305 \
ECDHE-RSA-AES128-SHA \
ECDHE-RSA-AES256-SHA \
ECDHE-RSA-AES128-SHA256 \
ECDHE-RSA-AES256-SHA384 \
DHE-RSA-AES128-GCM-SHA256 \
DHE-RSA-AES256-GCM-SHA384 \
DHE-RSA-AES128-SHA \
DHE-RSA-AES256-SHA \
DHE-RSA-AES128-SHA256 \
DHE-RSA-AES256-SHA256 \
EDH-RSA-DES-CBC3-SHA"

SSLHonorCipherOrder on

SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

SSLProxyProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

SSLPassPhraseDialog builtin
SSLSessionCache "shmcb:/usr/local/apache2.4/logs/ssl_scache(512000)"
SSLSessionCacheTimeout 300

SSLOpenSSLConfCmd DHParameters "/usr/local/apache2.4/conf/extra/dhparam.pem"

SSLCompression off
SSLSessionTickets off

SSLUseStapling On
SSLStaplingCache "shmcb:/usr/local/apache2.4/logs/ssl_stapling(32768)"

BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0


= Source Compile - Apache
SSLOpenSSLConfCmd DHParameters "/usr/local/apache2.4/conf/extra/dhparam.pem"


= YUM Apache
SSLOpenSSLConfCmd DHParameters "/etc/httpd/conf.d/dhparam.pem"

  ==> 이부분은 위에서 생성한 Diffie-Hellman  키를 입력하면 됩니다
  ==> 설치된 타입에 따라서 위의 내용을 따라 사용해도 됩니다.


YUM - APM 인 경우 2개의 경로는 아래의 경로나 /var/run 등의 경로로 사용하면 됩니다.
SSLSessionCache "shmcb:/etc/httpd/conf.d/ssl_scache(512000)"
SSLStaplingCache "shmcb:/etc/httpd/conf.d/ssl_stapling(32768)"


# TLS은 1.2 와 1.3 만 사용 가능 하도록 하였습니다.
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLProxyProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1


[참고] TLS 1.3 은 openssl 1.1.1 버전이상 설치된 상태에서 Compile 된 apache 나 1.1.1 버전으로 빌드된 패키지(yum/rpm) 에서 사용할 수 있습니다. 또한 apache 2.4.37 이상이어야 합니다.

openssl 1.1.1 과 Apache Compile 설치는 아래 글을 참조하시면 됩니다.


CentOS 7.8 기준으로 YUM으로 설치 가능한 버전은 2.4.6 이기 때문에 TLS 1.3 을 사용하기 위해서는 최신 버전 및 openssl 1.1.1 로 빌드된 패키지가 필요 합니다.

관련된 내용은 아래 포스트를 참조하시면 됩니다.


httpd.conf 파일 수정

# Source Compile - Apache 인 경우, YUM Apache 는 주석 해제되어 있음 
[root]# vi httpd.conf
LoadModule cache_socache_module modules/mod_cache_socache.so

LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
==> 3개 모듈 주석 해제


# YUM - Apache 인 경우 주석 해제가 되어 있는지 확인합니다.
[root]# grep cache_socache_module 00-base.conf
LoadModule cache_socache_module modules/mod_cache_socache.so

[root]# grep socache_shmcb_module 00-base.conf
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

[root]# grep ssl_module 00-ssl.conf
LoadModule ssl_module modules/mod_ssl.so


# Source Compile - Apache 인 경우만 수행
# Secure (SSL/TLS) connections

Include conf/extra/httpd-ssl.conf
--> 주석 해제


# Source Compile 과 YUM 설치 형태 둘 다 공통 내용입니다.
Virtualhost 추가 및 기존 80(HTTP) 에서 redirect 설정 


<VirtualHost *:443>
Header always set Strict-Transport-Security "max-age=15768000"
SSLEngine On
ServerName hoing.io
ServerAlias hoing.io www.hoing.io
ServerAdmin admin@hoing.io
DocumentRoot "/파일경로"
ErrorLog "logs/hoing.io-error_log"
CustomLog "logs/hoing.io-access_log" geoip
LogLevel debug
 ==> 임시적으로, 설정 안 해도 됩니다.

<Directory "/파일경로">
AllowOverride ALL
Options FollowSymLinks MultiViews
DirectoryIndex index.php index.html index.htm
FallbackResource /index.php

<RequireAll>
Require all granted
</RequireAll>
</Directory>


# 사용하시는 PHP-FPM Proxy 내용을 기재하면 됩니다.
RewriteEngine On
ProxyErrorOverride on
<FilesMatch .php$>
SetHandler "proxy:fcgi://node3:9000"
</FilesMatch>


#  위에서 발급받은 SSL 키를 추가합니다.
# 경로는 /etc/letsencrypt/live/ 밑에 입니다.

SSLCertificateFile /etc/letsencrypt/live/www.hoing.io/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.hoing.io/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.hoing.io/fullchain.pem

</VirtualHost>


# 기존 80(http) 서비스에는 redirect 를 설정

<VirtualHost *:80>
ServerAdmin admin@hoing.io
DocumentRoot "/경로"
ServerName hoing.io
ServerAlias hoing.io www.hoing.io
ErrorLog "logs/hoing.io-error_log"
CustomLog "logs/hoing.io-access_log" geoip

RewriteEngine on
RewriteRule ^/.well-known/ - [L]
RewriteCond %{SERVER_NAME} =www.hoing.io [OR]
RewriteCond %{SERVER_NAME} =hoing.io
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

</VirtualHost>

=> 위의 와 같이 할 수도 있고 아래처럼 간단 하게도 가능합니다.
RewriteRule 은 상당히 다양하게 작성하여 사용할 수 있습니다.

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]


설정을 완료하였다면 apache 재기동 및 로그를 확인하여 추가 조치를 수행합니다.
                

인증서 갱신

Let's Encrypt 의 SSL 인증서의 유효기간은 90일입니다. 그래서 만료 전에 갱신이 필요 합니다.

renew 옵션을 통해서 수행 가능하며 renew 테스트를 하려면 --dry-run 옵션을 사용하면 됩니다.
/bin/certbot renew --dry-run
   -> 테스트 모드

실제 갱신시(apache 재시작 필요)

/bin/certbot renew
* 갱신은 인증서 만료 30일 이전에 가능 합니다.


#crontab 등록

0 6 15 * * /bin/certbot renew --renew-hook "/bin/systemctl reload httpd"
만료 30일 이전에 갱신 가능함을 한달에 한 번 정도만 수행해줘도 됩니다.
             

SSL Test 및 평가

아래 링크를 통해서 사이트에 SSL 적용 여부 확인 및 사용하는 알고리즘 및 설정 내역에 따른 평가를 확인할 수 있습니다


테스트 결과 A+ 로 양호하게 설정되었음을 확인할 수 있습니다.



지원 TLS 버전 체크

아래 링크 등을 통해 구성된 HTTS에서 설정된 SSL/TLS 버전을 확인할 수 있습니다.

https://www.cdn77.com/tls-test
https://gf.dev/tls-test


                   

인증서 서브 도메인 변경

서브 도메인의 추가나 서브도메인의 삭제는 아래와 같이 모든 내용을 다시 입력하면 됩니다.

[root]# certbot --webroot certonly --cert-name www.hoing.io \
-w /site/commit -d www.hoing.io -d hoing.io \
-w /site/old.commit  -d old.hoing.io

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

You are updating certificate www.hoing.io to include new domain(s):
+ old.hoing.io

You are also removing previously included domain(s):
(None)

Did you intend to make this change?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(U)pdate cert/(C)ancel: U
Renewing an existing certificate



--cert-name 은 아래 명령어로 조회한 결과에 확인 가능 합니다.
[root]# /bin/certbot certificates

Certificate Name: www.hoing.io  <---
Serial Number: xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Domains: www.hoing.io hoing.io



변경 후 apache 재시작이나 reload 필요합니다.

systemctl restart httpd
or
systemctl reload httpd
             

인증서 삭제

아래와 같이 certbot delete 명령어를 통해 대화형으로 SSL인증서를 삭제할 수 있습니다.

[root]# /bin/certbot delete
Saving debug log to /var/log/letsencrypt/letsencrypt.log

Which certificate(s) would you like to delete?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: www.hoing.io-0001
2: www.hoing.io
3: www.fedoralinux.or.kr
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Deleted all files relating to certificate www.hoing.io-0001.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[root@]# /bin/certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
Certificate Name: www.hoing.io
Serial Number: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Domains: www.hoing.io hoing.io
Expiry Date: 2020-12-19 15:39:08+00:00 (VALID: 88 days)
Certificate Path: /etc/letsencrypt/live/www.hoing.io/fullchain.pem
Private Key Path: /etc/letsencrypt/live/www.hoing.io/privkey.pem

Certificate Name: www.fedoralinux.or.kr
Serial Number: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Domains: www.fedoralinux.or.kr fedoralinux.or.kr
Expiry Date: 2020-12-19 15:39:59+00:00 (VALID: 88 days)
Certificate Path: /etc/letsencrypt/live/www.fedoralinux.or.kr/fullchain.pem
Private Key Path: /etc/letsencrypt/live/www.fedoralinux.or.kr/privkey.pem
              

HTTP/2

HTTP/2(Hypertext Transfer Protocol Version 2) 는 IETF 에서 발표된 HTTP/1.1 의 차기 버전으로 2015년에 발표되었으며 월드 와이드 웹에서 쓰이는 HTTP 프로토콜의 두 번째 버전입니다.

SPDY에 기반하고 있으며, 국제 인터넷 표준화 기구(IETF)에서 개발되고 있습니다.

1997년 RFC 2068로 표준이 된 HTTP 1.1을 개선한 것으로,
2014년 12월 표준안 제안(Proposed Standard)으로 고려되어, 2015년 2월 17일 IESG에서 제안안으로 승인되었고 2015년 5월, RFC 7540로 공개되었습니다.

자세한 내용은 아래 링크를 확인 해보시면 됩니다.


HTTP/2 는 Apache 2.4.17 이상 부터 사용 가능 합니다.
            

HTTP/2 - Apache

YUM으로 APM 이 구성되어 있거나 Source Compile 로 APM 스택이 구성된 상태에서 HTTP2 적용하는 내용입니다.
            

Source Compile

Apache 를 Source Compile 으로 진행하는 내용으로 YUM 이나 RPM방식의 설치는 아래쪽에 내용이 별도로 있습니다.

HTTP/2 를 사용하기 위해서는 libnghttp2 libnghttp2-devel 라이브러리와
 openssl 1.0.2 이상 버전이 필요 합니다
그리고 Apache는 2.4.17 이상이어야 합니다.


먼저 EPEL을 활성화합니다
[root]# yum -y install epel-release


[root]# yum -y install libnghttp2 libnghttp2-devel openssl
*openssl은 CentOS 7 버전 기준으로 1.0.2 버전이 가능함


[참고.1] apache MPM 방식 + http2

Apache 에서 HTTP/2 를 사용하고자 할 때는 prefork 방식은 사용할 수 없습니다 

[참고.2] HTTPS 의 TLS1.3을 사용하기 위해서는 OpenSSL의 컴파일 설치 및 Apache 재설치가 필요 합니다. 
HTTP/2 적용을 위해 Apache 를 재설치를 할 때 OpenSSL 과 같이 재설치 하여 TLS1.3까지 적용하시려면 아래 글을 참조하시면 됩니다.


OS 기본 YUM Repository 에서 설치 가능한 openssl 은 1.0.2 버전으로 TLS 1.2 버전 까지는 가능함으로 그대로 사용하시려면 바로 아래 내용으로 진행하시면 됩니다.



Apache 의 MPM 방식을 event 로 하고, --enable-http2 옵션을 추가하여 다시 컴파일을 하였습니다.

[root]# ./configure --prefix=/usr/local/apache2.4.46_http2 \
--enable-mods-shared=all --enable-http2 \
--enable-ext-filter --enable-ssl -with-ssl --enable-so \
--enable-cache --enable-proxy
--enable-deflate \
--enable-ssl --enable-suexec \
--enable-file-cache --with-mpm=event \

--with-apr=/usr/local/apr-1.7.0 \
--with-apr-util=/usr/local/apr-util-1.6.1 \
--with-pcre=/usr/local/pcre-8.44/bin/pcre-config \

--enable-modules=all --enable-module=shared

[root]# make;make install


기존에 사용하던 Apache 가 있던 관계로 디렉토리 변경 작업을 진행하겠습니다. 저는 대표 디렉토리를 심볼릭 링크를 걸어서 사용 중이었습니다.

아래 내용은 기존 사용 중인 디렉토리의 교체 관련된 내용으로 환경이 다르면 생략하고 다음 과정으로 이동하시면 됩니다.



# 신규디렉토리 필요 파일 복사
cp /usr/local/apache2.4/logs/* /usr/local/apache2.4.46_http2/logs
mv /usr/local/apache2.4.46_http2/conf /usr/local/apache2.4.46_http2/ori.conf
cp -rp /usr/local/apache2.4/conf /usr/local/apache2.4.46_http2

# 그외 기존에 추가하여 사용한 모듈 복사(환경에 따라 다름)

cp /usr/local/apache2.4/modules/mod_security2.so /usr/local/apache2.4.46_http2/modules/


httpd.conf  내용 추가

httpd.conf 파일에 HTTP/2 관련된 설정 내용을 아래와 같이 추가합니다.

[root]# vi /usr/local/apache2.4.46_http2/conf
[root]# vi httpd.conf

<IfModule http2_module>
ProtocolsHonorOrder On
Protocols h2 h2c http/1.1
</IfModule>

YUM - 패키지 설치

YUM 으로 APM 설치한 환경에서 HTTP/2 를 구성하는 내용입니다.

HTTP/2 는 mod_http2 를 통해 사용이 가능합니다. mod_http2 는 apache 2.4.17 부터 사용 가능 합니다

즉 Apache의 버전이 2.4.17 이상이어야 합니다.
하지만 CentOS 7.8 기준으로 YUM 기본 Repository 에서 설치할 수 있는 가장 높은 버전은 2.4.6 입니다.
그래서 HTTP2.0 을 사용하기 위해서는 별도의 외부 Repository 를 통해 최신 버전을 설치해야 이 기능도 사용할 수 있습니다.


그래서 CodeIT Repository 를 통해 Apache 의 설치를 진행하도록 하겠습니다.
CodeIT 에서의 최신버전의 Apache 설치 및 PHP + MySQL  연동 설치는 아래를 참조하시면 됩니다.


CodeIT이나 다른 Repository 를 통해 2.4.17 이상 설치된 환경은 설치 및 설정만 변경하면 됩니다.


패키지 설치

[root]# yum -y install mod_http2
-> 의존성으로 로 인하여 이미 설치되어 있을 수 있습니다.


10-h2.conf 설정 변경

[root]# cd /etc/httpd/conf.modules.d

[root]# vi 10-h2.conf
-> 앞에 10 숫자는 다를 수 있습니다. h2 나 http2 의 설정파일을 찾으시면 됩니다.
-> 파일이 맞다면 아래와 같이 mod_http2.so 파일을 load 하는 구문을 확인할 수 있습니다.
-> LoadModule http2_module modules/mod_http2.so


10-h2.conf 파일에 아래 내용을 추가합니다.

<IfModule http2_module>
ProtocolsHonorOrder On
Protocols h2 h2c http/1.1
</IfModule>


파일 저장 후 apache 를 재시작이나 reload 합니다.

[root]# systemctl reload httpd
or
[root]# systemctl restart httpd

              

커널 파라미터 수정

적용 완료 이후 블로그가 응답이 매우 느린 현상을 확인하였고 Apache 로그를 확인하였을 때 packet 과 window size 관련 메세지가 확인되어 apache 서버와 php가 설치된 다른 서버(중간 mw 서버) 에서 커널 파라미터를 모두 변경/적용 후 apache , php-fpm 재시작을 해주었습니다.


커널 파라미터 추가

[root]# vi /etc/sysctl.conf

net.core.rmem_default = 16777216
net.core.rmem_max = 16777216
net.core.wmem_default = 16777216
net.core.wmem_max = 16777216


커널 파라미터 적용
[root]# sysctl -p


• 참조

             

Apache 서비스 재시작

모든 설정이 완료되었다면 Apache 를 재시작 하도록 하겠습니다.

Apache 중지


[root]# systemctl stop httpd


아래 과정은 소스 컴파일 후 기존 사용 디렉토리를 정리해주는 부분으로 설치한 환경이 다르다면 생략 가능한 단계입니다.

## 디렉토리 변경
[root]# cd /usr/local

[root]# rm apache2.4
  --> 심볼릭 링크 삭제 / 삭제 전 구조
   lrwxrwxrwx. 1 root root 12 Sep 9 18:03 apache2.4 -> apache2.4.43


[root]# cd /usr/local
[root]# ln -s apache2.4.46_http2 apache2.4

  --> 심볼릭 링크 재생성


Apache 서비스 시작


이제 Apache 를 시작하도록 하겠습니다.
[root]# systemctl start httpd


로그 확인


[root]# cd /usr/local/apache2.4.43_http2/logs/

[root]# tail -100f error_log

* 설치 환경에 따라 경로 와 파일명은 다를 수 있습니다


[참고] yum 이나 rpm 으로 Apache 를 설치 환경일 경우
/etc/httpd/conf.modules.d/00-mpm.conf 에서 아래와 같이 사용하는 모듈을 변경하면 됩니다.

# LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
-> 주석 처리

LoadModule mpm_event_module modules/mod_mpm_event.so
-> 주석 해제
               

HTTP/2 적용 확인

아래 링크를 통해서 HTTP/2 정상 적용 여부를 확인할 수 있습니다.


확인 결과 정상적으로 동작 하는 것을 확인할 수 있습니다.


Source Compile Apache 환경 적용 결과





YUM APM 환경 적용 결과




이어지는 다음 글: WordPress(워드프레스) 구성 - 개인 블로그 및 사이트

                  

5
0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x