Search
Duplicate

Ubuntu 22.0X 에서 Apache2 설치

1. Apache2 설치

먼저 apt 패키지 업데이트를 진행합니다.
apt update && apt upgrade
Bash
복사
apt를 통하여 apache2를 설치합니다.
참고로 Apache Httpd 서버는 레드헷 계열 리눅스에서는 httpd, 데비안 계열에서는 apache2라는 이름으로 배포 및 설치가 됩니다.
apt -y install apache2
Bash
복사
설치가 완료되면 자동으로 apache2 가 기동됩니다.
캡쳐에서 확인할 수 있다시피, systemctl , apachectl 모두 지원합니다.
systemctl 을 통한 서비스 관리
systemctl start apache2 systemctl stop apache2 systemctl restart apache2 systemctl status apache2
Bash
복사
apachectl 을 통한 서비스 관리
apachectl start # 시작 apachectl stop # 중지 apachectl restart # 재시작 apachectl -t # 설정 파일 문법 체크 apachectl graceful # 무중단 설정 반영 apachectl -v # 버전 확인
Bash
복사
기본 설치 경로는 아래와 같습니다.
Apache Home : /etc/apache2
Apache 로그 : /var/log/apache2
브라우저에서 접속시 Apache 기본 페이지가 나온것을 확인하였습니다.
VM 사설 IP : http://192.168.88.134/

2. Apache2 모듈 설치

Apache와 Tomcat을 연동하고, 운영 서비스를 위한 세부 설정을 위하여 추가 모듈을 설치합니다.
apt를 통하여 모듈을 설치합니다 (너무 편하네요)
apt -y install libapache2-mod-jk libapache2-mod-security2 apache2-dev libpcre3-dev
Bash
복사
libapache2-mod-jk : Apache와 Tomcat 간의 통신을 도와주는 Apache 모듈
우리가 흔히 말하는 mod_jk(모드 제이케이)는 사실 모듈JK → jk 모듈이라고 생각하시면 됩니다.
libapache2-mod-security2 : Apache 보안 모듈 (서버 토큰 리라이트에 사용)
apache2-dev : Apache 웹 서버 관련 개발 헤더 파일 및 라이브러리
libpcre3-dev : Perl Compatible Regular Expressions (PCRE) 라이브러리
아래 명령어로 각 모듈을 활성해줍니다. ssl 모듈의 경우 재시작을 하라고 하네요.
[JK 모듈 활성화] a2enmod jk [Rewrite 모듈 활성화] a2enmod rewrite [SSL 모듈 활성화] a2enmod ssl [Security 모듈 활성화] a2enmod security2 [재시작] systemctl restart apache2
Bash
복사
프로세스 확인 및 접속 테스트 결과 정상입니다.
[프로세스 확인] ps -ef | grep apache2 [웹 브라우저 접속 테스트] http://192.168.88.134/
Bash
복사

3. Apache2 기본 설정 파일분석

