搜尋

nginx教學

Aug 08, 2016 am 09:23 AM
luanginxquotshell

Nginx與Lua

火雲邪神語錄:天下武功,無堅不破,唯快不破! Nginx的看家本領就是速度,Lua的拿手好戲亦是速度,這兩者的結合在速度上無疑有基因上的優勢。

最先將Nginx,Lua組合在一起的是OpenResty,它有一個ngx_lua模組,將Lua嵌入到了Nginx裡面;隨後Tengine也包含了ngx_lua模組。至於二者的差別:OpenResty是Nginx的Bundle;而Tengine則是Nginx的Fork。值得一提的是,OpenResty和Tengine都是國人自己創造的項目,前者主要由春哥和曉哲開發,後者主要由淘寶打理。

至於OpenResty和Tengine孰優孰劣,留給大家自己判斷,如下資料可供參考:

  • ngx_openresty: an Nginx ecosystem glued by Lua
  • 淘寶網Nginx應用、客製化與開發實戰

推薦看看春哥在Tech-Club上關於『由Lua黏合的Nginx生態環境』的演講實錄,有料!

安裝

需要最新版的Nginx,LuaJIT,ngx_devel_kit,ngx_lua等安裝檔。

安裝Lua或LuaJIT都是可以的,但是出於效率的考慮,建議安裝LuaJIT。

shell> wget http://luajit.org/download/LuaJIT-.tar.gz shell> tar zxvf LuaJIT-.tar.gz shell> cd LuaJIT- shell> make shell> make install

因為安裝在缺省路徑,所以LuaJIT對應的lib,include都在/usr/local目錄裡。

shell> export LUAJIT_LIB=/usr/local/lib shell> export LUAJIT_INC=/usr/local/include/luajit-

下面就可以編譯Nginx了:

shell> wget http://nginx.org/download/nginx-.tar.gz shell> tar zxvf nginx-.tar.gz shell> cd nginx- shell> ./configure --add-module=/path/to/ngx_lua \ --add-module=/path/to/ngx_devel_kit shell> make shell> make install

試著啟動一下Nginx看看,如果你運氣不好的話,可能會遇到如下錯誤:

cannot open shared object file: No such

dicannot open shared object file: No such filefileorrectory

這是神馬情況?可以用ldd指令來看看:

shell> ldd /path/to/nginx libluajit-.so => not found

此類問題通常使用ldconfig指令就能解決:

shell> echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf shell> ldconfig

再試著啟動Nginx看看,應該就OK了。

應用

我們先用一個簡單的程式來暖暖場:把下面的程式碼加入到Nginx的設定檔nginx.conf,並重啟Nginx,然後瀏覽,就能看到效果了。

location /lua { set $test "hello, world."; content_by_lua ' ngx.header.content_type = "text/plain"; ngx.say(ngx.var.test); '; }

在深入學習ngx_lua之前,建議大家仔細閱讀一遍春哥寫的Nginx教學。

這裡我就說關鍵的:Nginx設定檔所使用的語言本質上是『聲明性的』,而非『過程性的』。 Nginx處理請求的時候,指令的執行並不是由定義指令時的物理順序來決定的,而是取決於指令所屬的階段,Nginx常用的階段按先後順序有:rewrite階段,access階段,content階段等等。示範程式碼中的set指令屬於rewrite階段,content_by_lua指令屬於content階段,如果試著把兩個指令的順序交換一下,會發現程式依然能夠正常運作。

下面我們試著結合Redis寫個比較實戰一點的例子。

首先,我們需要建立一個Redis設定檔config.json,內容如下:

{ "host": "", "port": "" }

然後,我們建立一個解析設定檔的腳本init.lua,其中用到了Lua CJSON模組:

local cjson = require "cjson"; local config = ngx.shared.config; local file = io.open("config.json", "r"); local content = cjson.decode(file:read("*all")); file:close(); for name, value in pairs(content) do config:set(name, value); end

說明:程式碼裡用到了共享內存,這樣就不必每次請求都解析一遍設定檔了。

接著,我們建立一個渲染內容的腳本content.lua,用到了Resty Redis模組:

ngx.header.content_type = "text/plain"; local redis = require "resty.redis"; local config = ngx.shared.config; local instance = redis:new(); local host = config:get("host"); local port = config:get("port"); local ok, err = instance:connect(host, port); if not ok then ngx.log(ngx.ERR, err); ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE); end instance:set("name", "laowang"); local name = instance:get("name") instance:close(); ngx.say("name: ", name);

說明:建議把Resty Redis模組放到vendor目錄下,稍後在Nginx中統一設定。

最後,我們需要在Nginx設定檔裡設定一下:

lua_shared_dict config 1m; lua_package_path "/path/to/vendor/?.lua;;"; init_by_lua_file /path/to/init.lua; server { lua_code_cache off; location /lua { content_by_lua_file /path/to/content.lua; } ... }

