Nginx lua mysql實時存日誌

2021-08-05 18:54:59 字數 3009 閱讀 7273

準備材料

mysql 自行安裝安裝

配置檔案

user  root;

}}

應用場景和日誌檔案解析

本配置主要解決nginx向mysql中實時插入日誌的問題。

剛開始的時候看了nginx和mysql的連線模組。比如說nginx-mysql-module,可以連線mysql。但是插入日誌時遇到問題,我們知道nginx的執行過程先是location解析並重寫階段,然後是訪問許可權控制階段,接著是內容生成階段,最後是日誌記錄階段。mysql訪問階段屬於內容生成階段,所以**執行的時間和狀態,mysql都無法獲取的到。因此,這種通過nginx直連mysql的方式無法達到我們的要求。

通過lua指令碼在日誌生成階段獲取資訊,然後將資料插入mysql。nginx有乙個限制,無法在log階段訪問socket即無法訪問mysql,所以無法在log階段直接將資料存入mysql。但是可以通過執行包含mysql操作的shell指令碼來解決這個問題。但是這個方法有兩個弊端:

獲取到nginx**的結果後,每次都要連線mysql並向其插入資料。當併發量大時,mysql端會出現問題。

不向mysql插入資料,整個時間的消耗大約在0.02-0.04s之間。而向mysql插入資料後,整個時間消耗大約在0.4-0.9之間,消耗的時間是原來的10倍。

通過lua + ngx.time.at + lua_mysql + lua.share.dict 解決問題。整個過程如下所示:

在nginx啟動階段,ngx.time.at啟動乙個延時任務。在任務中,每隔一段時間取出nginx記憶體共享區的log資料,將資料合併,存入mysql,同時再乙個相同的延時任務,遞迴呼叫。這樣就與crontab命令相似。當定時器到期,定時器中的 lua **是在乙個「輕執行緒」中執行的,它與創造它的原始請求是完全分離的,因此不存在大量執行緒同時執行的情況。

在日誌生成階段,將資料封裝並存入nginx的記憶體共享區。

不但訪問mysql的mysql使用者需要有操作對應資料庫的許可權,還需要呼叫mysql命令的使用者具有訪問mysql的許可權。授權命令如下:

grant all privileges on *.* to root@*** identified by 'password';
mysql 編碼型別

總的來說,mysql的資料庫對應三種編碼。mysql客戶端顯示資料的編碼,連線mysql用的編碼(即資料存入mysql時,資料的編碼),mysql儲存用的編碼(字段,表,資料庫三種格式可能不同)。不管mysql儲存用的編碼是什麼,只要mysql客戶端顯示資料的編碼和連線mysql用的編碼相同,資料就能通過mysql客戶端正確顯示。

nginx lua mysql 使用簡介

了解nginx,正則匹配location 使用luajit 的luarocks類似於php的composer,安裝mysql 執行命令 安裝lua 的mysql擴充套件前,一定要安裝mysql.luarockt install luasql mysql 例子 1.首先修改nginx.confloca...

實時性之硬實時與軟實時

什麼是實時性?實時性指時鐘訊號能夠準確的定時,各處的時鐘能夠達到一致。什麼是硬實時?硬實時系統有乙個剛性的 不可改變的時間限制,它不允許任何超出時限的錯誤。超時錯誤會帶來損害甚至導致系統失敗 或者導致系統不能實現它的預期目標。什麼是軟實時?軟實時系統是乙個柔性靈活的,它可以容忍偶然的超時錯誤。失敗造...

27 硬實時和軟實時

作業系統可以劃分為實時系統和分時系統。實時系統是指系統要再規定時間內完成任務。應用於對時間要求比較嚴格地方,比如機械人運動控制和無人駕駛等。分時系統是指系統cpu可以劃分成n個時段,輪流 n個使用者使用。主要應用於互動性高的地方。現在絕大多數的pc 伺服器都是使用了分時系統。實時系統又能分為 硬實時...