기존 경험해봤던 httpd 설치 구성과 구조가 상이함을 알 수 있습니다.
자세히 보시면 설정1-available + 설정1-enable 처럼 짝이 지어있네요.
실제 설정 파일설정1-available 디렉토리에 존재하고,
설정1-enable 에는 설정1-available 의 파일에 대한 심볼릭 링크가 존재합니다.
메인 설정 파일인 apache2.conf 를 보시면, 설정1-enable 에 위치한 설정 파일을 불러옵니다.
→ 이런 구조를 보았을 때 설정 파일에 대한 쓰기 영역과, 읽기 영역을 분리한것으로 보입니다.
만약 신규 설정 파일을 추가할 경우 아래와 같은 순서로 작업을 하면 됩니다.
1.
설정1-available 에 파일을 추가하고,
2.
설정1-enable 디렉토리에 추가한 파일에 대한 심볼릭 링크 생성
3.
apache2.conf 에서 설정1-enable 가 설정되어있는지 확인 (없으면 관련 설정 추가)
4.
apache2 재기동
1.
Apache2 메인 설정 파일
→ 기존에 httpd.conf로 관리하던 Apache 메인 설정 파일입니다
/etc/apache2/apache2.conf
2.
Apache2 부가 설정 파일
/etc/apache2/conf-available/
/etc/apache2/conf-enabled/
available 의 설정 파일과 enabled 링크된 파일이 동일하네요.
이런 경우는 별도 링크 추가 작업 없이 설정 파일을 이용하시면 됩니다.
3.
Apache2 추가 모듈 설정 파일
/etc/apache2/mods-available/
/etc/apache2/mods-enabled/
available 의 설정 파일과 enabled 링크된 파일의 갯수가 다릅니다.
정확히 말하면, 사용 가능한 모듈이 있고, 실제 활성화된 모듈이 다른 경우입니다.
만약 enabled 되지 않은 모듈중에 우리가 필요한 모듈이 있다면 해당 디렉토리에
심볼릭 링크를 생성하고, 해당 설정 파일 .conf 을 이용하시면 됩니다.
각 모듈 설정은 모듈1.conf + 모듈1.load 가 한 쌍입니다.
모듈1.load : 해당 모듈을 불러오는 설정입니다.
모듈1.conf : 해당 모듈에 대한 설정입니다.
기존 설정파일에 뭉탱이로 들어가있던 설정들이 좀 더 정갈하게 분리되어 관리되는 차이입니다.
실제 설정 파일에 문법은 httpd나 apache2나 유사합니다.
4.
Apache2 사이트 설정 파일
기존에 mod_jk.conf에 설정 하였던, Virtual Host 설정들이라고 보시면 됩니다.
/etc/apache2/sites-available/
000-default.conf : 기본 Virtual host 80
default-ssl.conf : 기본 Virtual host 443
/etc/apache2/sites-enabled/
000-default.conf
→ 현재 상태에서는 기본 Virtual host 80 만 활성화 되어 있다고 이해하시면 됩니다.

4. apache2 주요 설정 파일 요약

1.
/etc/apache2/apache2.conf
Apache2의 메인 설정 파일
2.
/etc/apache2/conf-available/security.conf
Apache2의 보안 설정 파일
4.
/etc/apache2/mods-available/mpm_event.conf
Apache2의 데몬에 대한 설정 파일
5.
/etc/apache2/mods-available/alias.conf
Apache2의 alias 모듈에 대한 설정 파일
6.
/etc/apache2/mods-available/security2.conf
Apache2의 security2 모듈에 대한 설정 파일
7.
/etc/apache2/conf-jk/httpd-jk.conf
Apache2의 jk 모듈의 설정 파일 ( 기존 mod_jk.conf )
8.
/etc/apache2/conf-jk/uriworkermap.properties
Apache2의 uri 별 설정을 하는 파일입니다.
9.
/etc/apache2/conf-jk/workers.properties
Apache2와 연동할 백엔드 서버(Tomcat)를 정의하는 파일입니다.
10.
/etc/apache2/sites-available/crinity.default.conf
Apache2의 VirtualHost 설정 파일 ( 기존 mod_jk.conf )
저는 도메인별로 설정 파일을 생성하여 관리할 생각입니다. ( 복붙하기 편함 )

5. apache2 주요 설정 파일 변경

1. /etc/apache2/apache2.conf

기존 설정 파일 최 하단에 아래 설정 추가
당연히… 수정이 필요한 부분이 있는지 (domain 등..) 확인하여 변경해주세요.
# XXX Custom Config User nobody Group nogroup ServerAdmin admin@domain.com ServerName dev.domain.com DocumentRoot "/maildata/apache/htdocs" <IfModule log_config_module> LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{ms}T" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common <IfModule logio_module> LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio </IfModule> SetEnvIfNoCase Request_URI "\.(jpg|png|gif|css|ico|js|swf|jsp)$" nolog CustomLog "|/usr/bin/rotatelogs /var/log/apache2/access.log-%Y%m%d 86400 +540" combined env=!nolog </IfModule> ErrorDocument 400 /error.html ErrorDocument 401 /error.html ErrorDocument 402 /error.html ErrorDocument 403 /error.html ErrorDocument 404 /error.html ErrorDocument 405 /error.html ErrorDocument 500 /error.html ErrorDocument 504 /error.html EnableSendfile on LimitRequestBody 0 AddDefaultCharset UTF-8
Bash
복사
/maildata/apache/htdocs 경로도 미리 만들어 줍니다.
mkdir -p /maildata/apache/htdocs
Bash
복사

2. /etc/apache2/conf-available/security.conf

