'Technical Note'에 해당되는 글 134건

Technical Note/apache & tomcat

VirtualHost 설정은 순서가 민감하다. 먼저 선언된 것일수록 우선순위가 높다.

아래와 같이 www1.google.com과 www2.google.com이 있다고 가정한다.

<VirtualHost *>

ServerName www1.google.com

DocumentRoot /home/www/deploy/google-www1

</VirtualHost>

<VirtualHost *>

ServerName www2.google.com

DocumentRoot /home/www/deploy/google-www2

</VirtualHost>

웹브라우저에서 www1.google.com 요청이 들어오면, 첫번째 VirtualHost에서 처리하게 된다.

www2.google.com 요청이 들어면, 두번째 VirtualHost에서 처리하게 된다.

www3.google.com 을 요청하면, 어떤 ServerName 지시자에도 해당되지 않은 요청이기 때문에 첫번째 VirtualHost에서 처리하게 되어 www1.google.com에서 처리가 된다.

 

특이하게 쓰는 경우에는 어떻게 될까?

아래 예제와 같이 첫번째 VirtualHost와  두번째 VirtualHost의 ServerName으로 선언된 www2.google.com을 ServerAlias로 지정한다.

<VirtualHost *>

ServerName www1.google.com

ServerAlias www2.google.com

DocumentRoot /home/www/deploy/google-www1

</VirtualHost>

<VirtualHost *>

ServerName www2.google.com

DocumentRoot /home/www/deploy/google-www2

</VirtualHost>

www2.google.com을 요청하면, 우선순위가 높은 첫번째 VirtualHost에서 처리하게 되어 www1.google.com에서 처리가 된다

Technical Note/apache & tomcat

ListenBackLog 지시자는 성능을 조금 더 높이기 위한 설정으로서, Http 서버가 요청을 받기 위한 Listen 의 큐의 길이를 길게 해준다. 511이 디폴트로 되어 있는데, 웹 서비스의 성격에 따라서 효과를 발휘할 수도 있고, 없을 수도 있다. 또한 TCP Syn Flooding 공격에 유리하다고 알려져 있다.

기본적인 파일을 전달하는 Http 서버를 테스트해본 결과 8192 의 값이 좋게 나왔다. (항상 좋은 결과치를 나오지 않으니 성능 테스트를 통해서 결과치를 확인해야 한다.)

ListenBackLog 8192

이 값과 함께 수정해야 하는 값은 리눅스 커널 파라미터이다.

먼저 다음의 명령어를 사용하여 먼저 파라미터를 수정한다.

#] echo 8192 > /proc/sys/net/core/somaxconn

그리고, 영구적으로 사용하기 위해서 /etc/sysctl.conf 파일을 열어, 아래 필드를 추가 또는 수정한다.

net.core.somaxconn = 8192

다음의 명령어를 실행하여 리눅스 OS에 반영한다.

#] sysctl –p


Technical Note/apache & tomcat

리눅스에 아파치 웹서버를 설치하면 자주 등장하는 것이 403 Forbidden 에러다. (Apache 403 Forbidden error)  403 Forbidden 에러는 해당 파일이나 디렉터리에 접근 권한이 없는 경우 것으로 보안과 관련된 오류다. 디렉터리나 파일 권한, 그리고, 웹서버의 설정을 봐도 왜 403 에러가 나는 지 쉽게 알 수 없는 경우가 있다.


03 Forbidden error는 원인이 여러가지이고 찾기가 쉽지 않아 매번 한참 해메다가 겨우 해결하곤 한다. 그 해결 방법을 정리해 본다.

1. httpd.conf 의 권한 설정

실수인지 어쩐지는 모르지만 아래와 같이 <Directory> 설정 지시 부분에 "Deny from all"이란 내용이 있는 경우가 있다. 당연히 모든 접근을 제한한다는 것이니 403 Forbidden 이 발생하겠지.

<Directory /home/...>
     .
     .
     .
    Order deny, allow
    Deny from all
</Directory>


아래와 같이 "Allow from all"로 표시하면 모든 접근이 정상적으로 이뤄질 것이며,

<Directory /home/...>
     .
     .
     .
    Order allow, deny
    Allow from all
</Directory>


특정한 IP 만 접근을 제한한다면 아래와 같이 특정한 IP를 deny 시키면 된다.

<Directory /home/...>
     .
     .
     .
    Order deny,allow
    deny from 125.165.169.111 114.124.12.
    allow from all
</Directory>


2. 디렉터리 퍼미션(Directory Permission)

httpd.conf 의 설정에 문제가 없다면, 디렉터리 퍼미션을 확인해 보자. 웹브라우저로 홈페이지를 본다는 것은 웹서버가 실행되는 계정(nobody 또는 apache 등)으로 해당 디렉터리를 읽는 것이다.즉, 웹서버가 실행되는 계정으로 해당 디렉터리에 접근이 되지 않으면 당연히 403 Forbidden 이 발생하겠지.

