사실 이 기능을 막기위해 찾게된 건 아니고,

반대로 담당 시스템에서 iframe으로 타서비스를 사용중이였는데 갑자기 아래와 같은 메세지가 떠서..

ㅠㅠ;


"이 콘텐츠를 프레임에 표시할 수 없습니다."

이 웹 사이트에 입력한 정보의 보안을 위해서 이 콘텐츠의

게시자가 프레임 내 표시를 혀용하지 않습니다.


이런걸 ClickJacking이라고 하는 듯. 여튼!


아파치의 확장헤더 X-Frame-Options를 추가하여 우리 서비스를 외부서비스 iframe에서 호출하지 못하도록 막을 수 있다.


예제) Header always append X-Frame-Options SAMEORIGIN


X-Frame-Options 값

 설명

 DENY

 해당 페이지는 frame 내에서 표시 불가

 SAMEORIGIN

 동일 origin에 대해서만 frame 내에서 표시

 ALLOW-FROM uri

 특정 origin에 대해서만 frame 내에서 표시


※ 확장헤더이므로 브라우저마다 지원현황이 다르므로 주의하도록 한다.

- IE8+

- Opera 10.50+

- Safari 4+

- Chrome 4.1.249.1042+ (Allow-From not yet supported)

- Firefox 3.6.9 (or earlier with NoScript)


※ 참고자료

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options

https://blogs.msdn.microsoft.com/ieinternals/2010/03/30/combating-clickjacking-with-x-frame-options/



Posted by SungHoon, Park
,

mod_headers 모듈은 HTTP 요청(응답) 헤더를 수정 및 삭제할 수 있는 모듈이다.

서버 설정 지시자의 거의 모든 부분에서 사용할 수 있으며, <Location>, <Directory>, <IfModule>, <VirtualHost>에서 사용하면 해당 범위에서만 기능을 제한할 수도 있다.


RequestHeader, Header

- 문법 : Header [condition] set|append|add|unset|echo header [value] [replacement] [early|env=[!]variable]

 (요청헤더는 RequestHeader 지시자를 사용)


- HTTP 요청 및 응답 헤더의 정보를 수정 및 삭제한다.

- 첫번째 condition은 onsuccess, always 값이 올 수 있으며 생략도 가능하다.

- 두번째 값은 행위를 지정한다.


 옵션

설명

 set

 헤더정보를 설정한다. 이미 헤더에 같은 이름의 정보가 있다면 덮어쓴다. 

append

 기존 헤더에 값을 추가한다.

add

 헤더에 값을 새롭게 추가한다. 중복 헤더값이 발생할 수도 있으므로 주의한다.

unset

 지정된 이름의 헤더정보를 삭제한다.

echo

 HTTP 요청헤더에 지정된 이름의 헤더정보가 있을 경우, HTTP 응답 헤더에도 추가한다.


- 예제)

IE 브라우저 호환성보기 끄기

BrowserMatch MSIE is-msie

Header set X-UA-Compatible IE=edge env=is-msie


특정페이지 캐시하지 않도록 설정

<Location "/admin">

  Header set Cache-Control "no-cache, no-store"

</Location>


특정 Content-Type 처리 (대문자로 치환)

SetEnvIf Content-Type application/json is_json

Header set ContentType APPLICATION/JSON env=is_json



※ 상세한 헤더정보 디버깅을 위해선 curl -I 옵션을 통해 헤더정보를 확인할 수 있다.

curl -I http://alpha.test.example.com/xxx.do



※ 참고자료

- 리눅스를 활용한 회사 인프라 구축의 모든 것



Posted by SungHoon, Park
,

찾았던 것은 Windows용 2.2.27 버전이였는데 없는 것 같다. ㅠㅠ


Windows용 아파치 다운로드 경로

https://archive.apache.org/dist/httpd/binaries/win32/




Posted by SungHoon, Park
,

mod_rewrite 모듈은 규칙 기반으로 URL을 동적으로 Redirect 및 Rewrite 처리를 해준다.

특정 URL 패턴에 대한 리다이렉트 처리를 할 때 자주 사용하며, RESTful한 웹서비스도 제공할 수 있다.


