當前位置:首頁 » 網頁前端 » nginxluaweb
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

nginxluaweb

發布時間: 2022-09-10 17:02:53

❶ openresty與Nginx有什麼關系

OpenResty一個全功能的Web應用伺服器,它打包了標準的Nginx核心,很多的常用的第三方模塊,以及它們的大多數依賴項。

OpenResty通過匯聚各種設計精良的Nginx模塊,從而將Nginx有效的變成一個強大的Web應用伺服器,Web開發人員可以使用Lua腳本語言調動Nginx支持的各種C以及Lua模塊,快速構造出足以勝任 10K+並發連接響應的超高性能Web 應用系統。

openresty性能內存儲器容量:

openresty性能需要執行的程序與需要處理的數據就是存放在主存中的。內存儲器容量的大小反映了計算機即時存儲信息的能力。隨著操作系統的升級,應用軟體的不斷豐富及其功能的不斷擴展,人們對計算機內存容量的需求也不斷提高。

openresty性能運行Windows 95或Windows 98操作系統至少需要 16 M的內存容量,Windows XP則需要128 M以上的內存容量。內存容量越大,系統功能就越強大,能處理的數據量就越龐大。

❷ 何時部署要啟動lua nginx

Lua是一個可以嵌入到Nginx配置文件中的動態腳本語言,從而可以在Nginx請求處理的任何階段執行各種Lua代碼。剛開始我們只是用Lua 把請求路由到後端伺服器,但是它對我們架構的作用超出了我們的預期。下面就講講我們所做的工作。
強制搜索引擎只索引mixlr.com
Google把子域名當作完全獨立的網站,我們不希望爬蟲抓取子域名的頁面,降低我們的Page rank
location /robots.txt {
rewrite_by_lua '
if ngx.var.http_host ~= "mixlr.com" then
return ngx.exec("/robots_disallow.txt");
end
';
}

如果對robots.txt的請求不是mixlr.com域名的話,則內部重寫到robots_diallow.txt,雖然標準的重寫指令也可以實現這個需求,但是 Lua的實現更容易理解和維護。
根據程序邏輯設置響應頭
Lua提供了比Nginx默認配置規則更加靈活的設置方式。 在下面的例子中,我們要保證正確設置響應頭,這樣瀏覽器如果發送了指定請求頭後,就可以 無限期緩存靜態文件,是的用戶只需下載一次即可。
這個重寫規則使得任何靜態文件,如果請求參數中包含時間戳值,那麼就設置相應的Expires和Cache-Control響應頭。
location / {
header_filter_by_lua '
if ngx.var.query_string and ngx.re.match( ngx.var.query_string, "^([0-9]{10})$" ) then
ngx.header["Expires"] = ngx.http_time( ngx.time() + 31536000 );
ngx.header["Cache-Control"] = "max-age=31536000";
end
';

try_files $uri @dynamic;}