ServerTokens OS → Prod
ServerSignature On → Off
# XXX Custom Config <Location /*> # Limit HTTP Method <LimitExcept GET POST OPTIONS DELETE PUT> Order deny,allow Deny from all </LimitExcept> </Location>
Bash
복사

3. /etc/apache2/mods-available/mpm_event.conf

[AS-IS] #<IfModule mpm_event_module> # StartServers 2 # MinSpareThreads 25 # MaxSpareThreads 75 # ThreadLimit 64 # ThreadsPerChild 25 # MaxRequestWorkers 150 # MaxConnectionsPerChild 0 #</IfModule> [TO-BE] # XXX Custom Config <IfModule mpm_event_module> StartServers 5 ServerLimit 64 MinSpareThreads 64 MaxSpareThreads 128 ThreadsPerChild 64 MaxRequestWorkers 4096 MaxConnectionsPerChild 0 </IfModule>
Bash
복사

4. /etc/apache2/mods-available/alias.conf

렛츠인크립트 인증서를 사용하지 않으면 아래 처럼 설정할 필요는 없습니다. 대신 alias 모듈을 사용할 때 해당 설정파일을 이용해야한다는걸 알고 가세요
# XXX Custom Config ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" AliasMatch ^/.well-known/acme-challenge/(.*)$ /var/www/html/.well-known/acme-challenge/$1 AliasMatch ^/.well-known/pki-validation/(.*)$ /var/www/html/.well-known/pki-validation/$1
Bash
복사

5. /etc/apache2/mods-available/security2.conf

브라우저에 노출되는 서버 정보를 변경할 때 사용하는 옵션입니다.
보통 응답 헤더의 Server 라는 값에 WAS, WEB 서버의 종류 (Tomcat, Apache 등) 이 표시가 되는데, 이러한 서버의 종류가 아닌 커스텀 텍스트를 적용하려면 해당 모듈을 설치, 활성화 후
SecServerSignature 값에 특정 텍스트 값을 설정합니다. 아래 예시처럼 설정한다면 응답 헤더 중 Server 의 값이 CUSTOMTEXT 로 표기가 됩니다.
# XXX Custom Config SecRuleEngine Off ServerTokens Minimal SecServerSignature "CUSTOMTEXT"
Bash
복사

6. /etc/apache2/conf-jk/httpd-jk.conf

우리가 흔히 알고 있는 mod_jk.conf 에 해당하는 설정입니다.
최초 모듈 설치 시, 위와 같은 기본 설정 값이 있는데 다 지우고 아래 설정으로 교체합니다.
# LoadModule myfixip_module modules/mod_myfixip.so # 브라우저 페이지 캐싱 방지 <IfModule mod_headers.c> Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate" Header set Pragma "no-cache" Header set Expires 0 </IfModule> # TRACE & TRACK 메서드 제외 처리 <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK) RewriteRule .* - [F] </IfModule> # 워커 설정파일 위치 JkWorkersFile /etc/libapache2-mod-jk/workers.properties # 로그 위치 # JkLogFile logs/mod_jk.log JkLogFile "|/usr/bin/rotatelogs /var/log/apache2/mod_jk.log-%Y%m%d 86400" # 로그레벨 설정 JkLogLevel info # 로그 포맷에 사용할 시간 형식을 지정한다. JkLogStampFormat "[%y %m %d %H:%M:%S] " # Our JK shared memory file JkShmFile logs/mod_jk.shm
Bash
복사

7. /etc/apache2/conf-jk/workers.properties