기본형식


RewriteEngine On

RewriteCond TestString  CondPattern [Flag]

RewriteRule  Pattern     Substitution [Flag]


먼저 RewriteRule의 Pattern을 체크.

Pattern을 통과하면 RewriteRule 상단의 RewriteCond를 체크.

순차적으로 RewriteCond의 TestString의 CondPattern을 체크.

CondPattern을 통과하면 RewriteRule의 Substitution을 최종적으로 처리한다.


[그림1] Ruleset 흐름도


RewriteEngine On|Off

모듈 사용여부를 설정한다.


RewriteLog

mod_rewrite 모듈에서 처리하는 내용에 대해 로그를 남긴다.


(형식)

RewriteLog logs/rewrite.log


RewriteCond

RewriteRule에 대한 조건문

RewriteRule과 달리 단독으로 사용할 수 없으며, 최상단부터 순차적으로 실행된다.


[그림2] RewriteCond 흐름도


(형식)

RewriteCond TestString CondPattern


1) TestString

- 테스트 대상 텍스트

- 웹서버 변수를 사용할 수 있다. %{변수명} 형식이다.


[그림3] 서버변수


2) CondPattern

- TestString과 일치할 패턴을 지정하며, 정규표현식을 사용할 수 있다.

- 정규표현식 사용 가능

- RewriteCond 앞에 RewriteRule에서 사용한 정규표현식에서 그룹으로 지정된 값을 사용할 수 있다. $0~$9 형식.


3) Flag


 플래그

의미

 설명

 NC

 NoCase

 대소문자 무시한다.

 OR

ORNext

 여러개의 RewriteCond를 사용할 경우 OR 조건으로 사용된다.

 (RewriteCond가 연속으로 있을 경우는 AND 조건이다.)


RewriteRule

조건에 따른 rewrite 규칙을 설정하고 해당 규칙에 따른 동작을 지정한다.


(양식)

RewriteRule Pattern Substitution [Flag, Flag...]


1) Pattern

- 일치시킬 패턴을 지정하며, 정규표현식을 사용할 수 있다. 또한 정규표현식에서 그룹으로 지정한 값을 Substitution에서 사용할 수 있다. $0 ~ $9까지 사용 가능함.


2) Substitution

- Pattern이 일치할 경우 Rewrite 처리할 URL을 지정한다.


3) Flag

- 처리할 동작을 지정한다.

전체 플래그명, 축약어 모두 사용가능하다.


플래그

의미

설명

E

Env

 조건이 일치할 경우 특정 환경변수를 설정하거나 해제한다. 

F

Forbidden

 403 Forbidden으로 응답한다.
 Forbidden은 Last의 의미를 포함한다.
 외부에서 접근하면 안되는 리소스를 차단할 경우 유용하다.

G

Gone

 410 Gone으로 응답한다.

L

Last

 더는 RewriteRule 처리를 하지 않는다는 의미다.

 개발언어에서 break문과 비슷하다고 할 수 있다. 

N

Next

 Rewriting 프로세스를 재시작한다.

R

Redirect

 302 Redirect로 응답한다.

 R=301은 HTTP 301 Moved Permanently 응답으로 Redirect 한다.

NC

NoCase

 대소문자를 무시한다.

PT

Passthru

 타겟URL이 http(s)로 시작하지 않아도 URL 처리를 할 수 있도록 한다.

 ※ 기본적으로 타겟URL에 http(s)를 적지 않으면 디렉토리 경로로 인식하게 된다.

 /로 시작한다면 절대경로, /로 시작하지 않으면 상대경로로 처리한다.

 QSA

qsappend

 qsappend (Query String Apped)

 QUERY_STRING 변수값을 타겟URL에 유지시켜준다.



※ 참고자료

- 리눅스를 활용한 회사 인프라 구축의 모든 것

https://httpd.apache.org/docs/2.0/ko/misc/rewriteguide.html

http://soul0.tistory.com/139

http://soul0.tistory.com/270

http://martinmelin.se/rewrite-rule-tester/