# chmod o+x /home/...
or
# chmod 711 /home/...
# ls -al /home/...
drwx--x--x 21 abcd     abcd     4096 Mar 24 10:44 /home/...

디렉터리를 위와 같이 했는데도 같은 문제가 있다면 하위 디렉터리 및 파일들을 살펴보자. 웹루트 디렉터리를 위와 같이 설정하듯이 하위 디렉터리나 파일도 웹서버가 실행되는 계정으로 읽을 수 있어야 문제가 발생하지 않는다.

참고로 특정디렉터리의 하위 모든 파일 및 디렉터리의 권한을 변경하는 방법은...

* 모든 디렉터리의 권한을 711로 변경
# find /home/... -type d -exec chmod 711 {} \;

* 모든 파일의 권한을 644로 변경
# find /home/... -type f -exec chmod 644 {} \;

이것은 간편하긴 하나, 검색할 디렉터리(/home/...)를 잘못 지정하면 낭패를 볼 수 있으므로 주의해야 한다. "/" 에서 실행했다가는... ^^;;


3. SELinux와 아파치 HTTP의 디렉토리 접근 설정

SELinux는 리눅스의 보안을 담당하는 프로그램이다. 최근에 나온 리눅스에는 대부분 SELinux가 구동되고 있다고 생각해도 된다. 이전에는 단순히 chmod를 통한 owner+group+others의 권한 만 제한하면 되었지만 SELinux는 그 이상의 접근 제어를 하게 되므로 잘 모르면 당황하게 된다. 
잘 모르면 SELinux 설정에서 SELINUX=disabled 하여 구동을 중지할 수 있지만 그만큼 보안에 취약해지므로 권장하지는 않는다.

SELinux 설정 파일 : /etc/selinux/config


Shell에서 'ls -Z'를 해 보면 아래와 같이 파일이나 디렉터리의 보안 환경을 볼 수 있다.

# ls -Z /home/... 
drwx--x--x  abcd   abcd   user_u:object_r:user_home_dir_t  abcd
drwx--x--x  efgh    efgh    user_u:object_r:httpd_sys_content_t efgh

보안 환경에서 세번째 요소가 중요한 부분이다. HTTP 웹서버는 httpd_sys_content_t 타입 만 파일과 디렉토리 읽는 것을 허용한다. 위에서 보면 'abcd'는 user_home_dir_t로 되어 있기 때문에 웹서버에서 접근을 하면 403 Forbidden을 표시하고, 'efgh'는 httpd_sys_content_t로 되어 있기 때문에 접근이 가능하다.


이를 변경하는 방법은...

* 하나의 파일이나 디렉터리를 변경할 경우
# chcon -t httpd_sys_content_t /home/...

* chmod와 같이 하위 파일이나 디렉터리를 모두 변경할 경우
# chcon -R -h -t httpd_sys_content_t /home/...
-R : 하위 모든 파일과 디렉터리의 보안사항을 변경한다.
-h : 심볼릭링크를 따르지 않도록 한다.



위와 같이 했는데도 문제가 지속되면 쪼금 어렵다는 것~^ 


Technical Note/apache & tomcat

<timeout 설정>

하나의 tomcat worker에 전달되어 서비스가 되도록 한다.

 

worker.list=tomcat

worker.tomcat.type=ajp13

worker.tomcat.port={portnumber}

#worker.tomcat.connect_timeout=1000

#worker.tomcat.prepost _timeout=1000

#worker.tomcat.socket_timeout=3

#worker.tomcat.reply_timeout=1000

 

Tomcat Instance의 GC time, 통신 속도, 트래픽을 고려해서 개발자가 mod_jk의 timeout설정을 해야 한다.

아래 Timeout 설정에 하나라도 만족이 되면, mod_jk는 해당 Tomcat Instance에 대해서 에러로 처리되고, 특정기간(recover_time : 60초)동안 소켓을 전달하지 않는다.

실제 정확한 Timeout은 연속 시도 값(reties 속성값) 과 연속 시도 대기 값(retry_interval 속성값)에 따라서 영향을 받는다.

현재 reties default 값은 2, retry_interval 값은 100ms이므로, 실제 Timeout 값은 아래와 같다.

실제 Timeout은 (2 * xxx_timeout ) + 100ms이다.

위 설정의 의미를 설명한다.

* worker.list=tomcat : worker는 tomcat worker 하나만 지정한다.

* worker.tomcat.type=ajp13 : 로 Apache Http 서버와 Tomcat 서버가 통신하는 protocol은 ajp 13이다.

* worker.tomcat.connect_timeout=1000 : jk와 Tomcat Instance 간 연결이 완료된 후, arj13 protocol에서의 cping request에 대한 cpong respone timeout 을 1000ms로 지정한다.

* worker.tomcat.prepost _timeout=1000 : jk와 Tomcat Instance 간의 요청이 전달이 되기전 arj13 protocol에서의 cping request에 대한 cpong respone timeout 을 1000ms로 지정한다.