Apache2 서버 뒤에 위치하는 백엔드 서버를 정의하는 설정파일입니다.
위와 같은 기본 설정 값이 있는데 다 지우고 아래 설정으로 교체합니다.
# 분배 작업자 리스트 worker.list=was-lb worker.loadballance.retries=0 # was-lb : LoadBalancer worker.was-lb.type=lb worker.was-lb.balance_workers=was-01,was-02 worker.was-lb.method=T worker.was-lb.sticky_session=TRUE worker.was-lb.session_cookie=JSESSION1 # was-01 worker.was-01.port=8109 worker.was-01.host=192.168.88.135 worker.was-01.type=ajp13 worker.was-01.lbfactor=1 worker.was-01.max_packet_size=65536 # was-02 worker.was-02.port=8110 worker.was-02.host=192.168.88.135 worker.was-02.type=ajp13 worker.was-02.lbfactor=1 worker.was-02.max_packet_size=65536 # admin-cm worker.mag.port=8209 worker.mag.host=192.168.88.132 worker.mag.type=ajp13 worker.mag.lbfactor=1 worker.mag.max_packet_size=65536
Bash
복사
해당 설정파일에 간단한 설명을 드리겠습니다. 작은 단위부터 설명을하겠습니다.
1.
단일 worker 설정
worker의 이름을 지정할 때 worker.worker이름.하위설정 순으로 작성합니다.
worker.was-01.port=8109 # "was-01" 백엔드 서버의 서비스 포트 worker.was-01.host=192.168.88.135 # "was-01" 백엔드 서버의 IP worker.was-01.type=ajp13 # worker.was-01.port의 프로토콜 worker.was-01.lbfactor=1 # 해당 worker에 할당된 로드 밸런싱 가중치를 의미 worker.was-01.max_packet_size=65536 # "was-01" 백엔드 서버의 패킷 제한사이즈
Bash
복사
2.
특정 worker의 로드밸런싱 그룹 설정
worker.was-lb.type=lb # 단일 worker가 아닌 로드밸런서 그룹이라는 것을 정의 worker.was-lb.balance_workers=was-01,was-02 # 해당 로드밸런서의 타겟 worker 정의 worker.was-lb.method=T # 로드밸런싱 방식. 트래픽(T)을 기준으로 로드 밸런싱 worker.was-lb.sticky_session=TRUE # 스티키 세션 활성화 * 스티키 세션은 클라이언트가 처음 서버에 연결될 때 생성된 세션을 계속 유지하도록 하는 메커니즘 worker.was-lb.session_cookie=JSESSION1 # 스티키 세션을 구현하기 위해 사용되는 세션 쿠키의 이름을 지정 * Tomcat의 ROOT.xml에 정의한 설정과 동일하게 맞춰야합니다.
Bash
복사
3.
worker 리스트 설정
worker.list=was-lb,mag,addon-lb # 활성화할 worker 혹은, worker-lb를 선언합니다. * uriworkermap.properties에서 uri별로 반환하는 worker에 이름과 맞춰야합니다. worker.loadballance.retries=0 # 로드 밸런싱에서 실패한 요청에 대한 재시도(retry) 횟수 * 여기서는 재시도를 수행하지 않도록 0으로 설정되어 있습니다. 따라서 실패한 요청이 있을 경우 추가적인 재시도가 이루어지지 않습니다
Bash
복사

8. /etc/apache2/conf-jk/uriworkermap.properties

