본문 바로가기

Computer/Apache

리눅스 Apache 설정하기

내 개인적인 기록을 남기는 것이 목적이기에 반말로 기록함. 혹시 검색해서 보시는 분들 양해 바랍니다.


Vmware로 CentOS 6.4를 설치했으며 기본적으로 설치된 httpd를 이용한다.


잘은 모르겠으나 기본적으로 설치된 httpd가 apache http server 인듯 하다


아파치가 설치되었는지 확인하려면 yum list | grep httpd 로 확인한다.




위와 같이 나왔다면 이미 설치가 되어있는 것이다. 버전까지 확인할 수 있다. (2.2.15)란다.


그럼 이제 아파치의 환경설정 파일을 열어보자. vi /etc/httpd/conf/httpd.conf 로 열면된다.

 


아파치 환경설정파일 내용


### Section 1 : Global Environment => 말 그대로 전체적인 환경이다.


ServerToken OS : 이 부분을 ServerToken Prod 로 바꾸면 아파치 에러시 다른메시지는 출력 하지 않는다고 한다. 보안상? 이렇게 하는게 좋을 것 같다. 다음 표를 참고하라. 

 Option 

Description

Result

 Prod

 웹서버의 이름만을 알려준다. Apache

 Major

 웹서버의 이름과 Major 버전번호만 알려준다. Apache/2

 Minor

 웹서버의 이름과 Minor 버전까지 알려준다. Apache/2.2

 Min

 웹서버의 이름과 Minimum 버전까지 알려준다.

 Apache/2.2.15

 OS

 웹서버의 이름과 버전, OS까지 알려준다. (기본값)

 Apache/2.2.15 (CentOS)

 Full

 최대한의 정보를 모두 알려준다.(웹서버, 운영체제, 등)

 Apache/2.2.15 (CentOS) DAV/2 PHP/5.2.9

 

ServerRoot /etc/httpd : 아파치 설치 디렉토리명

 

PidFile run/httpd.pid : 아파치가 실행되서 그 실행에 쓰이는 프로세스의 pid를 기록한다.

 

Timeout 60 : 여기서 설정한 시간만큼 Request에 대한 응답이 없을 때 연결을 끊는다. 디폴트 60으로 둠.


KeepAlive On : 위에서 설정한 시간만큼 커넥션을 유지한다. Off 로 설정하게 되면 한 번 응답을 받고 응답 후에 바로 연결을 끊는다. On으로 해 놓을 경우 재연결에 필요한 자원 및 시간을 절약할 수 있어 좋긴 하지만 반대로 생각하면 불필요한 자원과 시간을 잡고있게 된다. 그래서 설정한 연결의 수 보다 더 많은 요청이 들어올 경우 연결지연이 일어나게 되어 서버에 과부하가 올 수 있다. 나는 정식 서비스를 목적으로 웹서버를 돌리는 것이 아니라 혼자만 만질거라 그냥 On으로 두었다. 

 

MaxKeepAliveRequest 100 : 최대연결유지요청의 수? 라고 직역하면 되겠지? 주석에 따르면....무제한이란다 ㄷㄷ 그러면서 추천하는 것은 최대 퍼포먼스로 설정하는 것이란다...헐....최대 퍼포먼스가 도대체 얼마쯤이란 말이냐? ㄷㄷ 어쨋든 0으로 두면 무제한! 그냥 난 디폴트로 되어있는 100개로 그냥 둠...


KeepAliveTimeout 15 : 연결을 유지한 후 얼마 후에 끊을 것인지 설정. 그냥 난 디폴트 15로 둠.

 

#prefork MPM : 최대 허용 요청 갯수가 늘어나면 예전 방식인 fork 방식으로 프로세스를 늘려갈 경우에 대한 설정.

상세설정들은 그냥 보이는 그대로 httpd 데몬 시작시 시작 할 서버의 갯수, 최소&최대&최대한계 예비서버의 수, 최대 연결 수 등


