首先我們選擇使用 OpenResty,其是由 Nginx 核心加很多第三方模塊組成,其最大的亮點(diǎn)是默認(rèn)集成了 Lua 開發(fā)環(huán)境,使得 Nginx 可以作為一個(gè) Web Server 使用。借助于 Nginx 的事件驅(qū)動(dòng)模型和非阻塞 IO,可以實(shí)現(xiàn)高性能的 Web 應(yīng)用程序。而且 OpenResty 提供了大量組件如 Mysql、Redis、Memcached 等等,使在 Nginx 上開發(fā)Web 應(yīng)用更方便更簡(jiǎn)單。目前在京東如實(shí)時(shí)價(jià)格、秒殺、動(dòng)態(tài)服務(wù)、單品頁、列表頁等都在使用Nginx+Lua 架構(gòu),其他公司如淘寶、去哪兒網(wǎng)等。
安裝步驟可以參考 http://openresty.org/#Installation。
Java 代碼 收藏代碼
mkdir -p /usr/servers
cd /usr/servers/
Java 代碼 收藏代碼
apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl
Java 代碼 收藏代碼
wget http://openresty.org/download/ngx_openresty-1.7.7.2.tar.gz
tar -xzvf ngx_openresty-1.7.7.2.tar.gz
ngx_openresty-1.7.7.2/bundle 目錄里存放著 nginx 核心和很多第三方模塊,比如有我們需要的 Lua 和 LuaJIT。
Java 代碼 收藏代碼
cd bundle/LuaJIT-2.1-20150120/
make clean && make && make install
ln -sf luajit-2.1.0-alpha /usr/local/bin/luajit
Java 代碼 收藏代碼
cd /usr/servers/ngx_openresty-1.7.7.2/bundle
wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz
tar -xvf 2.3.tar.gz
Java 代碼 收藏代碼
cd /usr/servers/ngx_openresty-1.7.7.2/bundle
wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/v0.3.0.tar.gz
tar -xvf v0.3.0.tar.gz
Java 代碼 收藏代碼
cd /usr/servers/ngx_openresty-1.7.7.2
./configure --prefix=/usr/servers --with-http_realip_module --with-pcre --with-luajit --add-module=./bundle/ngx_cache_purge-2.3/ --add-module=./bundle/nginx_upstream_check_module-0.3.0/ -j2
make && make install
--with*** 安裝一些內(nèi)置/集成的模塊
--with-http_realip_module 取用戶真實(shí) ip 模塊
-with-pcre Perl 兼容的達(dá)式模塊
--with-luajit 集成 luajit 模塊
--add-module 添加自定義的第三方模塊,如此次的 ngx_che_purge
Java 代碼 收藏代碼
cd /usr/servers/
ll
會(huì)發(fā)現(xiàn)多出來了如下目錄,說明安裝成功
/usr/servers/luajit :luajit 環(huán)境,luajit 類似于 java 的 jit,即即時(shí)編譯,lua 是一種解釋語言,通過 luajit 可以即時(shí)編譯 lua 代碼到機(jī)器代碼,得到很好的性能;
/usr/servers/lualib:要使用的 lua 庫,里邊提供了一些默認(rèn)的 lua 庫,如 redis,json 庫等,也可以把一些自己開發(fā)的或第三方的放在這;
/usr/servers/nginx :安裝的 nginx;
通過 /usr/servers/nginx/sbin/nginx -V 查看 nginx 版本和安裝的模塊
/usr/servers/nginx/sbin/nginx
接下來該配置 nginx+lua 開發(fā)環(huán)境了
配置及 Nginx HttpLuaModule 文檔在可以查看 http://openresty.org/#Installation。
Java 代碼 收藏代碼
vim /usr/servers/nginx/conf/nginx.conf
Java 代碼 收藏代碼
\#lua模塊路徑,多個(gè)之間”;”分隔,其中”;;”表示默認(rèn)搜索路徑,默認(rèn)到/usr/servers/nginx下找
lua_package_path "/usr/servers/lualib/?.lua;;"; #lua 模塊
lua_package_cpath "/usr/servers/lualib/?.so;;"; #c模塊
Java 代碼 收藏代碼
\#lua.conf
server {
listen 80;
server_name _;
}
Java 代碼 收藏代碼
include lua.conf;
Java 代碼 收藏代碼
/usr/servers/nginx/sbin/nginx -t
如果顯示如下內(nèi)容說明配置成功
Java 代碼 收藏代碼
location /lua {
default_type 'text/html';
content_by_lua 'ngx.say("hello world")';
}
Java 代碼 收藏代碼
/usr/servers/nginx/sbin/nginx -t
Java 代碼 收藏代碼
/usr/servers/nginx/sbin/nginx -s reload
http://192.168.1.6/lua(自己的機(jī)器根據(jù)實(shí)際情況換 ip),可以看到如下內(nèi)容hello world
我們把 lua 代碼放在 nginx 配置中會(huì)隨著 lua 的代碼的增加導(dǎo)致配置文件太長(zhǎng)不好維護(hù),因此我們應(yīng)該把 lua 代碼移到外部文件中存儲(chǔ)。
Java 代碼 收藏代碼
vim /usr/servers/nginx/conf/lua/test.lua
Java 代碼 收藏代碼
\#添加如下內(nèi)容
ngx.say("hello world");
然后 lua.conf 修改為
Java 代碼 收藏代碼
location /lua {
default_type 'text/html';
content_by_lua_file conf/lua/test.lua; #相對(duì)于nginx安裝目錄
}
此處 conf/lua/test.lua 也可以使用絕對(duì)路徑 /usr/servers/nginx/conf/lua/test.lua。
默認(rèn)情況下 lua_code_cache 是開啟的,即緩存 lua 代碼,即每次 lua 代碼變更必須reload nginx 才生效,如果在開發(fā)階段可以通過 lua_code_cache off;關(guān)閉緩存,這樣調(diào)試時(shí)每次修改 lua 代碼不需要 reload nginx;但是正式環(huán)境一定記得開啟緩存。
Java 代碼 收藏代碼
location /lua {
default_type 'text/html';
lua_code_cache off;
content_by_lua_file conf/lua/test.lua;
}
開啟后 reload nginx 會(huì)看到如下報(bào)警
nginx: [alert] lua_code_cache is off; this will hurt performance in /usr/servers/nginx/conf/lua.conf:8
如果運(yùn)行過程中出現(xiàn)錯(cuò)誤,請(qǐng)不要忘記查看錯(cuò)誤日志。
Java 代碼 收藏代碼
tail -f /usr/servers/nginx/logs/error.log
到此我們的基本環(huán)境搭建完畢。
以后我們的 nginx lua 開發(fā)文件會(huì)越來越多,我們應(yīng)該把其項(xiàng)目化,已方便開發(fā)。項(xiàng)目目錄結(jié)構(gòu)如下所示:
example
example.conf ---該項(xiàng)目的nginx 配置文件
lua ---我們自己的lua代碼
test.lua
lualib ---lua依賴庫/第三方依賴
*.lua
*.so
其中我們把 lualib 也放到項(xiàng)目中的好處就是以后部署的時(shí)候可以一起部署,防止有的服務(wù)器忘記復(fù)制依賴而造成缺少依賴的情況。
我們將項(xiàng)目放到到 /usr/example 目錄下。
/usr/servers/nginx/conf/nginx.conf 配置文件如下(此處我們最小化了配置文件)
Java 代碼 收藏代碼
\#user nobody;
worker_processes 2;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type text/html;
#lua模塊路徑,其中”;;”表示默認(rèn)搜索路徑,默認(rèn)到/usr/servers/nginx下找
lua_package_path "/usr/example/lualib/?.lua;;"; #lua 模塊
lua_package_cpath "/usr/example/lualib/?.so;;"; #c模塊
include /usr/example/example.conf;
}
通過絕對(duì)路徑包含我們的 lua 依賴庫和 nginx 項(xiàng)目配置文件。
/usr/example/example.conf 配置文件如下
Java 代碼 收藏代碼
server {
listen 80;
server_name _;
location /lua {
default_type 'text/html';
lua_code_cache off;
content_by_lua_file /usr/example/lua/test.lua;
}
}
lua 文件我們使用絕對(duì)路徑 /usr/example/lua/test.lua。
到此我們就可以把 example 扔 svn 上了。