Apache2 서버로 들어오는 http 요청에서 uri를 기준으로 백엔드 서비스 라우팅을 결정할 때 사용하는 설정 파일입니다.
해당 설정은 초기에 없기 때문에 새로 파일을 추가하여 아래와 같이 설정 후, 해당 설정을 기반으로 필요한 부분을 설정합니다.
해당 설정에서 uri 별 설정에서 반환하는 지정자는, workers.properties 정의된 worker 혹은 worker-lb의 이름과 맞춰야합니다.
예시
기본적으로 해당 설정파일 내 정의한 설정의 우선순위는 위에서부터 우선순위가 정해집니다.
/mag|/* = mag;stateless=1
http://webserver.com/mag로 요청이 들어오는 경우, workers.properties 파일에 mag라는 이름을 가진 worker에 해당하는 서버로 요청을 라우팅합니다.
!/mag|/* = was-lb
http://webserver.com/mag아닌 요청이 들어오는 경우, workers.properties 파일에 was-lb라는 이름을 가진 worker에 해당하는 서버로 요청을 라우팅합니다.
# Mapping URI for ADMIN /mag|/* = mag;stateless=1 # Mapping URI for Let's Encrypt !/.well-known|/* = was-lb /* = was-lb;stateless=1
Bash
복사

9. /etc/apache2/sites-available/crinity.default.conf

Apache 서버에서 서비스하는 페이지에 대한 설정입니다.
멀티 도메인 서비스 환경에서는, SSL 인증서를 도메인별 지정을해야하므로
여러개의 VirtualHost 설정을 관리하는 방식이 유리합니다.
기본 설정파일은 제거하도록 하겠습니다.
/etc/apache2/sites-available/000-default.conf
/etc/apache2/sites-available/default-ssl.conf
/etc/apache2/sites-enabled/000-default.conf (심볼릭 링크)
pwd /etc/apache2/sites-available rm 000-default.conf default-ssl.conf rm ../sites-enabled/000-default.conf
Bash
복사
아래 설정 파일은 기본 템플릿으로 사용하려는 기본 도메인 파일입니다.
/etc/apache2/sites-available/ 경로 아래, 적당한 이름으로 파일을 만들어주세요.
물론, 필요한 부분은 수정해서 사용해주세요.
<VirtualHost *:80> # 도메인 정보 ServerName dev.domain.com ServerAlias sub.domain.com ServerAlias sub2.domain.com DocumentRoot "/home/apache/htdocs" # 워커 JkMountFile /etc/libapache2-mod-jk/uriworkermap.properties # HSTP (2 yrs = 63072000 sec) # Header unset Strict-Transport-Security # Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" # X-Frame (동일 호스트에 대한 iframe 허용) # Header unset X-Frame-Options # Header always set X-Frame-Options SAMEORIGIN # 리다이렉트 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} </VirtualHost> <VirtualHost *:443> # 도메인정보 ServerName dev.domain.com ServerAlias sub.domain.com ServerAlias sub2.domain.com DocumentRoot "/home/apache/htdocs" # 워커 JkMountFile /etc/libapache2-mod-jk/uriworkermap.properties # HSTP (2 yrs = 63072000 sec) # Header unset Strict-Transport-Security # Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" # X-Frame (동일 호스트에 대한 iframe 허용) # Header unset X-Frame-Options # Header always set X-Frame-Options SAMEORIGIN # 리다이렉트(캘린더접근 차단) RewriteEngine On RewriteCond %{HTTPS} =on RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK) RewriteRule ^/(?=cal)(.*) https://%{SERVER_NAME}/mail [R,L] # <IfModule mod_remoteip.c> # RemoteIPHeader X-Forwarded-For # RemoteIPInternalProxy 49.254.28.130 # </IfModule> # 인증서 SSLEngine on SSLProtocol all -TLSv1 -TLSv1.1 SSLCACertificateFile /maildata/_certificate/customer/domain.com/cert.pem SSLCertificateFile /maildata/_certificate/customer/domain.com/fullchain.pem SSLCertificateKeyFile /maildata/_certificate/customer/domain.com/privkey.pem </VirtualHost>
Bash
복사
https 서비스 (443)를 하려면.. 당연히 사전에 인증서를 준비하셔야합니다.
만약 SSLCertificateKeyFile 에 설정하는 인증서 키 파일에 비밀번호가 설정되어 있으면,
Apache2 서버를 재기동할 때 비밀번호 입력을 요구합니다.
당연히, 비밀번호를 입력하지 못하면, 해당 서비스 기동을 실패하니, 주의해주세요.
멀티 도메인 환경에서는 인증서별 비밀번호를 입력하는 과정이 번거로워지니,
가능하면 비밀번호가 없는 인증서를 사용하도록 합시다.
설정 파일을 모두 작성하였으면, /etc/apache2/sites-enabled 디렉토리에 심볼릭 링크를 걸어 추가한 사이트(도메인) 설정을 활성화 합니다.
pwd /etc/apache2/sites-enabled ln -s ../sites-available/domain.default.conf domain.default.conf
Bash
복사
해당 서비스에 새로운 도메인을 추가할때에는 domain.default.conf 을 복사하여, 해당 파일에 새로운 도메인의 정보로 수정합니다.
마찬가지로, /etc/apache2/sites-enabled 디렉토리에 심볼릭 링크를 걸어 추가한 사이트(도메인) 설정을 활성화 합니다.
pwd /etc/apache2/sites-enabled ln -s ../sites-available/mail.domain.or.kr.conf mail.domain.or.kr.conf
Bash
복사
저는 https 설정을 하였기 때문에, 해당 서버에 인증서 파일을 업로드 하였습니다.
서비스 기동 전, apachectl 을 통하여 설정 파일 검증을 합니다.
저의 경우 /home/apache/htdocs 디렉토리가 없다고 하네요. 디렉토리를 만들고 다시 검증하니.
통과가 되었네요.
apachectl -t mkdir -p /home/apache/htdocs
Bash
복사
Apache2 서비스를 재시작하였습니다. 다행히 오류는 없네요