# worker MPM : 스레드 방식으로 구동되며 데몬 시작부터 미리 설정한 수 만큼 스레드를 생성해서 준비한 상태로 시작한다. 상세 설정들은 위와 다를 바가 없다. 스레드 방식이 fork 방식보다 성능면에서는 우월하다. 

 

Listen 80 : 기본 포트 설정. 일반적으로 우리가 접속하는 웹페이지 혹은 웹서버는 80포트를 사용한다. 디폴트이기 때문에 우리는 주소 뒤에 :80을 붙이지 않는 것 뿐이다. 톰캣의 기본포트는 8080인데 이는 디폴트가 아니기에 표시를 해줘야 한다. 그래서 간혹 웹주소 뒤에 :8080을 붙이는 것이다.


# Dynamic Shared Object (DSO) Support : 설치에는 DSO 방식과 static 방식이 있다. static 방식은 한 번 설치 후 특정 모듈을 추가하려면 재설치를 해야하는데 DSO 방식은 재설치 없이 모듈만 추가하면 된다. 이런 DSO 방식을 지원하는 옵션이다. 모듈추가시 /etc/httpd/modules 폴더 안에 so 파일을 넣고 이 옵션에서 모듈명(일종의 닉네임)과 경로 및 파일명을 추가하면 된다.


include conf.d/*.conf : /etc/httpd/conf.d 폴더 안에 있는 모든 conf 파일을 시작시 로드한다.


#Extendestatus On : 서버의 상태 및 설정을 보여줄지 말지에 대한 설정이다. 기본적으로는 Off이다. 주석처리하면 Off가 된다.

 

User apache

Group apache  : 사실 잘 모르겠다. 그냥 뭔가 사용자와 그룹이라는 것만 알겠는데....아파치를 시작할 수 있는 사용자와 그룹을 설정하는 곳인듯 하다. 하지만 난 슈퍼유저(root)니까 상관 없을듯 ㅋㅋ 아마 jeus : tmax로 흔히 보는 상용서버의 설정과 마찬가지일듯 하다. 상용 WAS인 jeus도 다른 계정에서 실행하지 못하듯 이 httpd도 실행하려면 apache 계정에서 설정되어있는듯 하다. 물론 여기에 사용자의 계정과 그룹을 추가하면 해당 사용자도 httpd를 실행 할 권한을 줄 수 있겠지....하지만 난? 슈퍼유저니까 필요없어 ㅋㅋ



Section 2 : 'Main' Server configuration - 직역하자면...주요 서버설정? ㅋㅋ


ServerAdmin : 관리자 메일주소를 설정한다. 설정은 관리자계정@도메인주소 (예 : root@naver.com) 이런식으로 ^^

ServerName : 서버의 도메인 주소

UseCanonicalName Off : 이게 뭐냐? 나도 잘 모르겠다. 영어로 직역해서 대충은 알아듣겠는데 설명은 못하겠네...뭐 그냥 디폴트로 둠 ㅋㅋ

DocumentRoot "/var/www/html" : 문서의 루트(최상위) = tomcat 의 webapps


<Directory>

Options indexs FollowSymLinks : 뭔지 잘 모르겠다. ㅠㅠ 검색해보니 Options -indexs FollowSymLinks 이렇게 해 놓으면 "index를 죽여놓는 의미" 라고 한다. 아! 그렇다는 말은 폴더의 구조가 보이지 않게 한다는 설정인가보다!

예를 들면 아래 그림처럼 보이지 않게 하려면 "-indexs" 로 설정해야 할 것이다. 아래의 그림처럼 보이는 것은 자료실 같은 형태로 쓰일 때 일 것이다.



 


userdir : 유저 디렉토리 서비스

UserDir disable : 사용자에게 계정을 주지 않는다. 이 것을 enable로 하고 밑의 설정들을 두면 /home/계정명/public_html 이란 폴더에 사용자별로 웹소스를 두어 웹서비스를 할 수 있도록 한다는 것이다. 오~ 그렇다는 말은...웹호스팅해주는 업체에서 회원가입 하면 자동으로 주는 영역은 이걸 이용하면 된다는 것인가? 호오라~ ^^;


UserDir 아래 설정들...<Directory /home/*/public_html> 는 위에서 설명했고...Options 에서 Index 앞에 "-"를 넣어서 위의 그림과 같은 형태로 보이지 않게 설정하고 나머지 옵션들은 나도 몰라! 필요하면 그 때 그 때 검색해!! ㅋ


