出處:http://wiki.jikexueyuan.com/index.php/project/nginx-lua/development-environment.html
安裝 Nginx+Lua 開發環境
首先我們選擇使用?OpenResty,其是由 Nginx 核心加很多第三方模塊組成,其最大的亮點是默認集成了 Lua 開發環境,使得 Nginx 可以作為一個 Web Server 使用。借助于 Nginx 的事件驅動模型和非阻塞 IO,可以實現高性能的 Web 應用程序。而且 OpenResty 提供了大量組件如 Mysql、Redis、Memcached 等等,使在 Nginx 上開發Web 應用更方便更簡單。目前在京東如實時價格、秒殺、動態服務、單品頁、列表頁等都在使用Nginx+Lua 架構,其他公司如淘寶、去哪兒網等。
安裝環境
安裝步驟可以參考?http://openresty.org/#Installation。
創建目錄 /usr/servers,以后我們把所有軟件安裝在此目錄
Java?代碼?收藏代碼
mkdir -p /usr/servers?
cd /usr/servers/?
安裝依賴(我的環境是 ubuntu,可以使用如下命令安裝,其他的可以參考 openresty 安裝步驟)
Java?代碼?收藏代碼
apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl?
下載 ngx_openresty-1.7.7.2.tar.gz 并解壓
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。
安裝 LuaJIT
Java?代碼?收藏代碼
cd bundle/LuaJIT-2.1-20150120/?
make clean && make && make install?
ln -sf luajit-2.1.0-alpha /usr/local/bin/luajit?
下載 ngx_cache_purge 模塊,該模塊用于清理 nginx 緩存
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?
下載 nginx_upstream_check_module 模塊,該模塊用于 ustream 健康檢查
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?
安裝 ngx_openresty
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*** 安裝一些內置/集成的模塊
--with-http_realip_module 取用戶真實 ip 模塊
-with-pcre Perl 兼容的達式模塊
--with-luajit 集成 luajit 模塊
--add-module 添加自定義的第三方模塊,如此次的 ngx_che_purge
到 /usr/servers 目錄下
Java?代碼?收藏代碼
cd /usr/servers/? ?
ll?
會發現多出來了如下目錄,說明安裝成功
/usr/servers/luajit?:luajit 環境,luajit 類似于 java 的 jit,即即時編譯,lua 是一種解釋語言,通過 luajit 可以即時編譯 lua 代碼到機器代碼,得到很好的性能;
/usr/servers/lualib:要使用的 lua 庫,里邊提供了一些默認的 lua 庫,如 redis,json 庫等,也可以把一些自己開發的或第三方的放在這;
/usr/servers/nginx :安裝的 nginx;
通過 /usr/servers/nginx/sbin/nginx -V 查看 nginx 版本和安裝的模塊
啟動 nginx
/usr/servers/nginx/sbin/nginx
若之前已安裝過nginx 請停止nginx服務
/etc/init.d/nginx stop
或
service nginx stop
接下來該配置 nginx+lua 開發環境了
配置環境
配置及 Nginx HttpLuaModule 文檔在可以查看?http://openresty.org/#Installation。
編輯 nginx.conf 配置文件
Java?代碼?收藏代碼
vim /usr/servers/nginx/conf/nginx.conf?
在 http 部分添加如下配置
Java?代碼?收藏代碼
\#lua模塊路徑,多個之間”;”分隔,其中”;;”表示默認搜索路徑,默認到/usr/servers/nginx下找?
lua_package_path "/usr/servers/lualib/?.lua;;";? #lua 模塊?
lua_package_cpath "/usr/servers/lualib/?.so;;";? #c模塊?
為了方便開發我們在 /usr/servers/nginx/conf 目錄下創建一個 lua.conf
Java?代碼?收藏代碼
\#lua.conf?
server {?
? ? listen? ? ? 80;?
? ? server_name? _;?
}?
在 nginx.conf 中的 http 部分添加 include lua.conf 包含此文件片段
Java?代碼?收藏代碼
include lua.conf;?
測試是否正常
Java?代碼?收藏代碼
/usr/servers/nginx/sbin/nginx -t
如果顯示如下內容說明配置成功
nginx: the configuration file /usr/servers/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/servers/nginx/conf/nginx.conf test is successful
HelloWorld
在 lua.conf 中 server 部分添加如下配置
Java?代碼?收藏代碼
location /lua {?
? ? default_type 'text/html';?
? ? ? ? content_by_lua 'ngx.say("hello world")';?
}?
測試配置是否正確
Java?代碼?收藏代碼
/usr/servers/nginx/sbin/nginx -t
重啟 nginx
Java?代碼?收藏代碼
/usr/servers/nginx/sbin/nginx -s reload
訪問如?http://192.168.1.6/lua(自己的機器根據實際情況換 ip),可以看到如下內容
hello world
lua 代碼文件
我們把 lua 代碼放在 nginx 配置中會隨著 lua 的代碼的增加導致配置文件太長不好維護,因此我們應該把 lua 代碼移到外部文件中存儲。
Java?代碼?收藏代碼
vim /usr/servers/nginx/conf/lua/test.lua? ?
Java?代碼?收藏代碼
\#添加如下內容?
ngx.say("hello world");?
然后 lua.conf 修改為
Java?代碼?收藏代碼
location /lua {?
? ? default_type 'text/html';?
? ? content_by_lua_file conf/lua/test.lua; #相對于nginx安裝目錄?
}? ?
此處 conf/lua/test.lua 也可以使用絕對路徑 /usr/servers/nginx/conf/lua/test.lua。
lua_code_cache
默認情況下 lua_code_cache 是開啟的,即緩存 lua 代碼,即每次 lua 代碼變更必須reload nginx 才生效,如果在開發階段可以通過 lua_code_cache off;關閉緩存,這樣調試時每次修改 lua 代碼不需要 reload nginx;但是正式環境一定記得開啟緩存。
Java?代碼?收藏代碼
? ? location /lua {?
? ? ? ? default_type 'text/html';?
? ? ? ? lua_code_cache off;?
? ? ? ? content_by_lua_file conf/lua/test.lua;?
}?
開啟后 reload nginx 會看到如下報警
nginx: [alert] lua_code_cache is off; this will hurt performance in /usr/servers/nginx/conf/lua.conf:8
錯誤日志
如果運行過程中出現錯誤,請不要忘記查看錯誤日志。
Java?代碼?收藏代碼
tail -f /usr/servers/nginx/logs/error.log?
到此我們的基本環境搭建完畢。
nginx+lua 項目構建
以后我們的 nginx lua 開發文件會越來越多,我們應該把其項目化,已方便開發。項目目錄結構如下所示:
example
example.conf? ? ---該項目的nginx 配置文件
lua? ? ? ? ? ? ? ---我們自己的lua代碼
? test.lua
lualib? ? ? ? ? ? ---lua依賴庫/第三方依賴
? *.lua
? *.so
其中我們把 lualib 也放到項目中的好處就是以后部署的時候可以一起部署,防止有的服務器忘記復制依賴而造成缺少依賴的情況。
我們將項目放到到 /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模塊路徑,其中”;;”表示默認搜索路徑,默認到/usr/servers/nginx下找?
? ? lua_package_path "/usr/example/lualib/?.lua;;";? #lua 模塊?
? ? lua_package_cpath "/usr/example/lualib/?.so;;";? #c模塊?
? ? include /usr/example/example.conf;?
}? ?
通過絕對路徑包含我們的 lua 依賴庫和 nginx 項目配置文件。
/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 文件我們使用絕對路徑 /usr/example/lua/test.lua。