'2016/05/02'에 해당되는 글 2건

  1. 2016.05.02 [nginx] L7 health check 연동
  2. 2016.05.02 센트OS 7 다운로드 URL 설명


nginx에서 파일을 이용하여 L7 health check (10초 동안 x번 200 리턴 값이 아닌 값이 나오면 l7 binding이 빠지게 하는 방법)하는 방법을 소개한다. 



1. -f을 이용하여 파일을 체크하는 방식이 있다. 

(사실 if가 evil이긴 하지만, 이 방법만큼 심플한 방법이 없었다..)


location = /l7.html {

  if (!-f /usr/local/nginx/off_health_check) {

    return 404; 

  }

  access_log  off;

  allow       all;


  proxy_pass http://service

}



/usr/local/nginx/off_health_check이 파일이 존재하지 않으면, 404을 리턴하여 l7 health check에 실패로 인식하게 한다.

만약 해당 파일이 존재하지 않으면 service 포트로 전달하도록 proxy_pass를 이용한다.


elasticsearch 라면, proxy_pass http://es/_cluster/health; 를 추가하여 elasticsearch의 클러스터 헬쓰 체크를 할 수 있도록 변경할 수 있다. 



참고 #1


nginx 공식 문서에, if (-f 파일명)에 대해서 좋지 않는 것 같다. 대신 try-files를 쓰라고 권고하고 있다.

https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#check-if-file-exists



Check (If) File Exists


Using if to ensure a file exists is horrible. It’s mean. If you have any recent version of NGINX you should look at try_files which just made life much easier.


BAD:


server {

    root /var/www/example.com;

    location / {

        if (!-f $request_filename) {

            break;

        }

    }

    

    






2. 설정 파일에서 읽어 l7 health check를 제어하는 방법이다.

if is evil!(https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/)이 찜찜하지만, 너무 좋은 기능이라 쓸 수 밖에 없다. 



설정 


<conf/l7.conf>

$ cat /usr/local/nginx/conf/l7.conf

set $l7 down;



<conf/vhost.conf 파일>


location /health_check.html {

include l7.conf;

if ($l7 = "down") {

return 404;

}


access_log  off;

        allow       all;


        default_type text/html;

        return 200 "OK";

        }





스크립트를 다음처럼 사용할 수 있다.


$ cat > l7.sh

#!/bin/sh


COMMAND=$1


if [ -z "${COMMAND}" ]; then

  echo 1>&2 "$0: no given command."

  exit 2

fi


echo "set \$l7 ${COMMAND};" > /usr/local/nginx/conf/l7.conf && sudo ./sbin/nginx -s reload && echo "${COMMAND}"




다음처럼 스크립트를 실행하면 l7 health check를 제어할 수 있다.


$ l7.sh up 

up

$ curl -v -XGET http://localhost/health_check.html

..HTTP/1.1 200 OK


$l7.sh down

down

.. HTTP/1.1 404 Not Found

    





* 노트 1

keepalive 모드를 사용하면서, l7.conf를 사용하여 변수 값을 이용하여 l7 health check하는 방법을 사용할 때, 이슈가 발생할 수 있다. nginx -s reload는 graceful하게 할 수 있다고 알려져 있지만, keepalive 모드에서는 tcp 데이터가 전달되면서 동시에 잠깐의 재시작이 일어나면서 패킷 드롭 현상이 발생될 수 있다.

no host exception과 같은 에러를 발견할 수 있다. 


이 문제를 해결하려면, keepalive를 쓰지 않거나, -f을 이용한 파일 체크를 사용하는 방법이 나을 것 같다. 





* 노트 2


keepalive 상태에서 파일을 이용한 l7 health check 방법은 약간의 한계가 있다. 

keepalive이기 때문에 대용량 서비스일 때, tcp 패킷이 계속 들어올 수 있기 때문에 l7 health check에서 200이 아닌 값, 즉 400 에러를 내보내도 계속 tcp 패킷이 들어와서 l7 스위치 바인딩에서 빠지지 않게 된다.


요청량이 아주 많지 않으면 keepalive를 쓰지 않는다. 그러면 파일을 이용한 l7 health check가 아주 유용할 것이다.

keepalive를 사용중이라면, client 쪽에서 여러 번 retry 구조로 변경해야 한다. 



* 노트 3

if (!-f 파일명) 


-f는 파일이 존재하면,

!-f는 파일이 존재하지 않으면 이라는 의미를 가진다.


!-f를 주로 사용하는 것이 추천하고 싶은 이유는 좀 더 유연하게 대처할 수 있을 것 같다. 

nginx를 재시작하기 전에 파일이 없으면 404라는 의미를 주는 것이 더 명쾌하는 것 같다. 



Posted by '김용환'
,


센트OS 를 버전별로 다운받을 수 있는 사이트이다.

http://centos.mirror.cdnetworks.com/



2016년 5월 현재, 다음과 같은 센트OS 7를 다운받을 수 있다. 





7.x.yyyy 형태를 가지고 있는데, 7.x는 버전을 의미하고, yyyy는 연과 월단위로 표현한다.

7.2.1511은 센트OS 7.2이고, 15년 11월에 출시도었음을 의미한다.



센트OS는 x86의 64비트만 지원하기 때문에 x86_64 버전만 다운받을 수 있다 .


http://centos.mirror.cdnetworks.com/7.2.1511/ 를 보면, cloud,iso등과 같은 형태로 배포된다.



작은 규모의(minimal) iso를 다운받으려면, 브라우져에 다음 url을 접속하고, 

http://centos.mirror.cdnetworks.com/7.2.1511/isos/x86_64/


아래 링크를 클릭해서 다운받는다.


정상적인 파일인지 확인하기 위해서 md5로 체크섬을 확인한다.



$ md5 CentOS-7-x86_64-Minimal-1511.iso

MD5 (CentOS-7-x86_64-Minimal-1511.iso) = 88c0437f0a14c6e2c94426df9d43cd67



$ cat md5sum.txt

c875b0f1dabda14f00a3e261d241f63e  CentOS-7-x86_64-DVD-1511.iso

dba29c59117400b111633be2bf2aaf0e  CentOS-7-x86_64-Everything-1511.iso

7e46208ba6c5fe817a3ce981aa122f54  CentOS-7-x86_64-LiveGNOME-1511.iso

d9f8e2ae2148d0abdf55a2a9eef42f00  CentOS-7-x86_64-LiveKDE-1511.iso

88c0437f0a14c6e2c94426df9d43cd67  CentOS-7-x86_64-Minimal-1511.iso

99d305fa40ec9e28ef8450c3bcc45f85  CentOS-7-x86_64-NetInstall-1511.iso




md5sum.txt의 값과 md5의 값이 같으면 문제없다는 뜻이다.


Posted by '김용환'
,