웹서버 - Apache

1. 개요

Apache는 세계적으로 가장 많이 사용되는 웹 서버 소프트웨어입니다. 다양한 운영 체제에서 사용할 수 있으며, 그 성능과 보안性으로 인해 광범위하게 사용되고 있습니다. Apache는 안정적이고 확장성이 좋아,/perl, python, php 등의 인터프리터를 컴파일하여 통합할 수 있습니다.

Apache는 SSL 기술을 지원하며, 여러 개의 가상 호스트를 운영할 수 있습니다. Apache는 프로세스 기반 구조를 사용하며, 프로세스가 하나의 요청만 처리한다는 단점을 가지고 있지만, 확장은 서버 수를 늘리는 방식으로 대체로 수행됩니다. 오늘날에도 여전히 가장 많이 사용되고 있습니다.

2. 작업 모드

Apache에는 총 세 가지 안정적인 MPM(멀티 프로세싱 모듈) 모드가 있습니다. prefork, worker, event 모드가 있습니다.

prefork 모드

프로그램 시작 시 초기에 몇 개의 자식 프로세스를 미리 생성합니다. 이는 프로세스 생성과 소멸의 Overhead를 줄이기 위해 사용됩니다. 각 프로세스는 하나의 스레드만을 소유하며, 한 번에 하나의 요청만 처리합니다.

장점: 안정적이고 모든 모듈과 호환성 좋음. 프로세스가 독립적이기 때문에 스레드의 안전 문제 걱정 없음. 단점: 프로세스당 많은 자원을 사용하며, 고并发 환경에서 부적합함.

worker 모드

프로세스와 스레드의 혼합 모드입니다. 초기에少数의 프로세스를 생성한 후, 각 프로세스 안에서 여러 스레드를 실행합니다. 요청이 들어오면 해당 스레드가 처리합니다. 스레드는 프로세스보다 가벼워서 메모리 사용량이 적습니다. 고并发 환경에서(prefork보다) 우수합니다.

장점: 메모리 사용량이 적고 고并发 환경에서 잘 작동 단점: 스레드의 안전 문제 고려해야 함.

event 모드

worker 모드와 유사하지만, Keep-Alive 요청을 관리하는 전용 스레드를 갖습니다. 이는 busy 상태의 서버에서 연결을 절약하는 데 도움을 줍니다. 이 모드는 연결 수가 많을 때 유용하지만 HTTPS 환경에서는 사용할 수 없습니다.

장점: Keep-Alive 연결 관리 효율적 단점: HTTPS 환경에서는 사용 불가

모드 확인 방법:

httpd -V |grep -i "server mpm"

모드 지정 방법: 컴파일 시 --with-mpm=xxx 옵션 사용

3. 관련 파일 위치