'서버 > 아파치' 카테고리의 다른 글

[아파치] mod_headers 모듈  (0) 2016.03.06
[아파치] Windows용 다운로드 경로  (0) 2016.03.06
[아파치] mod_setenvif 모듈  (0) 2016.02.22
[아파치]VirtualHost 설정  (0) 2016.02.21
[아파치]httpd.conf 서버설정  (0) 2016.02.20
Posted by SungHoon, Park
,

mod_setenvif 모듈을 통해 특정 조건에 만족시 환경변수를 설정할 수 있다. 환경변수 설정을 통해 프로그래밍 조건문과 같은 효과를 낼 수 있다.


BrowserMatch

- 문법 : BrowserMatch regex [!]env-variable[=value][[!]env-variable[=value]]

- 클라이언트가 보낸 헤더정보에서 regex 표현식을 비교하여 환경변수를 설정한다.

- !가 붙으면 해당 환경변수를 삭제한다.


- 예제)

 BrowserMatch MSIE 7.0 ie=yes

 BrowserMatch "^(curl|ELink|Wget)" iframe=yes !javascript


BrowserMatchNoCase

- BrowserMatch와 역할은 같으며, 대소문자를 구분하지 않는다.


SetEnvIf

- 문법 : SetEnvIf attribute regex [!]env-variable[=value][[!]env-variable[=value]]

- HTTP 요청 속성에 따라 환경변수를 설정한다.

- 첫번째는 HTTP 요청 속성, 두번째는 정규표현식이다.

- 마지막은 변수 설정/해제 옵션이며, 공백을 기준으로 여러개의 변수를 설정할 수 있다.


- 예제)

1. static 리소스만 로그에서 제외하기

SetEnvIf REQUEST_URI \.(gif|jpg|png|js|css)$ static_request

CustomLog ... combined env=!static_request


SetEnvIfNoCase

- SenEnvIf와 역할은 같으며, 대소문자를 구분하지 않는다.

 


※ 참고자료

- 리눅스를 활용한 회사 인프라 구축의 모든 것



'서버 > 아파치' 카테고리의 다른 글

[아파치] Windows용 다운로드 경로  (0) 2016.03.06
[아파치] mod_rewrite 모듈  (0) 2016.02.23
[아파치]VirtualHost 설정  (0) 2016.02.21
[아파치]httpd.conf 서버설정  (0) 2016.02.20
[아파치] httpd.conf 전역설정  (0) 2016.02.12
Posted by SungHoon, Park
,

가상 호스트(VirtualHost)는 한 장비에서 여러개의 웹서비스를 구동할 수 있도록 해준다.

보통 httpd-vhosts.conf에 가상 호스트를 설정하고, httpd.conf 파일 마지막에 Include conf/extra/httpd-vhosts.conf를 추가한다.


IP 기반 가상 호스트

- 한 장비에 여러개의 IP를 할당받고 IP별로 가상호스트를 사용하는 방법이다.

- IP추가를 위해 네트워크 카드 추가 및 네트워크 설정 등이 필요하다.


Listen 192.168.111.100:80

Listen 192.168.111.200:80


<VirtualHost 192.168.111.100:80>

  DocumentRoot /var/www/site1

  ServerName site1.example.com

</VirtualHost>


<VirtualHost 192.168.111.200:80>

  DocumentRoot /var/www/site2

  ServerName site2.example.com

</VirtualHost>


포트 기반 가상 호스트

- 포트를 기반으로 가상 호스트를 설정한다. Listen 포트에 사용할 포트를 여러개 설정한 후 VirtualHost를 해당 포트로 설정하면 된다.

- 하지만, 포트를 인식하고 사용자들이 웹서비스에 접근하는 것은 불편하므로 일반적인 방법은 아니다.


- 예제)

Listen 80

Listen 90


<VirtualHost 192.168.111.100:80>

  DocumentRoot /var/www/port_80

</VirtualHost>


<VirtualHost 192.168.111.100:90>

  DocumentRoot /var/www/port_90

</VirtualHost>


이름 기반 가상 호스트