DirectoryIndex index.html index.html.var : 초기페이지로 인식할 파일명 난 DirectoryIndex index.html index.jsp index.php 이렇게 바꿨다. 나중에 php도 설치할꺼니까...ㅎㅎ jsp는 기본이고!


AccessFileName .htaccess : 뭔지 잘 몰라서 검색해봤더니 "디렉토리에 사용자 인증을 할 경우 참조할 파일명" 이라고 한다. 대충 감은 잡힌다만 확실하게는 모르겠다...;;


<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
</Files>

바로위에서 설정한 파일(".htaccess")의 내용을 볼 수 없게 할 때 사용하는 옵션이다. 보안상의 이유로 이 옵션은 설정해 두는 것이 좋다. 만약 이 옵션을 주석처리해 둔다면 ".htaccess"파일에 대한 보안은 누구도 장담할 수 없을 것이다.


TypesConfig conf/mime.types : 웹서버의 mime type을 지정한 파일을 지정한다. mime.types파일은 서버에 의해 리턴될 수 있는 파일명과 mime 형식을 기술해 놓은 파일이다.


DefaultType text/plain : mime.types 파일에 정의 되어있지 않은 파일형식에 대한 요청을 받았을 때 알 수 없는 문서타입에 대하여 사용할 기본적인 mime 타입을 정해둔다.


<IfModule mod_mime_magic.c>

    MIMEMagicFile /usr/apache/conf/magic

</IfModule>

mod_mime_magic module은 서버에서 type별 정의된 다양한 hints를 사용할수 있게 해준다. MIMEMagicFile은 hint가 정의된 위치를 알려준다.


HostnameLookups Off : 웹서버의 로그(access_log)를 지정하는 Format에서 "DNS Lookup"으로 지정하였을 때, domain으로 남길 것인가, IP Address로 남길 것인가를 지정한다. Default로 Off는 IP Address로 남기는 것이며, Domain으로 변경할 필요가 없으므로 on으로 설정한 것보다는 속도가 조금빠르다.on으로 하게 되면 IP address를 IP Domain으로 변환해야 하므로 속도가 조금 느릴 수 있다.


EnableMMAP Off: 커널에서 메모리매핑(mmap)을 지원한다면 아파치가 웹문서를 로딩하기 위하여 내부문서를 읽을때에 파일을 메모리 매핑하여 처리한다. 따라서 아파치의 성능이 크게 향상될수 있다. 그러나 메모리대응이 서버의 성능을 떨어트리고 심지어 안정성을 해치는 경우가 있고 smp Solaris 서버에서 아파치 2.0은 종종 mmap을 사용하지 않을때가 더 빠르다. 또한 NFS 마운트한 파일시스템에 있는 파일을 메모리 대응하는 도중에 다른 NFS 클라이언트에 있는 프로세스가 파일을 지우거나 파일크기를 줄이면, 웹서버 프로세스가 다음 번에 메모리대응한 파일내용을 읽을때 bus error가 발생할 수 있다. 위의 조건에 해당하면 전송하는 파일을 메모리대응하지 않도록 EnableMMAP off를 사용해야 한다.


EnableSendfile Off: 아파치는 운영체제가 sendfile을 지원하면 커널 sendfile을 사용하여 정적 파일을 서비스하는 경우 전송할 파일을 직접 읽지않을 수 있다. sendfile을 사용하면 read와 send를 따로 할 필요가 없어서 매우 빨라진다. 그러나 sendfile을 사용하면 웹서버의 안정성을 해치게되는 경우가 있고, 커널은 자신의 캐쉬를 사용하여 NFS로 마운트한 파일을 안정적으로 서비스할 수 없는 경우가 있으므로 EnableSendfile off를 사용해서 파일을 sendfile 전송하지 않도록 할수 있다.

[출처] apache 튜닝|작성자 친절한 지게꾼