구성 파일 위치:

  • 소스 패키지 설치: PREFIX/etc/httpd.conf (주 구성 파일)
  • 소스 패키지 설치: PREFIX/etc/extra/*.conf (서브 구성 파일)
  • RPM 패키지 설치: /etc/httpd/httpd.conf

웹 파일 위치:

  • 소스 패키지 설치: PREFIX/htdocs/
  • RPM 패키지 설치: /var/www/html/

로그 파일 위치:

  • 소스 패키지 설치: PREFIX/logs/
  • RPM 패키지 설치: /var/log/httpd/

4. 구성 파일 상세

기본 환경 변수 설정

ServerRoot        /usr/local/apache2    # Apache 설치 경로
Listen           :80                   #侦听포트
LoadModule       php7                  #로드할 모듈
User            #사용자
Group           #그룹
ServerAdmin      #관리자 이메일
ServerName       #서버명
ErrorLog "logs/error_log"              #에러로그 경로
CustomLog "logs/access_log" common     #접근로그 경로
DirectoryIndex index.html index.php     #홈페이지 파일 우선순위
Include etc/extra/httpd-vhost.conf      #서브 구성 파일 포함

홈 디렉토리 및 권한

DocumentRoot "/usr/local/apache2/htdocs"
<Directory "/usr/local/apache2/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>

5. 实驗

1) Apache 디렉토리 앨리어스

웹 요청을 특정 디렉토리로 매핑하려면 Alias 명령을 사용합니다.

  1. 주 구성 파일 편집:
[root@localhost /usr/local/apache2/etc]# vim httpd.conf
Include etc/extra/httpd-autoindex.conf
  1. 서브 구성 파일 편집:
[root@localhost ~]# vim /usr/local/apache2/etc/extra/httpd-autoindex.conf
Alias /icons/ "/usr/local/apache2/icons/"
<Directory "/usr/local/apache2/icons">
    Options Indexes MultiViews
    AllowOverride None
    Require all granted
</Directory>

2) 사용자 인증

특정 디렉토리를 보호하여 사용자 인증을 강화합니다.

  1. 주 구성 파일 편집:
[root@localhost /usr/local/apache2/etc]# vim httpd.conf
<Directory "/usr/local/apache2/phpmyadmin/htdocs/phpmyadmin">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>
  1. .htaccess 파일 작성:
[root@localhost /usr/local/apache2/htdocs/phpmyadmin]# vim .htaccess
AuthName "welcome"
AuthType basic
AuthUserFile /usr/local/apache2/htdocs/apache.passwd
require valid-user
  1. 사용자 계정 추가:
[root@localhost /usr/local/apache2/htdocs/phpmyadmin]# htpasswd -c /usr/local/apache2/htdocs/apache.passwd test1
[root@localhost /usr/local/apache2/htdocs/phpmyadmin]# htpasswd -m /usr/local/apache2/htdocs/apache.passwd test2
  1. 서비스 재시작:
[root@localhost ~]# httpd -t
[root@localhost ~]# systemctl restart httpd

3) 가상 호스트

가상 호스트는 한 대의 서버에서 여러 웹사이트를 운영할 수 있도록 합니다.

준비 작업:

  • 두개의 도메인 준비
  • /htdocs/ 하위에 sohu와 sina 디렉토리 생성

구성 파일 편집:

[root@localhost /usr/local/apache2/etc/extra]# vim httpd-vhosts.conf
<VirtualHost 192.168.80.131:80>
    ServerAdmin webmaster@sohu.com
    DocumentRoot "/usr/local/apache2/htdocs/sohu"
    ServerName www.sohu.com
    ErrorLog "logs/sohu-error_log"
    CustomLog "logs/sohu-access_log" common
</VirtualHost>

<VirtualHost 192.168.80.131:80>
    ServerAdmin webmaster@sina.com
    DocumentRoot "/usr/local/apache2/htdocs/sina"
    ServerName www.sina.com
    ErrorLog "logs/sina-error_log"
    CustomLog "logs/sina-access_log" common
</VirtualHost>

서비스 재시작:

[root@localhost /usr/local/apache2/etc/extra]# httpd -t
[root@localhost /usr/local/apache2/etc/extra]# systemctl restart httpd

6. 도메인 점프

여러개의 도메인 중 하나를 주 도메인으로 강제로 리디렉션 시킵니다.

구성 파일 편집:

[root@localhost /usr/local/apache2/etc/extra]# vim httpd-vhosts.conf
<Directory "/usr/local/apache2/htdocs/sohu">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

.htaccess 파일 작성:

[root@localhost /usr/local/apache2/htdocs/sohu]# vim .htaccess
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.sohu.com
RewriteRule ^(.*)$ http://www.sina.com/$1 [R=permanent,L]

서비스 재시작:

[root@localhost /usr/local/apache2/etc/extra]# httpd -t
[root@localhost /usr/local/apache2/etc/extra]# systemctl restart httpd

7. Apache + OpenSSL SSL 사용

SSL을 사용하여 안전한 통신을 설정합니다.

준비 작업:

  • SSL 모듈 활성화 확인
  • 인증서 파일 준비

인증서 생성:

[root@localhost /usr/local/apache2/certs]# openssl genrsa -out apa.key 1024
[root@localhost /usr/local/apache2/certs]# openssl req -new -key apa.key -out apa.csr
[root@localhost /usr/local/apache2/certs]# openssl x509 -req -days 365 -sha256 -in apa.csr -signkey apa.key -out apa.crt

구성 파일 수정:

[root@localhost /usr/local/apache2/etc]# vim httpd.conf
LoadModule ssl_module modules/mod_ssl.so
Include etc/extra/httpd-ssl.conf

SSL 구성 파일 수정:

SSLCertificateFile "/usr/local/apache2/certs/apa.crt"
SSLCertificateKeyFile "/usr/local/apache2/certs/apa.key"

가상 호스트 구성:

<VirtualHost _default_:443>
    DocumentRoot "/usr/local/apache2/htdocs"
    ServerName localhost:443
    SSLCertificateFile certs/apa.crt
    SSLCertificateKeyFile certs/apa.key
</VirtualHost>

서비스 재시작:

[root@localhost /usr/local/apache2/etc]# httpd -t
[root@localhost /usr/local/apache2/etc]# systemctl restart httpd

8. Apache 로그 관리

로그 파일 크기를 관리합니다.

로그 파일 경로 설정:

ErrorLog "logs/error_log"
CustomLog "logs/access_log" common

로그 자동화 설정:

ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/error_%Y%m%d.log 86400"
CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d.log 86400" combined

9. 특정 파일 형식의 로그 무기록

이미지나 스크립트 파일의 로그를 무기록으로 설정합니다.

구성 파일 편집:

[root@localhost /usr/local/apache2/etc]# vim httpd.conf
SetEnvIf Request_URI ".*\.gif$" image-request
...
CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d.log 86400" combined env=!image-request

10. Apache 정적 캐시 설정

정적 파일의 캐시 시간을 설정합니다.

캐시 설정:

<IfModule mod_expires.c>
    ExpiresActive on
    ExpiresByType image/gif "access plus 1 days"
    ...
</IfModule>

헤더를 통한 캐시 설정:

<IfModule mod_headers.c>
    <filesmatch "\. (html|htm|txt)$">
        header set cache-control "max-age=3600"
    </filesmatch>
    ...
</IfModule>

서비스 재시작:

[root@localhost /usr/local/apache2/etc]# httpd -t
[root@localhost /usr/local/apache2/etc]# systemctl restart httpd

11. PHP 실행 금지

특정 디렉토리에서 PHP 실행을 금지합니다.

구성 파일 편집:

<Directory /usr/local/apache2/htdocs/image>
    php_admin_flag engine off
    <filesmatch "(.*)php">
        Order deny,allow
        Deny from all
    </filesmatch>
</Directory>

태그: Apache web-server SSL virtual-hosting log-management

6월 23일 03:22에 게시됨