刪除jQuery JSONP請求的時間戳參數
很多外部客戶端請求JSONP介面時,都會包含一個時間戳類似的參數,從而導致Nginx proxy緩存無法命中(因為無法忽略指定的HTTP參數)。下面的 規則刪除了時間戳參數,使得Nginx可以緩存upstream server的響應內容,減輕後端伺服器的負載。
location / {
rewrite_by_lua '
if ngx.var.args ~= nil then
-- /some_request?_=1346491660 becomes /some_request
local fixed_args, count = ngx.re.sub( ngx.var.args, "&?_=[0-9]+", "" );
if count > 0 then
return ngx.exec(ngx.var.uri, fixed_args);
end
end
';}

把後端的慢請求日誌記錄到Nginx的錯誤日誌
如果後端請求響應很慢,可以把它記錄到Nginx的錯誤日誌,以備後續追查。
location / {
log_by_lua '
if tonumber(ngx.var.upstream_response_time) >= 1 then
ngx.log(ngx.WARN, "[SLOW] Ngx upstream response time: " .. ngx.var.upstream_response_time .. "s from " .. ngx.var.upstream_addr);
end
';}

基於Redis的實時IP封禁
某些情況下,需要阻止流氓爬蟲的抓取,這可以通過專門的封禁設備去做,但是通過Lua,也可以實現簡單版本的封禁。
lua_shared_dict banned_ips 1m;

location / {
access_by_lua '
local banned_ips = ngx.shared.banned_ips;
local updated_at = banned_ips:get("updated_at");

-- only update banned_ips from Redis once every ten seconds:
if updated_at == nil or updated_at < ( ngx.now() - 10 ) then
local redis = require "resty.redis";
local red = redis:new();
red:set_timeout(200);

local ok, err = red:connect("your-redis-hostname", 6379);
if not ok then
ngx.log(ngx.WARN, "Redis connection error retrieving banned_ips: " .. err);
else
local updated_banned_ips, err = red:smembers("banned_ips");
if err then
ngx.log(ngx.WARN, "Redis read error retrieving banned_ips: " .. err);
else
-- replace the locally stored banned_ips with the updated values:
banned_ips:flush_all();
for index, banned_ip in ipairs(updated_banned_ips) do
banned_ips:set(banned_ip, true);
end
banned_ips:set("updated_at", ngx.now());
end
end
end

if banned_ips:get(ngx.var.remote_addr) then
ngx.log(ngx.WARN, "Banned IP detected and refused access: " .. ngx.var.remote_addr);
return ngx.exit(ngx.HTTP_FORBIDDEN);
end
';}

現在就可以阻止特定IP的訪問

1

ruby> $redis.sadd("banned_ips", "200.1.35.4")

Nginx進程每隔10秒從Redis獲取一次最新的禁止IP名單。需要注意的是,如果架構中使用了Haproxy這樣類似的負載均衡伺服器時, 需要把$remote_addr設置為正確的遠端IP地址。
這個方法還可以用於HTTP User-Agent欄位的檢查,要求滿足指定條件。
使用Nginx輸出CSRF(form_authenticity_token)
Mixlr大量使用頁面緩存,由此引入的一個問題是如何給每個頁面輸出會話級別的CSRF token。我們通過Nginx的子請求,從upstream web server 獲取token,然後利用Nginx的SSI(server-side include)功能輸出到頁面中。這樣既解決了CSRF攻擊問題,也保證了cache能被正常利用。
location /csrf_token_endpoint {
internal;

include /opt/nginx/conf/proxy.conf;
proxy_pass "http://upstream";}

location @dynamic {
ssi on;
set $csrf_token '';

rewrite_by_lua '
-- Using a subrequest, we our upstream servers for the CSRF token for this session:
local csrf_capture = ngx.location.capture("/csrf_token_endpoint");
if csrf_capture.status == 200 then
ngx.var.csrf_token = csrf_capture.body;

-- if this is a new session, ensure it sticks by passing through the new session_id
-- to both the subsequent upstream request, and the response:
if not ngx.var.cookie_session then
local match = ngx.re.match(csrf_capture.header["Set-Cookie"], "session=([a-zA-Z0-9_+=/+]+);");
if match then
ngx.req.set_header("Cookie", "session=" .. match[1]);
ngx.header["Set-Cookie"] = csrf_capture.header["Set-Cookie"];
end
end
else
ngx.log(ngx.WARN, "No CSRF token returned from upstream, ignoring.");
end
';

try_files /maintenance.html /rails_cache$uri @thin;}

CSRF token生成 app/metal/csrf_token_endpoint.rb:
class CsrfTokenEndpoint
def self.call(env)
if env["PATH_INFO"] =~ /^\/csrf_token_endpoint/
session = env["rack.session"] || {}

token = session[:_csrf_token]
if token.nil?
token = SecureRandom.base64(32)
session[:_csrf_token] = token
end

[ 200, { "Content-Type" => "text/plain" }, [ token ] ]
else
[404, {"Content-Type" => "text/html"}, ["Not Found"]]
end
endend

我們的模版文件示例:
<meta name="csrf-param" value="authenticity_token"/>
<meta name="csrf-token" value="<!--# echo var="csrf_token" default="" encoding="none" -->"/>
Again you could make use of lua_shared_dict to store in memory the CSRF token for a particular session. This minimises the number of trips made to /csrf_token_endpoint.

❸ Nginx是如何實現輕量級和高並發

源碼上,盡可能的使用html,靜態頁面去完成。 環境上,可以使用nginx+apache+php+mysql 組合。目前大型網站基本都是使用php語言去寫。 資料庫需要專業優化結果,做好欄位索引等 伺服器帶寬上,也需要非常高的要求。這個不是一下子都能說清楚的。...

❹ Web後台語言的選擇

‍‍

php不適合,推薦lua,用openresty,雖然都是高級語言,但lua可以跟nginx無縫結合,lua是跑在nginx進程中的,這樣就很有意思了。我寫了一個簡單的hello world,用ngx_lua跟php_fpm測試,lua每秒1萬次,php每秒55次。為什麼會如此懸殊?php通過php-fpm跟nginx實現業務功能,之間要通過網路;而lua是內嵌的,嵌入nginx內部,實現業務功能跟c語言掉個函數差不多。php每次執行都要編譯。lua只編譯一次,就駐內存中了。這個不僅僅是編譯的開銷,腳本文件本身從硬碟讀取就是耗時的操作。當然php有一些優化手段,但無論怎麼優化,都沒有隻載入一次速度快。php每次執行都是這個速度,而lua第一次執行稍慢,以後就快了。php是同步的,長時間的操作很容易耗盡連接數。lua是非同步的。php調用mysql,文件讀取等,用api調用,這個是同步操作。而lua是通過nginx的子請求實現的,而nginx本身是非同步的。不僅僅是mysql這些,業務本身的一些操作也可以分為幾個子請求完成。而nginx的子請求非常快,損耗忽略不計,業務代碼可以通過劃分子請求來實現業務耦合,降低耦合度有很多的幫助,每個子系統也相對簡單很多。php,東西多的話,尤其mvc需要有一種熟練的框架,CodeIgniter, Yii, Zend 等等。上手簡單,可以直接在頁面中通過echo之類的函數載入動態值,做個mvp之類的東西出活快社區強大,各種問題都有現成的解。node比較火,非同步很強大,語法和js一樣,但個人感覺其實易用性易讀性程度不如php。

‍‍

❺ lua 如何應用

作為一名程序員,相信大家在軟體架構圖上經常見到 「Nginx + Lua」 的字樣,但是對於Lua在Web應用中的作用並沒有多少了解。
該篇文章對 Lua 的語言特性、優勢等方面做介紹,並通過介紹一個天氣預報的 Web 應用,讓大家對 Lua 在Web應用中充當的角色有一個直觀的認識。
什麼是 Lua
Lua 是用標准C語言編寫的一種小巧的腳本語言,並以源代碼形式開放。Lua 並沒有提供強大的庫,所以我們很少單獨使用 Lua 去編寫程序,其設計目的是為了嵌入其他應用程序中,比如嵌入 Cocos2d-x 游戲引擎或 Nginx 伺服器,從而為應用程序提供靈活的擴展和定製功能。
Lua 的語言特性
Lua 的語法並不復雜,易於上手,而且網上已有大量的語法教程,所以該篇文章不再贅敘,這里介紹幾個 Lua 語言相對重要的語言特性。
協程並發
協程相對獨立,有自己的上下文,但是其切換由程序自己控制(線程的切換是由操作系統控制,這是協程與線程的重要區別)。
Lua 的協程通過擴展庫 coroutine 來實現,通過 create 函數創建一個協程,resume 函數以運行此協程,直到新協程調用 yield 函數,程序才能返回到「主協程」中運行。

❻ web伺服器有哪些

目前主流web伺服器有三個:apache、IIS、nginx。
其中apache是開源的老牌伺服器,多用於傳統業務,其優點是系統穩定,擴展模塊豐富,各種特性支持完整,並且跨平台。
IIS是微軟主力打造的web伺服器,目前作為Windows系統組件一部分,和微軟上層web開發(asp.net)應用介面緊密。
nginx是開源的後起之秀,是俄羅斯開發的一款用於高並發服務的web伺服器,主要應用於高並發網站、靜態伺服器、下載伺服器等,其優點是性能更高,支持負載均衡,反向代理。
國產web伺服器主要有:
Tengine:是淘寶開發團隊基於nginx修改的,優化了資源請求的web伺服器,其特點繼承nginx,並針對資源請求做了優化。
數蠶web伺服器:是數蠶科技基於c++的Linux下的web伺服器,主要用於靜態頁面和簡單的計算型服務網站。其特點是支持高並發,支持多進程,c++/c介面良好,支持直接基於C++模板開發。

❼ 如何在Ubuntu 16.04上使用Nginx的OpenResty Web框架

第1步 - 下載OpenResty的源代碼和依賴關系

在本節中,我們將從源代碼安裝OpenResty。

首先,從OpenResty網站的下載頁面找到最新的OpenResty源代碼版本。下載tarball,確保如果更改了版本號,請使用最新版本號。

wget https://openresty.org/download/openresty-1.11.2.2.tar.gz
下載PGP密鑰文件,以便我們可以驗證文件的內容。

wget https://openresty.org/download/openresty-1.11.2.2.tar.gz.asc
接下來,我們需要添加作者的公共密鑰,如下載頁面上所列。在撰寫本文時,這是公鑰A0E98066 。但是,請檢查它是否已更改;它被列在同一下載頁面上。

gpg --keyserver pgpkeys.mit.e --recv-key A0E98066

第2步 - 安裝OpenResty

我們將配置OpenResty與PCRE正則表達式和IPv6支持。我們還將通過提供-j2標志來並行化構建過程的一部分,這將告訴make 2個作業可以同時運行。此命令將主要測試所有依賴項是否可用於您的系統,並收集將由構建步驟稍後使用的信息。它也已經構建了一些依賴項,如LuaJIT。./configure -j2 --with-pcre-jit --with-ipv6
然後,您可以通過提供-j2並行度標志來構建OpenResty。這將編譯OpenResty本身。make -j2
最後,您可以安裝OpenResty。使用sudo確保所有文件可以復制到系統上的正確位置,以便OpenResty可以在運行時找到它們。sudo make install
您需要在防火牆中允許HTTP連接才能使Web伺服器正常工作。sudo ufw allow http
您也可以選擇允許HTTPS與sudo ufw allow https如果你要使用它。您可以通過檢查防火牆的狀態來驗證防火牆的更改。sudo ufw status
您應該看到顯示的輸出中允許HTTP流量(埠80 ),以及如果您添加它的HTTPS(埠443 )。

您現在可以檢查安裝是否有效。首先,啟動OpenResty。sudo /usr/local/openresty/bin/openresty
如果命令成功,它將立即完成而不輸出文本。在這種情況下,您可以在瀏覽器中訪問http:// your_server_ip 。 你會看到一個頁面,說歡迎來到OpenResty!確認它已完全安裝和工作。

您現在可以停止OpenResty伺服器。sudo /usr/local/openresty/bin/openresty -s quit
OpenResty已安裝,但您仍需要配置OpenResty在啟動時運行,所以伺服器不必手動啟動。

第3步 - 將OpenResty設置為服務

在這里,我們將OpenResty設置為一個服務,所以它在啟動時自動啟動。我們將使用systemd init服務。 您可以閱讀此systemd基礎教程了解更多信息,以及本單元文件教程 ,了解單元文件的具體信息。

首先使用nano或您喜歡的文本編輯器創建一個新的systemd文件。sudo nano /etc/systemd/system/openresty.service
對於本教程,我們將從全新安裝中復制默認的Nginx systemd文件,並針對OpenResty進行修改。

第4步 - 配置OpenResty

要配置OpenResty,我們使用默認的Nginx配置作為參考,以便它大部分匹配你可能會熟悉的。 首先,再次打開OpenResty配置文件: sudo nano /usr/local/openresty/nginx/conf/nginx.conf
這一次,我們將修改http塊並將此http塊中的server塊移動到一個新文件以具有更好的結構。 首先,找到http {行,並刪除之後的一切,除了最後一行與對應的} 。

當前/usr/local/openresty/nginx/conf/nginx.conf

user www-data;worker_processes auto;pid /run/openresty.pid;events {
worker_connections 1024;}http {
include mime.types;
default_type application/octet-stream;

. . .}
然後,將以下內容復制到http塊中,以便整個文件看起來像這樣。我們將一次過一個更改。

/usr/local/openresty/nginx/conf/nginx.conf

user www-data;worker_processes auto;pid /run/openresty.pid;events {
worker_connections 1024;}http {
include mime.types;
default_type application/octet-stream;

sendfile on;
tcp_nopush on;
tcp_nodelay on;

keepalive_timeout 65;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;

access_log /var/log/openresty/access.log;
error_log /var/log/openresty/error.log;

gzip on;
gzip_disable "msie6";

include ../sites/*;
}
保存並關閉文件。 我們對默認文件所做的更改是:

  • 取消tcp_nopush on; ,它告訴OpenResty只發送完整的數據包。 當使用sendfile選項時,此選項很有用,這將允許OpenResty優化將靜態文件發送到客戶端。

  • 添加tcp_nodelay on; 。 此選項將嘗試盡快發送數據包,這可能看起來與上述選項相反,但它在不同的時間使用。 tcp_nodelay僅在對HTTP請求使用keepalive選項時使用,這是通過Web瀏覽器連接到Web伺服器,這將避免每次請求時啟動HTTP連接的開銷。

  • 添加和修改ssl_protocols和ssl_prefer_server_ciphers行。這些選項配置OpenResty的SSL選項。我們刪除了易受已知的HTTPS攻擊的舊協議,例如POODLE攻擊。

  • 添加access_log和error_log行,它們配置Web伺服器的日誌位置。 我們將日誌存儲在上一步中創建的/var/log/openresty目錄中。

  • 取消注釋gzip on並添加gzip_disable "msie6" 。這些選項將配置GZIP,這將壓縮網頁,以便有更少的數據傳輸。我們還添加了最後一個選項,因為Internet Explorer 6(及更早版本)並不總是正確處理GZIP內容。

  • 添加include ../sites/*; ,它告訴OpenResty在/usr/local/openresty/nginx/sites目錄中查找額外的配置文件,稍後我們將創建它。

  • 刪除所有server塊,我們將在此步驟中稍後重新定位到新文件。

  • 接下來,創建我們在include行中指定的新sites目錄。 sudo mkdir /usr/local/openresty/nginx/sites

  • 創建default網站。 sudo nano /usr/local/openresty/nginx/sites/default.conf

  • 在此新文件中添加以下內容。這是從nginx.conf重新定位原始伺服器塊,但有更多細節的內聯注釋。
  • /usr/local/openresty/nginx/sites/default.conf

  • server {

  • # Listen on port 80.

  • listen 80 default_server;

  • listen [::]:80 default_server;


  • # The document root.

  • root /usr/local/openresty/nginx/html/default;


  • # Add index.php if you are using PHP.

  • index index.html index.htm;


  • # The server name, which isn't relevant in this case, because we only have one.

  • server_name _;


  • # When we try to access this site...

  • location / {

  • # ... first attempt to serve request as file, then as a directory,

  • # then fall back to displaying a 404.

  • try_files $uri $uri/ =404;

  • }


  • # Redirect server error pages to the static page /50x.html.

  • error_page 500 502 503 504 /50x.html;

  • location = /50x.html {

  • root /usr/local/openresty/nginx/html;

  • }}

  • 保存並關閉文件。 現在,為此網站創建一個新目錄。 sudo mkdir /usr/local/openresty/nginx/html/default

  • 然後將原始index.html從其原始位置移動到新目錄。 sudo mv /usr/local/openresty/nginx/html/index.html /usr/local/openresty/nginx/html/default

  • 最後,重新啟動OpenResty以使用此新站點。 sudo systemctl restart openresty

  • 您現在可以再次訪問http:// your_server_ip ,並查看與之前相同的網頁。 現在OpenResty是完全配置的,我們可以嘗試一些由OpenResty介紹的,在Nginx默認情況下不可用的功能。
  • 第5步 - 使用OpenResty Lua模塊

  • 在本節中,我們將看看OpenResty添加的不同模塊的組合,這些模塊都存在以適應Lua腳本。我們將在整個步驟中/usr/local/openresty/nginx/sites/default.conf /usr/local/openresty/nginx/sites/default.conf,因此首先打開它。 sudo nano /usr/local/openresty/nginx/sites/default.conf

  • 首先,我們將看一下content_by_lua_block配置選項。 從下面的示例配置中復制location塊,並將其添加到server塊中,位於兩個現有location塊下面。
  • /usr/local/openresty/nginx/sites/default.conf content_by_lua_block示例

  • server {

  • . . .


  • location /example {

  • default_type 'text/plain';


  • content_by_lua_block {

  • ngx.say('Hello, Sammy!')

  • }

  • }}

  • 保存並關閉文件,然後重新載入配置。 sudo systemctl reload openresty

  • 如果您http:// your_server_ip /example訪問http:// your_server_ip /example ,您會看到一個http:// your_server_ip /example 您好,Sammy的頁面! 。讓我們解釋這是如何工作的。 content_by_lua_block配置指令執行其中的所有內容作為Lua代碼。 在這里,我們使用Lua函數ngx.say來列印消息Hello,Sammy!到頁面。 對於另一個示例,將location /example塊的內容替換為:
  • /usr/local/openresty/nginx/sites/default.conf content_by_lua_file示例

  • server {

  • . . .


  • location /example {

  • default_type 'text/plain';


  • content_by_lua_file /usr/local/openresty/nginx/html/default/index.lua;

  • }}

  • content_by_lua_file從外部文件載入Lua內容,所以讓我們創建上面指定的內容: /usr/local/openresty/nginx/html/default/index.lua 。 sudo nano /usr/local/openresty/nginx/html/default/index.lua

  • 將以下內容添加到文件,然後保存並將其關閉。
  • /usr/local/openresty/nginx/html/default/index.lua

  • local name = ngx.var.arg_name or "Anonymous"ngx.say("Hello, ", name, "!")

  • 這是一個簡單的Lua,它讀取URL中的查詢參數, name並自定義問候消息。如果沒有傳遞參數,則使用「匿名」。 再次重新載入配置。 sudo systemctl reload openresty

  • 現在,在瀏覽器中訪問http:// your_server_ip /example?name= Sammy 。 這將顯示你好,Sammy! 。 您可以更改name查詢參數,或完全忽略它。 Hello, Sammy!

  • 您還可以更改name查詢參數以顯示任何其他名稱。 警告:請勿將您要載入的Lua文件從Web訪問到的位置。如果這樣做,如果有人訪問此文件,則可能會包含應用程序代碼。將文件放在文檔根目錄之外,例如,將文檔根目錄更改為/usr/local/openresty/nginx/html/default/public ,並將Lua文件放在其上一個目錄。

如何配置lua的WEB運行環境

有兩種方式,一種是apache2.3以上會內置的lua mole,大家可以下載apache httpd 2.3.8的代碼,在moles目錄下有lua這個目錄。
另外一種是今天要介紹的,使用wsapi方式。
我們使用ubuntu伺服器,先確保lua5.14以及apache2都安裝成功。
然後
sudo apt-get install apache2-mpm-worker liblua5.1-0-dev luarocks
sudo apt-get install libfcgi-dev libapache2-mod-fcgid
sudo luarocks install wsapi-fcgi
然後修改.htaccess或者httpd.conf或者你的vhost配置,添加下面部分。
Options ExecCGI
AddHandler fcgid-script .lua
FCGIWrapper /usr/local/lib/luarocks/bin/wsapi.fcgi .lua
要注意的是wsapi.fcgi也許是在不同目錄下,用find自己找吧。
在var/www下你的站點中新建一個luacgi目錄,然後建立兩個文件。
launcher.fcgi:
#!/usr/bin/env lua
require "wsapi.fastcgi"
require "hello"
wsapi.fastcgi.run(hello.run)
index.lua:
mole(…, package.seeall)
function run(wsapi_env)
local headers = { ["Content-type"] = "text/html" }
local function hello_text()
coroutine.yield("<html><body>")
coroutine.yield("<p>Hello Wsapi!</p>")
coroutine.yield("<p>PATH_INFO: " .. wsapi_env.PATH_INFO .. "</p>")
coroutine.yield("<p>SCRIPT_NAME: " .. wsapi_env.SCRIPT_NAME .. "</p>")
coroutine.yield("</body></html>")
end
return 200, headers, coroutine.wrap(hello_text)
end
然後用chown –R www-data:www-data luacgi修改目錄owner。
這時候應該就能用xxx.com/luacgi/index.lua訪問了。
如果你用nginx,也有現成的lua mod可以使用(作者是淘寶的程序員),這里就不多說了。