- 한 장비에 여러개의 도메인 이름을 부여하고 도메인 이름별로 가상 호스트를 사용하는 방법이다.

- 이름 기반 가상 호스트는 클라이언트 요청시 전송하는 헤더중 Host 헤더정보를 사용하여 가상 호스트 설정에 따라 웹 서비스를 하게 된다.


- 예제)

NameVirtualHost *:80


<VirtualHost *:80>

  ServerName site1.example.com

  ServerAlias site1.co.kr

  ServerAlias site.kr

  DocumentRoot /var/www/site1

</VirtualHost>



<VirtualHost *:80>

  ServerName site2.example.com

  DocumentRoot /var/www/site2

</VirtualHost>


1) NameVirtualHost 설정

 - 80 포트에서 이름 기반 가상 호스트를 사용하겠다는 의미로 반드시 적어줘야 한다.

 - 만약 설정되지 않는 호스트명을 보냈을 경우 기본 처리할 가상호스트로 지정하려면 <VirtualHost _default_:80>으로 지정하도록 한다. 만약 이 설정이 없다면 첫번째 가상 호스트 설정으로 동작하게 된다.

 - 하지만 아파치 웹서버 2.4 이후부터는 이름 기반 가상 호스트가 Default이므로, 2.4 이후 버전에서는 없어졌다.


2) ServerAlias

 - 웹서비스가 여러개의 도메인을 사용할 경우 지정해준다. 여러개 지정해줘도 무방하다.



※ 참고자료

- 리눅스를 활용한 회사 인프라 구축의 모든 것



'서버 > 아파치' 카테고리의 다른 글

[아파치] mod_rewrite 모듈  (0) 2016.02.23
[아파치] mod_setenvif 모듈  (0) 2016.02.22
[아파치]httpd.conf 서버설정  (0) 2016.02.20
[아파치] httpd.conf 전역설정  (0) 2016.02.12
[아파치] mod_mpm 모듈  (0) 2016.01.12
Posted by SungHoon, Park
,

아파치 웹서버 httpds.conf 서버설정에 대해 정리한다.


ServerAdmin

- 관리자 이메일 주소를 설정한다. ServerSignature 값이 Email로 설정되었을 경우, 이메일 주소는 404, 500 에러가 발생했을 경우 에러 화면에 해당 이메일 주소가 표시된다.


DocumentRoot

- 웹 프로젝트가 있는 루트 디렉토리를 지정한다.

- 기본설정은 /var/www/html이다.

- 가상호스트에서도 사용할 수 있으므로 가상 호스트마다 각각 다른 웹 프로젝트 서비스가 가능해진다.


DirectoryIndex

- 웹요청 주소가 디렉토리만 있고 파일명이 없을 때 기본적으로 읽어서 전송할 파일명을 설정한다.

- index.html index.jsp 등


<Directory 디렉토리명></Directory>

- 디렉토리 단위별로 설정하는 지시자다. Location 지시자와 비슷하나 차이점은 Location은 URL을 기반으로 한다는 것이다. Directory 지시자는 로컬 파일의 경로를 대상으로 한다.

- 주로 Options와 접근권한을 설정하는 경우가 많다.


- 예제)

<Directory "/var/www/html">

  Options Indexs FollowSymLinks

  AllowOverride None

  Order allow,deny

  Allow from all

</Directory>


1) Options

- 설정한 디렉토리("/var/www/html") 하위의 모든 디렉토리와 파일에 대한 접근권한을 제어한다.

https://httpd.apache.org/docs/2.2/ko/mod/core.html#directory [Options Directive] 참조


 옵션

