3. 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
4. Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
Prologue - Issue
• Security, Perfermance, 대용량 처리, 운영 기술 문제
• 웹컨텐츠의 최적화만으로는 대응이 어려움
• 웹서버 소프트웨어 자체의 확장으로 대응
Stability
Security
Availability
웹서버 확장
Perfermance
5. Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
Prologue – 웹서버 확장
• 확장의 문턱이 높음(Apache의 경우)
• C언어로 구현 (생산성이 문제)
• Compile 이나 유지보수의 문제
• Apache 내부 메커니즘의 깊은 이해가 필요
최근의 Needs
C언어의 고속성과 경량화 유지보수성과 생산성
Solution?
Apache + Lua
• Script에 의한 기능 확장의 Interface를 구현
• 웹서버의 내부 기능의 확장을 Script로 구현 가능
• 고속으로 동작하는 구현체가 필요
6. 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
7. 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
8. Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
LUA 란?
◆ Application & Framework
◆ Game ◆ Web Server
mod_lua
ngx_lua
9. Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
LUA ?
• LUA ?
• 루아란 포르투갈어로 '달'이라는 뜻으로, 브라질에서 개발됨
• 가벼운 인터프린터 언어. 쉽고 가볍게 C/C++에 내장됨
• WOW의 유저 UI 스크립트 언어로 유명해짐
• LUA 특징
• 오픈 소스
• 이식성이 좋다. (C 언어와 호환성이 좋음)
• 런타임 속도가 빠르다.
(스크립트 언어 중에는 제일 성능이 좋음)
※ Lua official site : http://www.lua.org
10. 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 기반 모듈에 비해 개발 생산성이 높고, 유지보수가 쉬움
11. 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>
13. 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
14. 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 처리 후 로그 처리의 타이밍
15. 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
16. Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
mod_lua Example(1)
Example) Under Construction ..
17. 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
19. Sarc Summit Summer 2016
by sarc.io
Apache + LUA삵
mod_lua Example(2)
Example) Server Status..
20. 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
21. 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 ^^
22. 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/