說明:為了方便調試,我關閉了lua_code_cache,如果是生產環境,應該開啟它。

另外,安裝CJSON的時候,需要注意Makefile檔案裡頭檔的路徑,缺省是:

PREFIX = /usr/local LUA_INCLUDE_DIR = $(PREFIX)/include

如果安裝的是LuaJIT的話,最好把頭檔拷貝到對應目錄:

cp /usr/local/include/luajit-/* /usr/local/include/

我最近參與的一個項目,提供了一些用於Web輪詢的接口,都是用Nginx+Lua實現的,雖然總共只有十幾台伺服器,但是每天可以提供幾十億次的請求量,賊拉拉的強。

最後,讓我引用某位屌絲的語錄做結束語吧:Lua,未婚男性程式設計師的最愛。

此條目由老王發表在Technical分類目錄,並貼了Lua、Nginx標籤。將固定連結加入收藏夾。

NGINX與LUA》上有29條評論


以上就介紹了nginx教程,包含了方面的內容,希望對PHP教程有興趣的朋友有幫助。

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
使用PHP發送電子郵件的最佳方法是什麼?使用PHP發送電子郵件的最佳方法是什麼?May 08, 2025 am 12:21 AM

ThebestapproachforsendingemailsinPHPisusingthePHPMailerlibraryduetoitsreliability,featurerichness,andeaseofuse.PHPMailersupportsSMTP,providesdetailederrorhandling,allowssendingHTMLandplaintextemails,supportsattachments,andenhancessecurity.Foroptimalu

PHP中依賴注入的最佳實踐PHP中依賴注入的最佳實踐May 08, 2025 am 12:21 AM

使用依賴注入(DI)的原因是它促進了代碼的松耦合、可測試性和可維護性。 1)使用構造函數注入依賴,2)避免使用服務定位器,3)利用依賴注入容器管理依賴,4)通過注入依賴提高測試性,5)避免過度注入依賴,6)考慮DI對性能的影響。

PHP性能調整技巧和技巧PHP性能調整技巧和技巧May 08, 2025 am 12:20 AM

phpperformancetuningiscialbecapeitenhancesspeedandeffice,whatevitalforwebapplications.1)cachingwithapcureduccureducesdatabaseloadprovesrovessetimes.2)優化

PHP電子郵件安全性:發送電子郵件的最佳實踐PHP電子郵件安全性:發送電子郵件的最佳實踐May 08, 2025 am 12:16 AM

ThebestpracticesforsendingemailssecurelyinPHPinclude:1)UsingsecureconfigurationswithSMTPandSTARTTLSencryption,2)Validatingandsanitizinginputstopreventinjectionattacks,3)EncryptingsensitivedatawithinemailsusingOpenSSL,4)Properlyhandlingemailheaderstoa

您如何優化PHP應用程序的性能?您如何優化PHP應用程序的性能?May 08, 2025 am 12:08 AM

TOOPTIMIZEPHPAPPLICITIONSFORPERSTORANCE,USECACHING,數據庫imization,opcodecaching和SererverConfiguration.1)InlumentCachingWithApcutCutoredSatfetchTimes.2)優化的atabasesbasesebasesebasesbasesbasesbaysbysbyIndexing,BeallancingAndWriteExing

PHP中的依賴注入是什麼?PHP中的依賴注入是什麼?May 07, 2025 pm 03:09 PM

依賴性注射inphpisadesignpatternthatenhancesFlexibility,可檢驗性和ManiaginabilybyByByByByByExternalDependencEctenceScoupling.itallowsforloosecoupling,EasiererTestingThroughMocking,andModularDesign,andModularDesign,butquirscarecarefulscarefullsstructoringDovairing voavoidOverOver-Inje

最佳PHP性能優化技術最佳PHP性能優化技術May 07, 2025 pm 03:05 PM

PHP性能優化可以通過以下步驟實現:1)在腳本頂部使用require_once或include_once減少文件加載次數;2)使用預處理語句和批處理減少數據庫查詢次數;3)配置OPcache進行opcode緩存;4)啟用並配置PHP-FPM優化進程管理;5)使用CDN分發靜態資源;6)使用Xdebug或Blackfire進行代碼性能分析;7)選擇高效的數據結構如數組;8)編寫模塊化代碼以優化執行。

PHP性能優化:使用OpCode緩存PHP性能優化:使用OpCode緩存May 07, 2025 pm 02:49 PM

opcodecachingsimplovesphperforvesphpermance bycachingCompiledCode,reducingServerLoadAndResponSetimes.1)itstorescompiledphpcodeinmemory,bypassingparsingparsingparsingandcompiling.2)useopcachebachebachebachebachebachebachebysettingparametersinphametersinphp.ini,likeememeryconmorysmorysmeryplement.33)

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。