설명

 None

 모든 접근을 허용하지 않는다.

 All

 모든 옵션설정을 허용한다. (단, MultiViews는 제외)

 Indexes

 디렉토리 접근시 DirectoryIndex에 설정한 파일이 없을 때 디렉토리내 파일 목록을 보여준다.

 Includes

 Server-side includes provided by mod_include are permitted.

 IncludesNoExec

 Server-side includes are permitted, but the #exec cmd and #exec cgi agr disabled. 

 FollowSymLinks

 심볼릭 링크를 사용할 수 있다. 하지만 보안을 위해 이 옵션은 제거하는 것이 좋다.

 만약 DocumentRoot 하위에 root 권한의 폴더(sbin 등)을 심볼릭 링크로 걸어놨다면 nobody로도 해당 디렉토리에 접근할 수 있게 된다.

 ExecCGI

 CGI 스크립트를 실행할 수 있다.

 MultiViews

 클라이언트가 요청한 media type과 content-encoding을 가지고 적절한 요청을 처리한다.


2) AllowOverride

- 디렉토리에 .htaccess 파일이 있을 경우 기존 설정을 덮어쓸지 여부를 설정한다. 기본설정은 None이다.

※ .htaccess 파일은? 웹서비스 디렉토리별로 설정이 달라져야 할 경우가 있다. 이때 관리자가 모든 설정을 하기는 힘들기 때문에 개별 디렉토리마다 다르게 설정하기 위해 존재하는 파일이다. 예로, 호스팅을 받아 서비스를 할때 .htaccess 파일을 사용한다.


옵션

설명

 None

 디렉토리별 설정을 허가하지 않는다. 즉, htaccess 파일을 Override하지 않는다. 

 All

 .htaccess 파일을 우선 적용하도록 Override를 허용한다.

 Options

 .htaccess에 설정된 Options 지시자(디렉토리 옵션) 사용을 허용한다.

 FileInfo

 .htaccess에 설정된 AddEncoding, AddLanguage, AddType, DefaultType, 

  ErrorDocument, LanguagePriority와 같은 문서유형 지시자 사용을 허용한다.

 AuthConfig

 .htaccess에 설정된 클라이언트 인증 지시자 사용을 허용한다.

 Limit

 .htaccess에 설정된 Order, Allow, Deny와 같은 접근제어 지시자 사용을 허용한다.


3) Order allow, deny

- 순서대로 Allow에 대한 부분을 먼저 확인 후, Deny를 확인한다.


4) Allow

- Allow from all : 모든 클라이언트로부터의 연결을 허용한다.

- Allow from 127.0.0.1 192.168.111.100 : 127.0.0.1과 192.168.111.100 IP 클라이언트만 허용한다.


5) Deny

- Deny from all : 모든 클라인트로부터의 연결을 거부한다.

- 예)

<Location /server-status>

  SetHandler server-status

  Order deny,allow

  Deny from all

  Allow from 127.0.0.1

</Location>


<Files 파일명></Files>

- 파일명에 따라 특별한 처리를 할 때 사용한다.

- 파일명에 포함된 ?는 임의의 한 문자와 일치함을, *는 임의의 한 문자열이 일치함을 나타낸다.

- 파일명 앞에 ~가 붙게 되면 정규표현식을 사용할 수 있다.


- 예제1) 관리페이지는 외부인이 볼 수 없도록 설정

<Files admin.php>

  Order deny,allow

  Deny from all

  Allow From 127.0.0.1

</Files>


- 예제2) htm, html, css, js, php 파일 인코딩 설정

<Files ~ "\.(htm|html|css|js|php)$">

  AddDefaultCharset UTF-8

  DefaultLanguage ko_KR

</Files>


<FilesMatch 정규표현식></FilesMatch>

- <Files>의 정규표현식 사용가 동일하다. 대신 <FilesMatch>는 ~를 붙히지 않아도 정규표현식이 적용된다.


- 예제1) htm, html, css, js, php 파일 인코딩 설정

<FilesMatch "\.(htm|html|css|js|php)$">

  AddDefaultCharset UTF-8

  DefaultLanguage ko_KR

</FilesMatch>


Redirect

- Redirect [HTTP 상태코드] [요청URL] [리다이렉트 URL]

- HTTP 상태코드는 리다이렉트가 되면서 바뀔 상태코드를 지정한다. 기본값은 302.


- 예제1)

Redirect 301 /hello http://www.naver.com

Redirect /world http://www.naver.com


RedirectMatch

- Redirect 지시자와 비슷하며 정규표현식으로 리다이렉트를 처리할 수 있다.