* worker.tomcat.socket_timeout=3 : jk와 Tomcat Instance간의 응답 대기 시간이 3초 되면, timeout이 된다. 이 응답대기 시간은 TCP socket 내부적인 상태에 대한 timeout을 의미한다.

* worker.tomcat.reply_timeout= 1000 : jk와 Tomcat Instance 간의 의미있는 요청과 응답간의 시간에 대해서 1000ms timeout으로 지정된다.

내부 IDC에서는 방화벽을 쓰지 않기 때문에, socket_keepalive(디폴트 false)설정은 따로 지정하지 않는다.

connection_pool_timeout을 지정할 경우, Tomcat Instance에서의 connectionTimeout 설정과 같이 설정해야 한다.

 

<status 보기>

Apache Http 서버에서 status 정보를 볼 수 있듯이, mod_jk에서도 status 정보를 보여줄 수 있다. 이 설정은 서비스에는 영향을 주지 않는다.

workers.properties 파일 안에 Status worker를 추가한다.

worker.list=jkstatus

worker.jkstatus.type=status

conf 설정 파일에 jk mount 디렉토리를 지정하고, 외부로 노출되지 않도록 IP관리가 되어야 한다.

JkMount /jkmanager/* jkstatus

<Location /jkmanager/>

JkMount jkstatus

Order deny,allow

Deny from all

Allow from 127.0.0.1

Allow from <내부 IP>

</Location>

http://127.0.0.1/jkmanager/ 로 접속하면 관련정보를 확인할 수 있다.

 

<fail on status>

 

worker.{application1}.fail_on_status=400

Tomcat Instance에서 보낸 Http response status code에 대해서 fail로 간주할 수 있도록 한다. Tomcat Instance에서 400 error발생시 fail이 동작될 수 있다.

 

<redirect>

 

worker.{application1}.redirect ={component6}

worker.{application6}.port=8050

worker.{application6}.host=2.2.2.2

worker.{application6}.type=ajp13

worker.{application6}.activation=disable

특정 상황에서 application1 worker가 application6 worker로 redirect가 가능하다. 
activation 설정은 1.2.19부터 가능하다.

worker.properties 파일에 connection_pool_timeout 설정을 추가하여, fail 이후의 상황에 대해서 필요 없는 connection을 오랫동안 쓰지 않도록 할 수 있다. Apache Tomcat 서버의 server.xml의 connectionTimeout값과 동일하게 잡아야 한다.

worker.tomcat1.port=8050

worker.tomcat1.connection_pool_timeout=5


Technical Note/apache & tomcat

Access 로그의 LogFormat Rule CustomLog Rule

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

 

SetEnvIfNoCase Request_URI "\.(ico|gif|jpg|swf|png|css|js)$" nolog-request

CustomLog "| $APACHE_HTTP_HOME/bin/rotatelogs -l $APACHE_HTTP_HOME/logs/accesslog.%Y%m%d 86400" combined env=!nolog-request

 

LogFormat 설명

      %h : 원격 호스트

      %u : 인증 모듈 사용시 로그인한 ID

      %t : common log format 시간 형식(표준 영어 형식)의 시간

      %r : 요청의 첫번째 줄

      %>s : 상태(status)

      %b : HTTP 헤더를 제외한 전송 바이트수. CLF 형식과 같이 전송한 내용이 없는 경우 0 대신 '-'가 출력됨

      %{Referer} : Referer

      %{User-Agent} : User agent

      %D : 처리 시간 : micro-second (us)

 

CustomLog를 사용할 때는 파이프문자 "|"뒤에 로그 정보를 표준입력으로 받을 프로그램 경로를 적는다.  CustomLog설명은 다음과 같다.

      $APACHE_HTTP_HOME/bin/rotatelogs : Apache Http 서버의 rotatelogs를 실행한다.
-l 
옵션은 GMT 대신 locale 시간을 순환주기로 사용한다는 의미이다.

      access.log.%Y%m%d : 연도,,일과 같은 시간정보를 의미한다. %H를 붙이면, 24시간을 기준으로 하는 시간정보가 출력된다.

      86400 : 로그 파일의 생성 주기를 24시간으로 정했고시간정보를 초로 산출한 시간이다. (24h * 60m * 60s)

      Combined : combined LogFormat을 적용한다는 의미이다.

      env=!nolog-request : 환경변수env가 적용이 된 것으로 nolog-request가 정의된 내용은 로그에 적지 않겠다라는 의미이다. !는 여기서는 ‘not equal’을 의미한다여기에서는 nolog-request에 정의된 요청 ico,gif,jpg,swf,png,css,js 파일들에 대해서는 로그로 남기지 않겠다라는 의미이다.

 

 

로그파일이 커지는 경우에 대해서는 시간대별로 로그 파일을 생성.

한시간별

CustomLog "| $APACHE_HTTP_HOME/bin/rotatelogs –l $APACHE_HTTP_HOME /logs/access.log.%Y%m%d%H 1200" combined env=!dontlog

 

1 ··· 16 17 18 19 20 21 22 ··· 27
블로그 이미지

zzikjh