아파치 웹 서버의 개념
-
아파치(Apache HTTP Server)는 오픈소스 웹 서버 소프트웨어로, HTTP 요청을 처리하여 웹 콘텐츠를 클라이언트에 제공합니다.
-
전 세계적으로 가장 널리 사용되는 웹 서버 중 하나로, 유연성, 확장성, 안정성을 특징으로 합니다. 다양한 운영 체제(리눅스, 윈도우 등)에서 동작하며, 정적/동적 콘텐츠를 처리할 수 있습니다.
아파치의 기본 구조와 모듈
- 기본 구조
- 코어: 아파치의 핵심 기능(HTTP 요청 처리, 설정 파일 파싱 등)을 담당
- 모듈: 특정 기능을 추가하는 플러그인 형태로, 동적으로 로드/제거 가능
- MPM(Multi-Processing Module): 요청 처리 방식 결정(예: prefork, worker, event)
- 핸들러: 요청에 대한 처리 방식 정의(예: CGI, PHP) - 주요 모듈:
- mod_rewrite: URL 재작성
- mod_ssl: HTTPS 지원
- mod_proxy: 프록시 기능
- mod_auth*: 인증 및 권한 관리
- mod_cache: 캐싱으로 성능 최적화
아파치의 주요 설정 파일
- httpd.conf: 아파치의 주 설정 파일. 서버 전반의 설정(포트, 디렉토리, 모듈 로드 등)을 정의
- 경로: 보통 /etc/httpd/conf/ 또는 /etc/apache2/에 위치
- apache2.conf: 데비안 계열 시스템에서 사용되는 주 설정 파일
- conf.d/: 추가 설정 파일을 포함하는 디렉토리
- sites-available/ 및 sites-enabled/: 가상 호스트 설정 관리(데비안 계열)
- mods-available/ 및 mods-enabled/: 모듈 활성화/비활성화 관리
- envvars: 환경 변수 설정 파일
.htaccess 파일의 사용법
- .htaccess는 아파치 웹 서버에서 디렉토리별로 설정을 제어하는 파일로, 서버 전체 설정(httpd.conf)을 변경하지 않고 특정 디렉토리의 동작을 커스터마이징할 수 있습니다.
- .htaccess 파일 작성 시 주의사항
1. 문법 오류: 잘못된 설정은 500 Internal Server Error를 유발할 수 있음. 설정 전 테스트 권장
2. 성능 고려: .htaccess는 요청마다 파일을 읽으므로 과도한 사용은 서버 성능 저하를 초래, 가능하면 설정을 httpd.conf에 통합
3 .htaccess 자체를 보호: <Files ".htaccess"> Order Deny,Allow Deny from all </Files>.
4. 민감한 정보(예: DB 비밀번호)는 포함시키지 말 것.
5. 백업: 변경 전 원본 파일 백업.
6. 모듈 확인: 사용하려는 기능(예: mod_rewrite, mod_auth)이 서버에 활성화되어 있는지 확인. - .htaccess 파일 위치
- 보통 웹 루트 디렉토리(/var/www/html/) 또는 하위 디렉토리에 위치
- 특정 디렉토리에만 영향을 미치며, 하위 디렉토리에도 상속됨(상위 설정이 우선) - 테스트 방법
- 설정 후 브라우저로 확인
- 오류 로그 확인: /var/log/apache2/error.log 또는 /var/log/httpd/error_log
- 아파치 설정 테스트: apachectl configtest
1. htaccess 활성화
- .htaccess를 사용하려면 주 설정 파일(httpd.conf 또는 apache2.conf)에서 해당 디렉토리에 대해 AllowOverride 지시어를 설정해야 합니다.
- AllowOverride All: 모든 .htaccess 설정 허용
AllowOverride None: .htaccess 비활성화
설정 변경 후 아파치 재시작: sudo systemctl restart apache2 또는 sudo service httpd restart
<Directory /var/www/html>
AllowOverride All
Require all granted
</Directory>
2. 주요 사용 사례와 설정 예시
2-1. URL 재작성(mode_rewrite)
- URL을 동적으로 변경하거나 리다이렉트
- ex) example.com/old-page를 example.com/new-page로 301 리다이렉트
R=301: 영구 리다이렉트 / L: 이후 규칙 무시
RewriteEngine On
RewriteRule ^old-page$ new-page [R=301,L]
2-2. 접근 제어
- 특정 IP 또는 사용자에 대한 접근 제한
- ex) 특정 IP만 접근 허용
Order Deny,Allow
Deny from all
Allow from 192.168.1.0/24
- ex) 디렉토리 접근 차단
Deny from all
2-3. 비밀번호 보호(mod_auth)
- 디렉토리에 비밀번호 인증 추가
- .htpasswd 파일 생성: htpasswd -c /path/to/.htpasswd username
- 설정
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /path/to/.htpasswd
Require valid-user
2-4. 커스텀 에러 페이지
- 특정 HTTP 에러 코드에 대해 사용자 정의 페이지 표시
- ex) 404, 403, 500 에러 페이지 설정
ErrorDocument 404 /custom_404.html
ErrorDocument 403 /custom_403.html
ErrorDocument 500 /custom_500.html
2-5. MIME 타입 및 캐싱 제어
- 파일 타입별 캐싱 설정(mod_expires 사용)
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType text/css "access plus 1 week"
</IfModule>
2-6. 파일 확장자 숨기기 또는 강제 리다이렉트
- ex) .php 확장자 숨기기
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]
2.7 디렉토리 목록 비활성화
- 디렉토리 내 파일 목록 표시 방지
Options -Indexes
2.8 Gzip 압축 활성화
- 콘텐츠 압축으로 전송 속도 향상
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css application/javascript
</IfModule>
아파치 성능 튜닝의 기초
-
아파치 웹 서버의 성능 튜닝은 서버 자원(CPU, 메모리, 네트워크)을 효율적으로 사용하고 응답 시간을 단축하며 동시 접속자를 효과적으로 처리하는 것을 목표로 합니다.
1. MPM(Multi-Processing Module) 최적화
- MPM은 아파치가 요청을 처리하는 방식을 결정합니다. 사용 중인 MPM(prefork, worker, event)에 따라 설정을 조정합니다.
- MPM 종류
1. prefork: 프로세스 기반, 안정적이지만 메모리 사용량이 높음. PHP와 호환성이 좋음
2. worker: 스레드 기반, 메모리 효율적이며 동시 접속 처리에 유리
3. event: 비동기 처리로, KeepAlive 연결에서 성능 향상
- MPM 확인
apachectl -V | grep MPM
- 설정
<IfModule mpm_worker_module>
ServerLimit 250 # 최대 프로세스 수
StartServers 5 # 시작 시 프로세스 수
MaxClients 200 # 최대 동시 접속자 수
MinSpareThreads 25 # 최소 대기 스레드
MaxSpareThreads 75 # 최대 대기 스레드
ThreadsPerChild 25 # 프로세스당 스레드 수
MaxRequestsPerChild 10000 # 프로세스 재사용 한도
</IfModule>
2. 불필요한 모듈 비활성화
- 기본적으로 로드되는 모듈이 많아 자원을 낭비할 수 있음
- 확인 명령어
apachectl -M
- 비활성화 방법
1. 데비안 계열: a2dismod <module_name>
2. CentOS 계열: /etc/httpd/conf.modules.d/에서 모듈 로드 주석 처리
3. KeepAlive 설정
- KeepAlive는 클라이언트와의 연결을 유지해 반복 요청 시 오버헤드를 줄입니다.
- 설정 예시 (httpd.conf)
1. KeepAliveTimeout: 2~5초로 설정해 연결 유지 시간 최소화
2. 높은 트래픽 시 MaxKeepAliveRequests 낮추기
KeepAlive On
KeepAliveTimeout 5 # 연결 유지 시간(초)
MaxKeepAliveRequests 100 # 연결당 최대 요청 수
4. 캐싱 활성화
- 정적 콘텐츠(이미지, CSS, JS 등)를 캐싱해 서버 부하 감소
- mod_expires
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
</IfModule>
- mod_cache(디스크/메모리 캐싱)
<IfModule mod_cache.c>
CacheEnable disk /
CacheRoot "/var/cache/apache2"
</IfModule>
5. 로그 최적화
- 불필요한 로그는 디스크 I/O와 성능에 영향을 미침
- 설정(액서스 로그 최소화)
LogLevel을 error 또는 warn 으로 설정
LogLevel warn
CustomLog /var/log/apache2/access.log combined
6. 연결 및 타임아웃 설정
- 요청 처리 시간을 최적화해 대기 시간 감소
- 설정
Timeout 30 # 전체 요청 타임아웃(초)
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
7. 하드웨어 및 OS 최적화
- 메모리: MaxClients를 서버 메모리에 맞게 설정
- 파일 디스크립터: 최대 열린 파일 수 증가
ulimit -n 65535
다음과 같은 내용에 도전해봅시다.
1. 아파치와 Nginx의 차이점 이해하기
아파치(Apache) | Nginx | |
아키텍처 | 프로세스 기반 모델(MPM: Multi-Processing Module)을 사용. prefork는 요청당 프로세스 생성, worker는 스레드 기반으로 동작. 동적 콘텐츠 처리에 강력 | 비동기, 이벤트 기반 모델. 단일 스레드로 다수의 연결을 효율적으로 처리. 높은 동시 접속 처리에 최적 |
성능 | 모듈이 많아 유연하지만, 높은 동시 접속 시 메모리와 CPU 사용량 증가 | 정적 콘텐츠 제공과 동시 접속 처리에서 빠르고, 메모리 사용량이 적음. 역방향 프록시 및 로드 밸런싱에 강점 |
설정 | httpd.conf와 .htaccess를 통한 설정. 모듈 기반으로 유연하지만 복잡할 수 있음 | 간단한 구성 파일(nginx.conf) 사용. 설정이 직관적이며, .htaccess 지원 없음 |
모듈 지원 | 다양한 모듈(mod_rewrite, mod_php 등)로 확장 가능. 동적 로딩 지원 | 모듈은 컴파일 시 포함해야 하며, 아파치보다 제한적. 하지만 기본 기능이 강력 |
사용 사례 | 동적 콘텐츠(예: PHP 기반 워드프레스)와 복잡한 설정이 필요한 환경에 적 | 정적 콘텐츠, 고트래픽 사이트, 프록시 서버, 로드 밸런서로 사용 시 탁월 |
2. Tomcat에 대해 이해하기
- Apache Tomcat은 Java 기반 웹 애플리케이션을 실행하기 위한 오픈소스 서블릿 컨테이너이자 웹 서버입니다.
- Java Servlet, JSP(JavaServer Pages), WebSocket 등을 지원하며, 주로 Java EE 애플리케이션 호스팅에 사용됩니다.
- 주요 기능
- 서블릿 컨테이너: Java Servlet과 JSP를 실행해 동적 웹 콘텐츠 생성
- 웹 서버: HTTP 요청을 처리하며, 정적 콘텐츠도 제공 가능(최신 버전에서 개선)
- 클러스터링: 다중 Tomcat 인스턴스로 세션 공유 및 부하 분산 지원
- 보안: Realm을 통한 인증/인가, SSL/TLS 지원 - 구성 요소
- Catalina: 서블릿 컨테이너의 핵심 엔진
- Coyote: HTTP, AJP 프로토콜 처리
- Jasper: JSP를 Java 코드로 컴파일 - 설정
- 주요 설정 파일: server.xml (서버 포트, 커넥터 등), web.xml (애플리케이션 설정)
- WAR 파일 배포: 웹 애플리케이션을 /webapps 디렉토리에 배포 - 장점
- Java 애플리케이션에 특화, 안정적이고 성숙한 플랫폼
- 커뮤니티 지원 강력(Apache Software Foundation)
- 다양한 OS 지원(리눅스, 윈도우 등) - 단점
- 정적 콘텐츠 처리 속도가 Nginx/아파치보다 느림
메모리 사용량이 상대적으로 높음(Java 기반)
- 복잡한 설정과 Java 지식 요구
3. apache 로컬환경 or 클라우드서버 에서 설치 후 실습해보기
- 로컬환경으로 사용되는 WSL로 실습 진행
1. 패키지 업데이트 진행
sudo apt update && sudo apt upgrade -y
2. 아파치 설치
sudo apt install apache2 -y
3. 아파치 서비스 시작 및 활성화
sudo systemctl start apache2
sudo systemctl enable apache2
4. 설치 확인
- 브라우저에서 http://localhost (로컬) 또는 http://IP 접속
- 기본 아파치 환영 페이지가 표시되면 성공
5. 상태 확인
6. 간단한 HTML 페이지 작성
웹 루트 디렉토리 확인
- 기본 디렉토리: /var/www/html
테스트 전 index.html 백업 파일 만들기
sudo cp /var/www/html/index.html /var/www/html/index_backup.html
HTML 파일 생성
sudo nano /var/www/html/index.html
HTML 소스 입력 ( 이전에 사용한 자기소개 코드 사용)
<!DOCTYPE html>
<html>
<head>
<title>나의 소개</title>
<style>
body {
background-color: #f0f8ff;
font-family: Arial, sans-serif;
padding: 20px;
}
h1 {
color: #3333cc;
}
p {
color: #000000;
font-size: 18px;
line-height: 1.6;
}
button {
margin-top: 20px;
padding: 10px 20px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 8px;
cursor: pointer;
}
button:hover {
background-color: #45a049;
}
</style>
</head>
<body>
<h1>안녕하세요! 👋</h1>
<p>저는 보안관제로 근무중이며,모의해킹으로 이직을 하기 위해<br> <strong>ELITE HACKER Bootcamp 4th</strong>를 배우고 있는 직장인입니다.</p>
<p>진행중인 <strong>pre.Web</strong>, <strong>pre.Rev</strong> 모두에 관심이 있어요.</p>
<p><strong>pre.Web</strong> 코스를 다 끝내고 나면 <strong>pre.Rev</strong> 코스도 도전할 예정입니다!</p>
<p>취미는 🎮 게임, 🎤 노래 부르기 입니다!</p>
<button onclick="alert('응원합니다! 화이팅!')">응원 받기</button>
</body>
</html>
권한 설정
sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html
확인
- 브라우저에서 http://localhost (로컬) 또는 http://IP 접속
위 사진 처럼 한글이 깨지는 현상을 확인할 수 있었고, 해결하기 위해 아파치 설정을 수정하였습니다.
charset.conf 로 접근하여 AddDefaultCharset UTF-8이 주석으로 처리되어 있는데 주석을 지우고 저장합니다.
sudo nano /etc/apache2/conf-available/charset.conf
설정을 적용하기 위해 아파치 재시작을 합니다.
sudo service apache2 restart
UTF-8 이 적용되어 한글이 제대로 나오는 것을 확인할 수 있었습니다.
7. .htaccess 실습
- .htaccess를 사용해 간단한 URL 리다이렉트를 설정하고 Windows에서 테스트합니다.
sudo a2enmod rewrite
7.2. .htaceess 허용
000-default.conf 접근
sudo nano /etc/apache2/sites-available/000-default.conf
<VirtualHost> 섹션 내에 추가
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
7.3. .htaccess 생성
sudo nano /var/www/html/.htaccess
아래 내용 입력 (/old_age를 /new_page.html로 리다이렉트)
- RewriteBase / 를 제외하고 진행하였으나, 리다이렉트가 /var/www/html/new_page.html로 되었으며 정상적인 페이지가
확인 되지 않았습니다.
RewriteEngine On
RewriteBase /
RewriteRule ^old_page$ new_page.html [R=301,L]
테스트용 페이지 생성
sudo nano /var/www/html/new-page.html
아래 내용 입력
<!DOCTYPE html>
<html>
<body>
<h1>New Page</h1>
<p>You have been redirected here!</p>
</body>
</html>
아파치 재시작
sudo systemctl restart apache2
실행 결과
- old_page 를 입력하여 접속하였으나 리다이렉트되어 new_page.html 화면이 보이는 것을 확인하였습니다.
8. 비밀번호 보호 디렉토리 설정
- 특정 디렉토리에 비밀번호 인증을 추가해 접근을 제한
- htaccess와 .htpasswd를 사용한 보안 설정 학습
8-1. 보호할 디렉토리 생성
sudo mkdir /var/www/html/secret
sudo nano /var/www/html/secret/index.html
HTML 코드 입력
<!DOCTYPE html>
<html>
<body>
<h1>Secret Area</h1>
<p>This is a password-protected page!</p>
</body>
</html>
8-2. .htpasswd 파일 생성
- 사용자 인증을 위한 비밀번호 파일 생성
sudo htpasswd -c /etc/apache2/.htpasswd testuser
8.3. .htaccess 설정
sudo nano /var/www/html/secret/.htaccess
아래 코드 입력
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
8-4. 권한 설정
sudo chown -R www-data:www-data /var/www/html/secret
sudo chmod -R 755 /var/www/html/secret
8-5. 아파치 설정 확인
- /etc/apache2/sites-available/000-default.conf에서 AllowOverride All 확인
- 위에서 실습 진행할때 적용 해두었습니다.
8-6. 아파치 재시작
sudo systemctl restart apache2
8-7. 테스트
Windows 브라우저에서 http://localhost/secret 접속
사용자 이름(testuser)과 비밀번호 입력
"Secret Area" 페이지 표시 확인
잘못된 비밀번호 입력 시 401 Unauthorized 확인
9. 커스텀 에러 페이지 설정
- 404, 403 등의 HTTP 에러에 사용자 정의 페이지 제공
9-1.에러 페이지 생성
sudo nano /var/www/html/404.html
HTML 코드 입력
<!DOCTYPE html>
<html>
<body>
<h1>404 - Page Not Found</h1>
<p>Sorry, the page you requested does not exist.</p>
</body>
</html>
9-2. .htaccess 설정
sudo nano /var/www/html/.htaccess
아래 코드 추가
ErrorDocument 404 /404.html
9-3. 권한 설정
sudo chown www-data:www-data /var/www/html/404.html
sudo chmod 755 /var/www/html/404.html
9-4. 아파치 재시작
sudo systemctl restart apache2
9-5. 테스트
- 브라우저에서 생성되어 있지 않은 파일로 접속
- "404 - Page Not Found" 페이지 표시 확인
10. PHP 연동 및 동적 페이지
- 아파치에 PHP를 설치해 동적 웹 페이지 제공
- 간단한 PHP 스크립트로 서버 정보 출력
10-1. PHP 설치
sudo apt update
sudo apt install php libapache2-mod-php -y
10-2.PHP 테스트 파일 생성
sudo nano /var/www/html/info.php
아래 php 코드 입력
10-3. 권한 설정
sudo chown www-data:www-data /var/www/html/info.php
sudo chmod 755 /var/www/html/info.php
10-4. 아파치 재시작
sudo systemctl restart apache2
10-5. 테스트
- Windows 브라우저에서 IP/info.php 접속
- PHP 정보 페이지(버전, 설정 등) 표시 확인
10-6. 간단한 PHP 페이지 추가
sudo nano /var/www/html/hello.php
아래 php 코드 입력
<!DOCTYPE html>
<html>
<body>
<h1>Hello, PHP!</h1>
<p>Current time: <?php echo date("Y-m-d H:i:s"); ?></p>
</body>
</html>
10-7. 권한 설정
sudo chown www-data:www-data /var/www/html/hello.php
sudo chmod 755 /var/www/html/hello.php
10-8. 테스트
- Windows 브라우저에서 IP/info.php 접속
- 현재 시간 표시 확인
'ELITE HACKER Bootcamp 4th > 2주차' 카테고리의 다른 글
[2주차 TIL] KnockOn Bootcamp PHP (1) | 2025.04.13 |
---|---|
[2주차 TIL] KnockOn Bootcamp Mysql (1) | 2025.04.12 |
[2주차 TIL] KnockOn Bootcamp Javascript Part 2 (0) | 2025.04.12 |
[2주차 TIL] KnockOn Bootcamp Javascript Part 1 (0) | 2025.04.12 |
[2주차 TIL] KnockOn Bootcamp HTML (0) | 2025.04.12 |