- 예제1) 톰캣의 WEB-INF와 META-INF 폴더를 접근 못하게 설정

RedirectMatch 404 /(?i)(WEB-INF|META-INF)(/|$)


DefaultType

- 모르는 타입이 들어왔을 경우 설정할 기본 MIME 타입을 설정한다.


LogFormat

- 서버의 로그파일 형식을 설정한다. common은 기본설정, combined는 Referer와 User-Agent가 추가되었다.


LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

LogFormat "%h %l %u %t \"%r\" %>s %b" common



옵션

설명

예제

 %h

 요청한 원격 호스트

 192.168.111.100

 %l

 원격 로그인명

 - 

 %u

 원격 사용자명

 - 

 %t

 요청날짜 및 시간 

 [21/Feb/2016:15:28:28 +0900]

 %r

 요청의 첫번째 라인

 GET/HTTP/1.1 

 %s

 HTTP 응답코드

 200

 %b 

 HTTP 헤더를 제외한 응답의 Byte 길이 

 66 

 %{헤더명}i

 HTTP 헤더에서 작성한 헤더명에 대한 값을 출력

 %{Referer}i 

 %{User-Agent}i


ErrorLog

- 에러로그 파일을 설정한다.


- 예제)

ErrorLog "| /usr/local/apache/bin/rotatelogs -l /usr/local/apache/logs/error.log.%Y%m%d 86400" combined


CustomLog

- 클라이언트의 요청이력을 남길 로그파일을 설정한다.


- 예제)

CustomLog "| /usr/local/apache/bin/rotatelogs -l /usr/local/apache/logs/access.log.%Y%m%d 86400" combind


Alias

- 요청 URL을 특정 파일 시스템에 연결시킨다.


- 예제)

Alias /helpFiles /nas/2016/helpFiles


AddDefaultCharset

- 컨텐츠 형식이 text/plain이나 text/html일 경우 HTTP 응답 헤더에 설정된 charset 헤더를 추가한다.

- 가상 호스트마다 다르게 설정할 수 있다.

- HTTP 응답 헤더에 charset이 지정되었을 경우는 HTML <meta>태그로 charset을 지정해도 헤더에 있는 charset이 적용된다. DefaultCharset과 다른 HTML이 있다면 파일의 인코딩을 변경하거나 <meta>태그로 charset을 명시적으로 지정하고 해당 지시자를 Off하여야 한다.


- 예제)

AddDefaultCharset UTF-8


결과 : Content-Type : text/html; charset=UTF-8



※ 참고자료

- 리눅스를 활용한 회사 인프라 구축의 모든 것

http://mcpaint.tistory.com/133

http://toy0box.tistory.com/entry/Apache-httpdconf-주소창-디렉토리-직접-접근-설정



'서버 > 아파치' 카테고리의 다른 글

[아파치] mod_rewrite 모듈  (0) 2016.02.23
[아파치] mod_setenvif 모듈  (0) 2016.02.22
[아파치]VirtualHost 설정  (0) 2016.02.21
[아파치] httpd.conf 전역설정  (0) 2016.02.12
[아파치] mod_mpm 모듈  (0) 2016.01.12
Posted by SungHoon, Park
,

아파치 웹서버 httpd.conf 전역설정에 대해 정리한다.


ServerRoot "etc/httpd"

- 아파치 웹서버가 설치되어 있는 곳의 최상위 디렉토리.

- 기본설정은 "/etc/httpd"


ServerTokens Prod

- 웹서버 오류가 발생하였을 경우, 에러페이지와 Http Response 헤더에 보여지는 웹서버 정보의 노출 수준을 설정한다.

- 옵션 종류 : Full | OS | Minor | Minimal | Major | Prod

- 너무 많은 정보가 출력되는 것은 문제가 있으므로, 보통 Prod(Production)으로 설정하는 것이 좋다.


1) 에러페이지

- ServerSignature가 Off이면 웹서버 정보가 노출되지 않는다.


옵션

내용