ErrorLog logs/error_log : 에러로그를 작성할 경로와 파일명 설정


LogLevel warn : 에러로그의 내용을 얼마나 자세히 작성할지에 대한 레벨을 설정


Option 

Description

 none  or  *

발생하는 모든 상황에 대한 메시지

 emerg 

최상위, 매우 위험한 상황의 메시지. 전체공지가 요구되는 메시지

 alert 

즉각적으로 조치를 취해야하는 상황의 메시지, 즉시 행동이 취해져야하는 상황

 crit 

급한 상황은 아니지만 치명적인 시스템문제 발생 상황의 메시지

 warn 

주의를 요하는 메시지 즉 경고상황

 notice 

에러가 아닌 알림에 관한 메시지, 즉 경고상황

 info

단순한 프로그램에 대한 정보 및 통계관련 메시지, 보통수준으로 알려주는 상황

 debug 

최하위, 디버깅관련 메시지


음...그 아래 뭐가 쓰잘데 없어보이는 옵션이 많아서 이제부터 귀찮은건 패스 ㅠㅠ 중요해 보이는 것만(?) 해야지 ㅋㅋ


ServerSignature On : 부가적으로 서버가 생성하는 페이지(예 : 에러페이지, FTP 디렉토리 목록, mod_status, mod_info 출력 등, 단 CGI는 제외)에 서버의 버전과 가상호스트 이름을 포함하는 행을 추가하도록 한다. 다른 옵션으로는 Off, Email이 있다. Email로 설정하면 ServerAdmin으로의 mail:to 링크를 포함한다.


# Redirect permanent /foo http://www.example.com/bar : 특정 디렉토리경로로 방문자가 로딩하였을 경우에 지정된 다른 웹사이트경로(URL)로 방향전환을 할 수 있는 지시자이다. 위의 예에서는 방문자가 /foo 라는 디렉토리를 요청하였을 경우에 http://www.example.com/bar 라는 URL로 보여주도록 하는 설정이다. 매우 유용한 설정이며 ErrorDocument 라는 설정 지시자와 상호 연관되어 있는 지시자이다.


AddIcon : 서버에게 다양한 파일, 파일명 확장자에 대하여 어떤 아이콘을 보여줄 것인지를 설정한다. /icons/binary.gif 의 경우 .bin .exe의 파일확장자를 가지는 파일에 대하여 아이콘을 사용한다는 의미로 해석하면 된다.


AddDescription : 서버가 생성한 인데스의 파일 뒤에 간단한 설명을 표시할 때 사용한다. 이 설정은 IndexOptions가 FancIndexing으로 설정되었을때만 표시된다. 설정형식은 AddDescription "표시할 설명" 파일확장자


AddDefaultCharset UTF-8 : 외부로 보내지는 모든 웹문서들에 대하여 기본 charset을 지정한다. ISO-8859-1 이나 EUC-KR 으로 설정할 수도 있다.


#AddType application/x-tar .tgz : AddType은 MIME 설정파일인 mime.types에 정의되어 있지 않은 타입을 추가로 설정하고자 할 때에 사용된다.


#AddEncoding x-compress .Z

#AddEncoding x-gzip .gz .tgz

AddEncoding은 특정 브라우저로 하여금 자료를 받으면서 정보에 대한 압축해제를 할 수 있도록 한다. 단 모든 웹브라우저에서 이 기능을 제공하는 것은 아니다. 


AddType application/x-compress .Z

AddType application/x-gzip .gz .tgz

압축파일들에 대한 MIME 정의이다.


AddType application/x-x509-ca-cert .crt

AddType application/x-pkcs7-crl    .crl

SSL 인증과 관련된 MIME 타입 정의



Alias /error/ "/var/www/error/"


<IfModule mod_negotiation.c>

<IfModule mod_include.c>

    <Directory "/var/www/error">

        AllowOverride None

        Options IncludesNoExec

        AddOutputFilter Includes html

        AddHandler type-map var

        Order allow,deny

        Allow from all

        LanguagePriority en es de fr

        ForceLanguagePriority Prefer Fallback

    </Directory>


