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 명령을 사용합니다.
- 주 구성 파일 편집:
[root@localhost /usr/local/apache2/etc]# vim httpd.conf
Include etc/extra/httpd-autoindex.conf
- 서브 구성 파일 편집:
[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) 사용자 인증
특정 디렉토리를 보호하여 사용자 인증을 강화합니다.
- 주 구성 파일 편집:
[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>
- .htaccess 파일 작성:
[root@localhost /usr/local/apache2/htdocs/phpmyadmin]# vim .htaccess
AuthName "welcome"
AuthType basic
AuthUserFile /usr/local/apache2/htdocs/apache.passwd
require valid-user
- 사용자 계정 추가:
[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
- 서비스 재시작:
[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>