Full 

 Apache/2.2.31 (Unix) mod_ssl/2.2.31 OpenSSL/1.0.1e-fips DAV/2 mod_jk/1.2.41 Server at 10.113.232.101 Port 80

OS

 Apache/2.2.31 (Unix) Server at 10.113.232.101 Port 80

Minor

 Apache/2.2 Server at 10.113.232.101 Port 80

Minimal

 Apache/2.2.31 Server at 10.113.232.101 Port 80

Major

 Apache/2 Server at 10.113.232.101 Port 80

Prod

 Apache Server at 10.113.232.101 Port 80


2) Http Response 헤더


옵션

내용

Full 

 Apache/2.2.31 (Unix) mod_ssl/2.2.31 OpenSSL/1.0.1e-fips DAV/2 mod_jk/1.2.41

OS

 Apache/2.2.31 (Unix)

Minor

 Apache/2.2

Minimal

 Apache/2.2.31

Major

 Apache/2

Prod

 Apache


KeepAlive Off

- KeepAlive는 한 프로세스가 특정 사용자의 요청을 지속적으로 허용하며 처리할지 여부를 설정한다.

- 기본설정은 Off이다. On으로 설정할 경우, 메모리 사용의 부담이 많아지게 되지만 성능은 좋아진다. 단발성 요청이 많은 대민 서비스의 경우 Off가 적절하다. (물론, 상황에 따라 다르다)


KeepAliveTimeout 15

- KeepAlive가 On일 경우에 유효한 값으로, 같은 클라이언트에서 처리할 시간을 지정한다.

- 기본설정은 15초


MaxKeepAliveRequests 100

- KeepAlive가 On일 경우에 유효한 값으로, 한 프로세스에서 특정 사용자의 요청을 설정에 지정된 횟수만큼 처리한다.  횟수를 넘어가게 되면 프로세스는 죽고, 다른 프로세스가 요청을 처리하게 된다.

- 기본설정은 100


Listen 80

- 해당 포트를 리스닝 하도록 설정한다. 여러개의 포트를 사용하려면 Listen 구문을 여러번 사용하면 된다.

- 기본값은 80


LoadModule

- 오브젝트 파일이나 라이브러리를 읽어온 후에 사용가능한 모듈 목록에 추가하는 지시자다.

- DSO(Dynamic Shared Object) 형태의 모듈에 사용한다.


User nobody

Group nobody

- 유닉스 계열 운영체제에서 1024 이하의 포트는 root 사용자만 사용할 수 있다. 하지만 root 권한으로 웹서버가 운영될 경우, 취약점을 이용해 공격자에게 root 권한을 유출할 수 있는 위험이 존재하게 된다. 따라서, 최초 구동은 root로 하고 자식 프로세스는 setuid, setgid 함수로 User, Group 지시자에 설정된 사용자 및 그룹으로 권한이 전환된다.

- ps -ef | grep httpd를 실행해보면 부모 프로세스만 root이고, 나머지는 apache(또는 nobody)로 떠있는 것을 확인할 수 있다.


Include

- 다른 설정파일을 포함시키는 지시자다.

- 하나의 파일에 모든 설정을 담고 있으면 관리 및 수정이 어렵기 때문에, 용도별로 설정파일을 나누고 Include 지시자로 포함을 하는것이 좋다.

- 예로 SSL 설정은 Include conf/extra/httpd-ssl.conf로 설정파일이 나뉘어 있다.


※ 참고자료

- 리눅스를 활용한 회사 인프라 구축의 모든 것

'서버 > 아파치' 카테고리의 다른 글

[아파치] mod_rewrite 모듈  (0) 2016.02.23
[아파치] mod_setenvif 모듈  (0) 2016.02.22
[아파치]VirtualHost 설정  (0) 2016.02.21
[아파치]httpd.conf 서버설정  (0) 2016.02.20
[아파치] mod_mpm 모듈  (0) 2016.01.12
Posted by SungHoon, Park
,

MPM(Multi Processing Module)은 아파치에 들어오는 요청을 프로세스/쓰레드 기반 방식으로 처리하며,

다음과 같이 Prefork, Worker 2가지 방식을 선택할 수 있다.


