Sarc Summit Summer 2016
by sarc.io
June 11
삵
LUA를 이용한 스마트한 웹서버 만들기
Part1. Apache + LUA
Ray. Lee
sleepred@gmail.com
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
• Overview
• Apache + LUA
• mod_lua 소개
• mod_lua Hook & Build-in functions
• mod_lua 활용하기
• 정리
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
Prologue
• 전세계적으로 다양한 웹서비스 보급
• Trends - Cloud, Social Networking Service, Mobile↑
• 웹에 접속할 수 있는 사용자 ↑ Device ↑↑
• 웹서버의 이용 빈도의 급격한 증가
• 웹 컨텐츠의 증가 → 튜닝이 상당히 중요함
◆ Total number of websites : 2016년 5월 기준 by netcraft.com
- http://news.netcraft.com/archives/2016/05/26/may-2016-web-server-survey.html
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
Prologue - Issue
• Security, Perfermance, 대용량 처리, 운영 기술 문제
• 웹컨텐츠의 최적화만으로는 대응이 어려움
• 웹서버 소프트웨어 자체의 확장으로 대응
Stability
Security
Availability
웹서버 확장
Perfermance
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
Prologue – 웹서버 확장
• 확장의 문턱이 높음(Apache의 경우)
• C언어로 구현 (생산성이 문제)
• Compile 이나 유지보수의 문제
• Apache 내부 메커니즘의 깊은 이해가 필요
최근의 Needs
C언어의 고속성과 경량화 유지보수성과 생산성
Solution?
Apache + Lua
• Script에 의한 기능 확장의 Interface를 구현
• 웹서버의 내부 기능의 확장을 Script로 구현 가능
• 고속으로 동작하는 구현체가 필요
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
Apache HTTP Server
• Apache HTTP Server?
• Top Open Source Communities – ASF Project
• 현재는 Apache Software Foundation에서 오픈 소스로 공개하여 관리하고 있음
• 전세계 인터넷의 60% 이상의 웹서버에서 Apache 가 사용됨
◆ Apache HTTP Server project
- http://httpd.apache.org
◆ Apache Software Foundation
- http://www.apache.org
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
Apache 2.4
• Apache HTTP Server 2.4
• 2012년 12월 2.4.1 릴리즈 -> 7년만에 안정화판 릴리즈
• Nginx를 의식한 구현 및 개선
• 성능 개선, 메모리 사용량 감소 등등
• Default MPM이 변경 → Prefork에서 envent_mpm으로
• 다양한 모듈이나 기능 추가 개선
• mod_sed, mod_lua, bufferedlogs, rotatelogs 등
◆ 시장점유율 : 2016년 5월 기준 by w3techs
-
https://w3techs.com/technologies/overview/web_serv
er/all
◆ 시장점유율 : 2016년 5월 기준 by netcraft.com
- http://news.netcraft.com/archives/2016/05/26/may-
2016-web-server-survey.html
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
LUA 란?
◆ Application & Framework
◆ Game ◆ Web Server
mod_lua
ngx_lua
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
LUA ?
• LUA ?
• 루아란 포르투갈어로 '달'이라는 뜻으로, 브라질에서 개발됨
• 가벼운 인터프린터 언어. 쉽고 가볍게 C/C++에 내장됨
• WOW의 유저 UI 스크립트 언어로 유명해짐
• LUA 특징
• 오픈 소스
• 이식성이 좋다. (C 언어와 호환성이 좋음)
• 런타임 속도가 빠르다.
(스크립트 언어 중에는 제일 성능이 좋음)
※ Lua official site : http://www.lua.org
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
mod_lua
• mod_lua
• Apache에서 Lua를 동작하게 해주는 모듈
• Lua는 매우 가볍고 빠르다. (Script 언어중 ↑)
• CGI 처럼 사용할 수 있음 (like mod_php, mod_perl..)
• Apache Module 구현을 지원 (Apache Hook 함수 제공)
• Apache 2.3(2.4)에 추가된 신기능 (Nginx를 의식해서 만들어짐?)
• Lua의 Apache 모듈 구현 지원 방안
• Lua Script로 Apache를 Hook 시켜주는 인터페이스 제공
• Lua Script 내부에서 Apache의 내부 처리를 구현 가능
• request_rec 를 인자로 사용 가능
• apache2 모듈 이용가능
• C 기반 모듈에 비해 개발 생산성이 높고, 유지보수가 쉬움
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
mod_lua 설치
• mod_lua 설치
• Apache 2.4 부터 지원
• '–enable-lua' 컴파일 옵션을 통해서 설치
• httpd.conf 설정
./configure
--prefix=$(설치 경로}
--enable-lua
......
LoadModule lua_module modules/mod_lua.so
<IfModule mime_module>
AddHandler lua-script .lua
</IfModule>
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
Hello.lua
1
2
3
4
5
6
7
8
9
10
11
function handle(r)
r.content_type = "text/html"
r:puts([[
<html>
<head><title>hello</title></head>
<body><h1>Hello, I'm Lua</h1></body>
</html>
]])
end
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
mod_lua - request_rec
• The request_rec structure
• apache의 request_rec 구조체의 wrapper
• 클라이언트의 요청 정보 등 Apache의 데이터를 참조하는 데 사용
• r.hostname (호스트명), r.uri (URI)와 같이 참조
※ The request_rec structure : http://www.modlua.org/api/request
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
mod_lua - LuaHook
• LuaHook*
• mod_lua는 Apache의 동작을 Hook하는 핸들러를 정의할수 있으며, 핸들러 정
의는 Apache의 동작 중 커스트마이징하려고 하는 타이밍에 의해 아래 Directive
를 Apache 설정 파일에 기술하는 방식
• 호출 순서 : LuaQuickHandler → LuaHookTranslateName →
LuaHookMapToStorage → LuaHookAccessChecker → LuaHookFixups
Hook phas mod_lua directive Description
Quick handler LuaQuickHandler Reqeust 가 호출되었을때, 최초로 호출되는 hook
Translate name LuaHookTranslateName URI로부터 파일명을 선택하는 타이밍
Map to storage LuaHookMapToStorage
physical, cached , external/proxied 등 Storage를 선
택하는 타이밍
Check Access LuaHookAccessChecker
클라이언트가 리소스에 접속할 수 있는지 검증하는
타이밍
Check User ID LuaHookCheckUserID 사용자 ID를 검증하는 타이밍
Check Authorization
LuaHookAuthChecker or LuaAuthz
Provider
사용자 ID 등 사용자 권한을 인증하는 타이밍
Fixups LuaHookFixups content 처리 전 최후의 타이밍
Logging LuaHookLog content 처리 후 로그 처리의 타이밍
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
mod_lua – apache2 package
• apache2 Package
• 실행중인 Apache의 정보를 가져올 수 있는 패키지.
• 현재 버전 번호와 Apache의 동작을 제어하는 다음의 상수를 참조 할 수 있음.
• 상수는 주로 다음을 핸들러 함수의 return 문에 지정하여 사용.
구분 설명
apache2.OK
요청 처리의 종료를 나타냄. lua 스크립트에 직접
응답을 생성하는 경우에 지정
apache2.DONE
LuaHookLog 지시문에서 로그 처리를 Hook 할 때
OK 대신 지정
apache2.DECLINED
Apache의 기본 동작을 처리함. lua script로
Apache의 동작/설정 등을 변경하고, 응답은
Apache의 content를 반환 시 지정
apache2.HTTP_MOVED_TEMPORARILY HTTP status code (302) 반환
※ apache2 Package : http://httpd.apache.org/docs/current/mod/mod_lua.html#apache2
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
mod_lua Example(1)
Example) Under Construction ..
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
mod_lua Example(1)
1
2
3
4
5
6
7
8
9
function construction(r)
ctime = os.date("%H")
if tonumber(ctime) > 19 and tonumber(ctime) > 22 then
r.headers_out["Location"] = "http://27.122.xxx.xx:8001/image
s/uc.html" // sorry server 
return apache2.HTTP_MOVED_TEMPORARILY
else
return apache2.DECLINED
end
End
웹사이트
정기 점검
1 LuaHookTranslateName ${INSTALL_PATH}/conf/extra/lua/construction.lua
construction
• httpd-lua.conf
• construction.lua
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
Build-in functions
• Build-in functions
• FILESYSTEM FUNCTIONS
• ENCODING/DECODING FUNCTIONS
• SYSTEM FUNCTIONS
• EXPRESSION PARSING
• REQUEST PARSING FUNCTIONS
• REQUEST RESPONSE FUNCTIONS
• REQUEST MANIPULATION
• DEBUGGING FUNCTIONS
• exists_config_define
• loaded_modules, module_info
• mpm_query
• scoreboard_process, scoreboard_worker
• server_info, state_query
• DATABASE FUNCTIONS
※ Built-in functions : http://www.modlua.org/api/builtin
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
mod_lua Example(2)
Example) Server Status..
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
mod_lua Example(2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- Fetch server data
local mpm = "prefork" -- assume prefork by default
if r.mpm_query(14) == 1 then
mpm = "event" -- this is event mpm
elseif r.mpm_query(3) >= 1 then
mpm = "worker" -- it's threaded, we'll assume worker mpm
End
local maxServers = r.mpm_query(12);
local maxThreads = r.mpm_query(6);
……
-- Fetch process/thread data
for i=0,maxServers,1 do
server = r.scoreboard_process(r, i);
……
end
end
……
1 LuaMapHandler ^/lua-status$ ${INSTALL_PATH}/conf/extra/lua/server-st
atus.lua
• httpd-lua.conf
• server-status.lua
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
정리!
• Apache + LUA = mod_lua
• Apache 2.4에서도 아직 experimental state 이지만, Apache 버전이 올라가면서
(2.4.20 버전 기준) 완성도가 높아짐
• Apache 2.4에 기본 모듈에 포함되어 있으며, Apache 모듈에 쉽게 접근 가능하
여 웹서버 확장 및 기능 추가시 유용하게 사용할 수 있음
• mod_lua 생산성, 유지보수성을 중요시 한다면, 최선의 선택
성능도 스크립트 언어 중에서 가장 띄어남
• 성능이 최우선시 되어야 된다면, mod_hell (C언어)의 대안으로
mod_mruby(Apache 내부처리를 Ruby로 제어) 검토 해볼 수 있음
• Nginx 를 사용한다면, Lua를 사용하여 더 쉽고 강력하게 확장가능
LuaJIT, 다양한 ngx_lua API 제공 등
→ Part2. NGINX + lua … Coming soon ^^
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
Reference
• Reference
• Apache HTTP Server : http://httpd.apache.org/
• mod_lua :
https://httpd.apache.org/docs/trunk/mod/mod_lua.html
http://www.modlua.org/
• Lua Reference Manual : http://www.lua.org/manual/
• Lua official site : http://www.lua.org
• Lua user group : http://lua-users.org/
Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
Q / A
Q / A

LUA를 이용한 스마트한 웹서버 만들기 (Ray. Lee)

  • 1.
    Sarc Summit Summer2016 by sarc.io June 11 삵 LUA를 이용한 스마트한 웹서버 만들기 Part1. Apache + LUA Ray. Lee sleepred@gmail.com
  • 2.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 • Overview • Apache + LUA • mod_lua 소개 • mod_lua Hook & Build-in functions • mod_lua 활용하기 • 정리
  • 3.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 Prologue • 전세계적으로 다양한 웹서비스 보급 • Trends - Cloud, Social Networking Service, Mobile↑ • 웹에 접속할 수 있는 사용자 ↑ Device ↑↑ • 웹서버의 이용 빈도의 급격한 증가 • 웹 컨텐츠의 증가 → 튜닝이 상당히 중요함 ◆ Total number of websites : 2016년 5월 기준 by netcraft.com - http://news.netcraft.com/archives/2016/05/26/may-2016-web-server-survey.html
  • 4.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 Prologue - Issue • Security, Perfermance, 대용량 처리, 운영 기술 문제 • 웹컨텐츠의 최적화만으로는 대응이 어려움 • 웹서버 소프트웨어 자체의 확장으로 대응 Stability Security Availability 웹서버 확장 Perfermance
  • 5.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 Prologue – 웹서버 확장 • 확장의 문턱이 높음(Apache의 경우) • C언어로 구현 (생산성이 문제) • Compile 이나 유지보수의 문제 • Apache 내부 메커니즘의 깊은 이해가 필요 최근의 Needs C언어의 고속성과 경량화 유지보수성과 생산성 Solution? Apache + Lua • Script에 의한 기능 확장의 Interface를 구현 • 웹서버의 내부 기능의 확장을 Script로 구현 가능 • 고속으로 동작하는 구현체가 필요
  • 6.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 Apache HTTP Server • Apache HTTP Server? • Top Open Source Communities – ASF Project • 현재는 Apache Software Foundation에서 오픈 소스로 공개하여 관리하고 있음 • 전세계 인터넷의 60% 이상의 웹서버에서 Apache 가 사용됨 ◆ Apache HTTP Server project - http://httpd.apache.org ◆ Apache Software Foundation - http://www.apache.org
  • 7.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 Apache 2.4 • Apache HTTP Server 2.4 • 2012년 12월 2.4.1 릴리즈 -> 7년만에 안정화판 릴리즈 • Nginx를 의식한 구현 및 개선 • 성능 개선, 메모리 사용량 감소 등등 • Default MPM이 변경 → Prefork에서 envent_mpm으로 • 다양한 모듈이나 기능 추가 개선 • mod_sed, mod_lua, bufferedlogs, rotatelogs 등 ◆ 시장점유율 : 2016년 5월 기준 by w3techs - https://w3techs.com/technologies/overview/web_serv er/all ◆ 시장점유율 : 2016년 5월 기준 by netcraft.com - http://news.netcraft.com/archives/2016/05/26/may- 2016-web-server-survey.html
  • 8.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 LUA 란? ◆ Application & Framework ◆ Game ◆ Web Server mod_lua ngx_lua
  • 9.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 LUA ? • LUA ? • 루아란 포르투갈어로 '달'이라는 뜻으로, 브라질에서 개발됨 • 가벼운 인터프린터 언어. 쉽고 가볍게 C/C++에 내장됨 • WOW의 유저 UI 스크립트 언어로 유명해짐 • LUA 특징 • 오픈 소스 • 이식성이 좋다. (C 언어와 호환성이 좋음) • 런타임 속도가 빠르다. (스크립트 언어 중에는 제일 성능이 좋음) ※ Lua official site : http://www.lua.org
  • 10.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 mod_lua • mod_lua • Apache에서 Lua를 동작하게 해주는 모듈 • Lua는 매우 가볍고 빠르다. (Script 언어중 ↑) • CGI 처럼 사용할 수 있음 (like mod_php, mod_perl..) • Apache Module 구현을 지원 (Apache Hook 함수 제공) • Apache 2.3(2.4)에 추가된 신기능 (Nginx를 의식해서 만들어짐?) • Lua의 Apache 모듈 구현 지원 방안 • Lua Script로 Apache를 Hook 시켜주는 인터페이스 제공 • Lua Script 내부에서 Apache의 내부 처리를 구현 가능 • request_rec 를 인자로 사용 가능 • apache2 모듈 이용가능 • C 기반 모듈에 비해 개발 생산성이 높고, 유지보수가 쉬움
  • 11.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 mod_lua 설치 • mod_lua 설치 • Apache 2.4 부터 지원 • '–enable-lua' 컴파일 옵션을 통해서 설치 • httpd.conf 설정 ./configure --prefix=$(설치 경로} --enable-lua ...... LoadModule lua_module modules/mod_lua.so <IfModule mime_module> AddHandler lua-script .lua </IfModule>
  • 12.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 Hello.lua 1 2 3 4 5 6 7 8 9 10 11 function handle(r) r.content_type = "text/html" r:puts([[ <html> <head><title>hello</title></head> <body><h1>Hello, I'm Lua</h1></body> </html> ]]) end
  • 13.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 mod_lua - request_rec • The request_rec structure • apache의 request_rec 구조체의 wrapper • 클라이언트의 요청 정보 등 Apache의 데이터를 참조하는 데 사용 • r.hostname (호스트명), r.uri (URI)와 같이 참조 ※ The request_rec structure : http://www.modlua.org/api/request
  • 14.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 mod_lua - LuaHook • LuaHook* • mod_lua는 Apache의 동작을 Hook하는 핸들러를 정의할수 있으며, 핸들러 정 의는 Apache의 동작 중 커스트마이징하려고 하는 타이밍에 의해 아래 Directive 를 Apache 설정 파일에 기술하는 방식 • 호출 순서 : LuaQuickHandler → LuaHookTranslateName → LuaHookMapToStorage → LuaHookAccessChecker → LuaHookFixups Hook phas mod_lua directive Description Quick handler LuaQuickHandler Reqeust 가 호출되었을때, 최초로 호출되는 hook Translate name LuaHookTranslateName URI로부터 파일명을 선택하는 타이밍 Map to storage LuaHookMapToStorage physical, cached , external/proxied 등 Storage를 선 택하는 타이밍 Check Access LuaHookAccessChecker 클라이언트가 리소스에 접속할 수 있는지 검증하는 타이밍 Check User ID LuaHookCheckUserID 사용자 ID를 검증하는 타이밍 Check Authorization LuaHookAuthChecker or LuaAuthz Provider 사용자 ID 등 사용자 권한을 인증하는 타이밍 Fixups LuaHookFixups content 처리 전 최후의 타이밍 Logging LuaHookLog content 처리 후 로그 처리의 타이밍
  • 15.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 mod_lua – apache2 package • apache2 Package • 실행중인 Apache의 정보를 가져올 수 있는 패키지. • 현재 버전 번호와 Apache의 동작을 제어하는 다음의 상수를 참조 할 수 있음. • 상수는 주로 다음을 핸들러 함수의 return 문에 지정하여 사용. 구분 설명 apache2.OK 요청 처리의 종료를 나타냄. lua 스크립트에 직접 응답을 생성하는 경우에 지정 apache2.DONE LuaHookLog 지시문에서 로그 처리를 Hook 할 때 OK 대신 지정 apache2.DECLINED Apache의 기본 동작을 처리함. lua script로 Apache의 동작/설정 등을 변경하고, 응답은 Apache의 content를 반환 시 지정 apache2.HTTP_MOVED_TEMPORARILY HTTP status code (302) 반환 ※ apache2 Package : http://httpd.apache.org/docs/current/mod/mod_lua.html#apache2
  • 16.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 mod_lua Example(1) Example) Under Construction ..
  • 17.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 mod_lua Example(1) 1 2 3 4 5 6 7 8 9 function construction(r) ctime = os.date("%H") if tonumber(ctime) > 19 and tonumber(ctime) > 22 then r.headers_out["Location"] = "http://27.122.xxx.xx:8001/image s/uc.html" // sorry server  return apache2.HTTP_MOVED_TEMPORARILY else return apache2.DECLINED end End 웹사이트 정기 점검 1 LuaHookTranslateName ${INSTALL_PATH}/conf/extra/lua/construction.lua construction • httpd-lua.conf • construction.lua
  • 18.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 Build-in functions • Build-in functions • FILESYSTEM FUNCTIONS • ENCODING/DECODING FUNCTIONS • SYSTEM FUNCTIONS • EXPRESSION PARSING • REQUEST PARSING FUNCTIONS • REQUEST RESPONSE FUNCTIONS • REQUEST MANIPULATION • DEBUGGING FUNCTIONS • exists_config_define • loaded_modules, module_info • mpm_query • scoreboard_process, scoreboard_worker • server_info, state_query • DATABASE FUNCTIONS ※ Built-in functions : http://www.modlua.org/api/builtin
  • 19.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 mod_lua Example(2) Example) Server Status..
  • 20.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 mod_lua Example(2) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 -- Fetch server data local mpm = "prefork" -- assume prefork by default if r.mpm_query(14) == 1 then mpm = "event" -- this is event mpm elseif r.mpm_query(3) >= 1 then mpm = "worker" -- it's threaded, we'll assume worker mpm End local maxServers = r.mpm_query(12); local maxThreads = r.mpm_query(6); …… -- Fetch process/thread data for i=0,maxServers,1 do server = r.scoreboard_process(r, i); …… end end …… 1 LuaMapHandler ^/lua-status$ ${INSTALL_PATH}/conf/extra/lua/server-st atus.lua • httpd-lua.conf • server-status.lua
  • 21.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 정리! • Apache + LUA = mod_lua • Apache 2.4에서도 아직 experimental state 이지만, Apache 버전이 올라가면서 (2.4.20 버전 기준) 완성도가 높아짐 • Apache 2.4에 기본 모듈에 포함되어 있으며, Apache 모듈에 쉽게 접근 가능하 여 웹서버 확장 및 기능 추가시 유용하게 사용할 수 있음 • mod_lua 생산성, 유지보수성을 중요시 한다면, 최선의 선택 성능도 스크립트 언어 중에서 가장 띄어남 • 성능이 최우선시 되어야 된다면, mod_hell (C언어)의 대안으로 mod_mruby(Apache 내부처리를 Ruby로 제어) 검토 해볼 수 있음 • Nginx 를 사용한다면, Lua를 사용하여 더 쉽고 강력하게 확장가능 LuaJIT, 다양한 ngx_lua API 제공 등 → Part2. NGINX + lua … Coming soon ^^
  • 22.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 Reference • Reference • Apache HTTP Server : http://httpd.apache.org/ • mod_lua : https://httpd.apache.org/docs/trunk/mod/mod_lua.html http://www.modlua.org/ • Lua Reference Manual : http://www.lua.org/manual/ • Lua official site : http://www.lua.org • Lua user group : http://lua-users.org/
  • 23.
    Sarc Summit Summer2016 by sarc.io Apache + LUA삵 Q / A Q / A