#    ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var

#    ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var

#    ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var

#    ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var

#    ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var

#    ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var

#    ErrorDocument 410 /error/HTTP_GONE.html.var

#    ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var

#    ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var

#    ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var

#    ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var

#    ErrorDocument 415 /error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var

#    ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var

#    ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var

#    ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var

#    ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var

#    ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var


</IfModule>

</IfModule>

위의 예는 에러 페이지에대한 설정을 하고 있다. 우선 에러가 발생하였을때 보여줄 웹문서의 위치를 Alias하였다. 기본적으로 제공되는 에레메세지는 국제표준적인 에러메세지의 모음이고 내용협상 기능과 SSI 기능을 사용하고 있다. 이때문에 두개의 모듈을 설정하고 그 안에서 에레문서의 디렉토리에 대한 설정을 하고 있다. 

에레메세지는 가상호트별로 따로 설정할 수도 있는데 많이 사용하는 404 에러메세지를 개성에 맞게 꾸밀 수 있다.

ErrorDocument 404 http://자신의 도메인/error.html 과 같은 방식을 이용할 수 있다.



BrowserMatch "Mozilla/2" nokeepalive

BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0

BrowserMatch "RealPlayer 4\.0" force-response-1.0

BrowserMatch "Java/1\.0" force-response-1.0

BrowserMatch "JDK/1\.0" force-response-1.0

BrowserMatch 지시자는 특정 브라우저들에 대한 특정 수행을 지시하기 위한 설정들이다. 

첫번째 것은 네스케이프 2.x 또는 그를 흉내내는 브라우저에 대하여 KeepAlive 기능을 쓰지 않도록 한다. 이 브라우저들은 KeepAlive 구현에 문제점을 갖고 있기 때문이다.

두번째 것은 HTTP/1.1을 잘못 구현하였고 301 또는 302 (redirect)반응에 대하여 KeepAlive를 제대로 지원하지 못하는 마이크로소프트 인터넷 익스플로러 4.0b2를 위한 것이다.

세번째 것은 네번째 다섯번째 것들은 기본적인 1.1 반응도 제대로 처리하지 못함으로써 HTTP/1.1 스펙을 위반하고 있는 브라우저에 대하여 HTTP/1.1 반응을 하여 하지 않도록 한다.


<Location /server-status>

    SetHandler server-status

    Order deny,allow

    Deny from all

    Allow from 192.168.19.128/128

</Location>


mod_status를 이용해 서버 상태의 모니터링이 가능하다.

http://도메인/server-status와 같이 실행한다. 관리자만이 접속할 수 있도록 서버와 같은 로컬 네트워크에서만 접속할 수 있게 설정했다. 

위에서 설정한 ExtendedStatus On 지시자에 의해서 자세한 정보를 제공하고 있다.



<Location /server-info>

    SetHandler server-info

    Order deny,allow

    Deny from all

    Allow from 192.168.19.128/128

</Location>

mod_info 모듈을 사용하여 서버의 설정상태들을 보고 받을 수 있다. 실행방법은 http://도메인/server-info 와 같다. 관리자만이 접속할 수 있도록 서버와 같은 로컬 네트워크에서만 접속할 수 있게 설정했다.   



### Section 3 : Virtual Hosts 


NameVirtualHowt *:80  : 이름 기반 기상호스트를 사용하겠다고 선언하는 부분이다. 대부분의 가상호스트는 하나의 서버주소 IP에 Servername(도메인이름)을 달리하여 여러개의 가상호스트를 운용한다. *:80 은 :80 80번포트로 들어오는 * (모든 IP요청)에 대하여가상호스트를 수행한다는 것이다.

mod_ssl을 이용한 SSL을 사용할 것이라면 포트번호를 :443 과 같이 적용해야 한다.

httpd -S 옵션으로 가상호스트 설정에 대한 점검을 할 수 있다.

 

VirualHost 설정에서 ServerName, ServerAdmin, DocumentRoot 기입은 필수이며 ErrorLog와 CustomLog는 옵션이다.

주석을 해제해준다.


아...옵션 졸라 많네 ㅋㅋㅋ