Prefork 방식


1. 기본 설정이며, 1개의 프로세스에 1개의 쓰레드가 요청을 처리한다. (프로세스:쓰레드=1:1)


2. 요청별로 프로세스가 생성되기 때문에 메모리 정보를 공유하지 않으므로 안정적인 장점이 있다.


3. 각 요청마다 하나의 프로세스가 소비되기 때문에, 메모리의 사용량이 높다.


4. 설정정보


<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers       10
    MaxClients            2048
    MaxRequestsPerChild   0
</IfModule> 


1) StartServers

- 웹서버 시작시 띄우게 되는 자식 프로세스 수. 디폴트값 3.

- 운영시 MinSpareServers, MaxSpareServers에 의해 프로세스가 변동되므로 설정시 큰 의미는 없다.


2) MinSpareServers

- 클라이언트 요청이 적을 경우 아파치는 이 값만큼 자식 프로세스를 유지하려 시도한다.

- 즉, 절대적인 값이 아니다.


3) MaxSpareServers

- 클라이언트 요청이 많을 경우 아파치는 이 값만큼 자식 프로세스를 줄이려고 시도한다.

- 역시 절대적인 값이 아니다.


4) MaxClients

- 클라이언트 요청을 동시에 처리될 수 있는 최대값. 이 값을 초과하면 ListenBackLog에 설정된 값만큼 큐잉 된다.

- 동시접속이 많을 경우 이 값을 증가시켜 준다.

- 이 값은 아파치+톰캣 연동시 톰캣의 maxThreads값과 맞춰주는 것이 좋다.


5) MaxRequestsPerChild

- 자식 프로세스에서 처리할 수 있는 요청갯수를 제한한다.

- 0으로 설정하면 무한대.

- 500이라는 값으로 설정을 하게 되면 자식 프로세스는 500번의 요청을 처리하고 프로세스는 다시 fork되어야 한다.



Worker 방식


1. 1개의 프로세스에서 여러개의 쓰레드가 요청을 처리한다. (프로세스:쓰레드=1:N)


2. Prefork보다 메모리를 적게 사용하는 장점이 있으나, 프로세스내 메모리 정보는 쓰레드간 공유된다.


3. 동시접속이 많을 경우, Prefork방식보다 유리하게 처리할 수 있다.


4. Worker방식을 사용하기 위해서는 컴파일시 --with-mpm=worker 옵션을 주어야 한다. 현재 아파치의 MPM방식을 확인하기 위해서는 httpd -V 또는 http -l 명령을 실행하면 된다.


5. 설정정보


<IfModule mpm_worker_module>
    StartServers          2
    MaxClients          150
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadsPerChild      25
    MaxRequestsPerChild   0
</IfModule>


1) StartServers

- Prefork방식과 동일


2) MaxClients

- 클라이언트 요청을 동시에 처리할 수 있는 최대값(프로세스 X 쓰레드)


3) MinSpareThreads

- 최소로 유지하려 하는 쓰레드 값


4) MaxSpareThreads

- 최대로 유지하려 하는 쓰레드 값


5) ThreadsPerChild

- 자식 프로세스가 가질 수 있는 쓰레드 최대값


6) MaxRequestsPerChild

Prefork방식과 동일



※ 참고자료

http://www.koreaidc.com/bbs/set_view.php?b_name=idcpds&w_no=153

http://mcpaint.tistory.com/151

http://www.isfull.com/bbs/board.php?bo_table=tb_xnux&wr_id=286

http://itnp.kr/roller/home/entry/아파치_동시_접속자_수_늘리기

http://jjosh.tistory.com/entry/최대-성능을-위한-아파치-환경설정


'서버 > 아파치' 카테고리의 다른 글

[아파치] mod_rewrite 모듈  (0) 2016.02.23
[아파치] mod_setenvif 모듈  (0) 2016.02.22
[아파치]VirtualHost 설정  (0) 2016.02.21
[아파치]httpd.conf 서버설정  (0) 2016.02.20
[아파치] httpd.conf 전역설정  (0) 2016.02.12
Posted by SungHoon, Park
,