아파치 웹 서버의 개념

  • 아파치(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에서 테스트합니다.

 

7-1. mod_rewrite 활성화
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 접속
 - 현재 시간 표시 확인

+ Recent posts