openresty에서 lua를 이용한 health check url을 만들었다.
nginx는 파일 기반으로 되어 있고 문법이 그다지 친절하지 않아서, openresty의 lua를 이용하면 좀 shared memory를 공유하는 기법이 있다. 전역 변수를 lua_shared_dict을 사용하면 모든 worker에서 서로 공유할 수 있어 편리한다.
공유 dict에 값이 없으면 200으로 처리해 서비스되도록 한다. 그리고 공유 메모리(lua_shared_dict)의 크기는 작게 한다.
http {
lua_shared_dict dicts 16k;
....
server {
server_name _;
listen 80;
root /...
location / {
return 404;
}
location ~* \.(?:ico|css|js|gif|jpe?g|png|gif|eot|ttf|ott|woff2?|swf|svg|zip)$ {
expires 1y;
}
location /health_off {
default_type text/html;
content_by_lua_block {
local d = ngx.shared.dicts
d:set("health", 400)
ngx.say("health-off")
}
allow 192.168.0.0/16;
allow 172.16.0.0/12;
allow 127.0.0.1;
deny all;
}
location /health_on {
default_type text/html;
content_by_lua_block {
local d = ngx.shared.dicts
d:set("health", 200)
ngx.say("health-on")
}
allow 192.168.0.0/16;
allow 172.16.0.0/12;
allow 127.0.0.1;
deny all;
}
location /health_check.html {
access_log off;
allow all;
default_type text/html;
access_by_lua_block {
local dogs = ngx.shared.dicts
local status = tonumber(dogs:get("health")) or 200
if status == 400 then
return ngx.exit(400)
end
return ngx.exit(200)
}
}
...
}
결과는 다음과 같다.
$ curl -i http://localhost/health_check.html
200
$ curl -i http://localhost/health_off
$ curl -i http://localhost/health_check.html
400
$ curl -i http://localhost/health_on
$ curl -i http://localhost/health_check.html
200
**************
진짜 주의할 점은 ngx.exit 사용시 ngx.say를 함께 사용해서는 안된다. ngx.exit 앞에 ngx.say를 사용하면 exit 값이 나타나지 않고 200으로만 리턴한다. ngx.exit를 사용할 때는 ngx.say를 사용하지 않는다.
'nginx' 카테고리의 다른 글
HTTP 1.1 스펙에 따르면 반드시 Host 헤더를 추가해야 한다. (0) | 2017.02.01 |
---|---|
[nginx] no resolver defined to resolve (0) | 2017.02.01 |
[openresty] lua 처음 다루기 (0) | 2017.01.24 |
openresty 1.11.2 설치 (0) | 2017.01.19 |
nginx의 next_upstream 비멱등 메소드는 retry를 하지 않는다 - nginx,python 웹 서버 이용 예시 (0) | 2016.12.29 |