http訪問模塊
❶ node.js的http模塊如何使用
安裝好node後,自帶了http模塊,可以直接使用
-----------
var http = require('http');
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World\n');
}).listen(3000, '127.0.0.1');
❷ HTTP之多路處理模塊MPM
MPM,是 Multi-Processing Moles 的縮寫,就是多處理模塊的意思,它是在 Apache 2.0 中引入的一個概念,引入目標是將 Apache 的結構能夠模塊化,把核心的任務處理作為一個可插拔的模塊來運行,這樣就容易根據不同的環境和應用來更有效的優化 Apache 的運行,他是 Apache 2.X 中最影響其性能的,最核心的特徵,因為直接決定了 Apache 的工作方式,這里有一個問題是:它究竟怎麼樣影響了 Apache。
可以這么說:它決定了 Apache 以怎麼樣的方式接入外部請求。Apache內部怎麼樣處理這個請求過程,這當然是最核心的。比如它可以決定在處理外部請求的時候,需不需要啟動多線程,如果是用多線程,最多可以多少個線程,一個進程可以產生最多多少個線程,類似於這種配置,都來自於MPM。MPM有一些指令可以專門用於調節父進程如何產生子進程,主要是StartServers,MinSpareServers,MaxClients 等,下面會介紹這些指令是什麼意思。
prefork 控制進程在最初建立 「StartServers」 這個子進程後,為了滿足MinSpareServers 設置的需要創建一個進程,等待一秒鍾,繼續創建兩個,在等待一秒鍾,繼續創建四個····如此按指數級增加創建的進程數,最多達到每秒32個,直到滿足 MinSpareServers 設置的值為止,這種模式可以不必在請求到來時再產生新的進程,從而減少了系統開銷以增加性能。 MaxSpareServers 設置了最大的空閑進程數,如果空閑進程數大於這個值,Apache 會自動 kill 掉一些多餘進程。這個值不要設置得過大,但如果設的值比 MinSpareServers 小, Apache 會自動把其調整為 MinSpareServers+1,如果站點負載較大,可考慮同時加大 MinSpareServers 和 MaxSpareServers。
MaxRequestsPerChild 設置的是每個子進程可處理的請求數,每個子進程在處理了 「MaxRequestsPerChild」 個請求後將自動銷毀。 0 意味著無限,即子進程永不銷毀。雖然預設設為 0 可以使每個子進程處理更多請求,但如果設為非 0 值也有兩點重要的好處:1、可防止意外的內存泄露。2、在伺服器負載下降的時候會自動減少子進程數。因此,可根據伺服器的負載來調整這個值。
MaxRequestWorkers 指令集同時將服務請求的數量上的限制。任何連接嘗試在 MaxRequestWorkerslimit 將通常被排隊,最多若干基於上 ListenBacklog 指令,在 Apache 2.3.13 以前的版本 MaxRequestWorkers 被被稱為 MaxClients。
MaxRequestWorkers 是這些指令中最為重要的一個,設定的是 Apache 可以同時處理的請求,是對 Apache 性能影響最大的參數。其預設值 150 是遠遠不夠的,如果請求總數已達到這個值(可通過ps -ef|grep http|wc -l 來確認),那麼後面的請求就要排隊,直到某個已請求處理完畢。這就是系統資源還剩下很多而 HTTP 訪問卻很慢的主要原因。雖然理論上這個值越大,可以處理的請求就越多,但 Apache 默認的限制不能大於256。
Prefork 實現了一個非線程型的、預派生的 web 伺服器,它的工作方式類似於 Apache 1.3。它合適於沒有線程安全庫,需要避免線程兼容性問題的系統。它是要求將每個請求相互獨立的情況下最好的MPM,這樣若一個請求出現問題就不會影響到其他請求。
Worker 由主控制進程生成 「StartServers」 個子進程,每個子進程中包含固定的 ThreadsPerChild 線程數,各個線程獨立地處理請求。同樣,為了不在請求到來時再生成線程, MinSpareThreads 和 MaxSpareThreads 設置了最少和最多的空閑線程數;
而 MaxRequestWorkers 設置了同時連入的 clients 最大總數,如果現有子進程中的線程總數不能滿足負載,控制進程將派生新的子進程。例如: 5 StartServers x 25 ThreadsPerChild = 125 MaxRequestWorkers。
ThreadsPerChild 是 worker MPM 中與性能相關最密切的指令。ThreadsPerChild 的最大預設值是 64,如果負載較大,64 也是不夠的。這時要顯式使用 ThreadLimit 指令,它的最大預設值是20000。
Worker 模式下所能同時處理的請求總數是由子進程(StartServers)乘以 ThreadsPerChild 值決定的,應該大於等於 MaxRequestWorkers。如果負載很大,現有的子進程數不能滿足時,控制進程會派生新的子進程。默認最大的子進程總數是 16,加大時也需要顯式聲明 ServerLimit(最大值是2000)。需要注意的是,如果顯式聲明了 ServerLimit,那麼它乘以 ThreadsPerChild 的值必須大於等於 MaxRequestWorkers,而且 MaxRequestWorkers 必須是 ThreadsPerChild的整倍數,否則 Apache 將會自動調節到一個相應值。
Worker使網路伺服器支持混合的多線程多進程。由於使用線程來處理請求,所以可以處理海量請求,而系統資源的開銷小於基於進程的 MPM。但是,它也使用了多線程,每個進程又有多個線程,以獲得基於進程的 MPM 的穩定性。
每個進程可以擁有的線程數量是固定的。伺服器會根據負載情況增加或減少進程數量。一個單獨的控制進程(父進程)負責子進程的建立。每個子進程可以建立 ThreadsPerChild 數量的服務線程和一個監聽線程,該監聽線程監聽接入請求並將其傳遞給服務線程處理和應答。
以上兩種穩定的MPM方式在非常繁忙的伺服器應用下都有些不足。盡管 HTTP 的 Keepalive 方式能減少 TCP 連接數量和網路負載,但是 Keepalive 需要和服務進程或者線程綁定,這就導致一個繁忙的伺服器會耗光所有的線程。 Event MPM 是解決這個問題的一種新模型,它把服務進程從連接中分離出來。在伺服器處理速度很快,同時具有非常高的點擊率時,可用的線程數量就是關鍵的資源限制,此時 Event MPM 方式是最有效的。一個以 Worker MPM 方式工作的繁忙伺服器能夠承受每秒好幾萬次的訪問量(例如在大型新聞服務站點的高峰期時),而Event MPM 可以用來處理更高負載,值得注意的是, Event MPM 不能在安全HTTP(HTTPS)訪問下工作。
❸ Express框架:內置模塊之HTTP模塊(HTTP協議部分)
網路是用於信息的傳輸與接收,共享的虛擬平台,通過它把各個點,面到網的信息都聯繫到一起,從而實現這些資源的共享
網路傳輸數據具有一定的規則,這些規則被稱為協議,HTTP就是規則中的一種,而且是使用最為頻繁的一種協議
HTTP協議是網路協議的一種,超文本傳輸協議的簡寫
超文本傳輸協議傳輸的內容就是超文本的標記語言(文字,圖片,視頻,音頻)它是TCP/IP協議之上的一個應用層協議,用於定義Web瀏覽器與Web伺服器之間的交換數據的過程以及數據本身的格式
HTTP協議是一種單純的網路傳輸協議,採用的是請求/應答的方式傳遞數據,一次請求對應一次應答(響應)
HTTP協議的約束
所謂三次握手,就是指在一個TCP連接時,需要客戶端和伺服器發送三個包,主要的目的是連接伺服器指定的埠去建立TCP連接,並同步連接雙方的序列號和確認號並交換TCP窗口大小信息
客戶端和伺服器的傳輸過程,一般是無狀態的傳輸方式,無狀態的傳輸指的是你第一次去向伺服器發送請求,伺服器並不會記住這次請求。
TCP三次握手原理
http協議規定的伺服器響應數據時的狀態編碼,就是狀態碼
1開頭的
表示普通消息
2開頭的
3開頭的
4開頭的
5開頭的
第一步:檢查瀏覽器緩存中是否緩存過該域名對應的IP地址
第二步:第二步:如果在瀏覽器緩存中沒有找到IP,那麼將繼續查找本機系統是否緩存過IP
解析過程
text/html;charset=utf-8
字元串編碼,node默認的字體編碼是utf-8,瀏覽器的編碼,默認是系統編碼,簡體中文編碼,就是GBK編碼,因此會出現亂碼現象。
值是數字,位元組的長度,一般不會設置,返回的內容就是個單純的值
可以通過這個響應頭解決跨域問題,設置為 * 號即可
HTTP中使用MIME類型代表文件的類型,伺服器具體返回各種數據的能力,但是返回數據時,應該告訴瀏覽器返回的是一個什麼類型的文件
MIME類型:文件類型的表述
❹ 07《Nginx 入門教程》Nginx 的 Http 模塊介紹(上)
本部分內容將詳細介紹 Nginx 中對 Http請求的 11 個處理階段,分成 3 個小節講解並進行相關實驗操作。
Nginx 將一個 Http 請求分成多個階段,以模塊為單位進行處理。其將 Http請求的處理過程分成了 11 個階段,各個階段可以包含任意多個 Http 的模塊並以流水線的方式處理請求。這 11 個 Http 階段如下所示:
網上有人做了一個非常形象的圖片,如下圖所示。我們可以看到 11 個階段的處理順序,以及每個階段中涉及到的相關模塊以及模塊之間的順序。
POST_READ 階段是 Nginx 接收到 Http 請求完整頭部後的處理階段,這里主要使用的是 realip 模塊獲取用戶的真實地址,方便後續對該 IP 進行限速或者過濾其請求等。
SERVER_REWRITE 和後面的 REWRITE 階段一般是使用 rewrite 模塊修改 Http請求的 uri,實現請求的控制。
FIND_CONFIG 階段只是做 location 的匹配項。
PREACCESS、ACCESS 和 POST_ACCESS 是和 Http 請求訪問許可權相關的階段。PREACCESS 階段是在連接之前要做的訪問控制, 這個階段有 limit_conn 和 limit_req 等模塊工作。ACCESS 階段是解決用戶能不能訪問,比如根據用戶名、密碼限制用戶訪問(auth_basic 模塊)、根據 ip 限制用戶訪問(access 模塊)以及第三方模塊認證限制用戶的訪問(auth_request模塊)。POST_ACCESS 是在 ACCESS 之後要做的一些工作。
TRY_FILES 階段為訪問靜態文件資源而設置的。有時候又稱之為 PRECONTENT 階段,即在 CONTENT 階段之前做的事情。主要是 try_files 模塊在此階段工作。
最重要的 CONTENT 是處理 Http 請求內容的階段,大部分 HTTP 模塊介入這個階段,比如 index、autoindex、concat 以及反向代理的模塊都是在這里生效的。
LOG 是處理完請求後的日誌記錄階段,如 access_log 模塊。
realip 模塊是在 postread 階段生效的,它的作用是: 當本機的 nginx 處於一個反向代理的後端時獲取到真實的用戶 ip。 如果沒有 realip 模塊,Nginx 中的 $remote_addr 可能就不是客戶端的真實 ip 了,而是代理主機的 ip。
realip模塊的配置實例如下:
set_real_ip_from 是指定我們信任的後端代理伺服器,real_ip_header 是告訴 nginx 真正的用戶 ip 是存在 X-Forwarded-For 請求頭中的。
當 real_ip_recursive 設置為 off 時,nginx 會把 real_ip_header 指定的 Http頭中的最後一個 ip 當成真實 ip;
而當 real_ip_recursive 為 on 時,nginx 會把 real_ip_header 指定的 Http頭中的最後一個不是信任伺服器的 ip (前面設置的set_real_ip_from)當成真實 ip。通過這樣的手段,最後拿到用戶的真實 ip。
rewrite 模塊可以看到它在 SERVER_REWRITE 和 REWRITE 階段都有介入。rewrite 模塊的主要功能是改寫請求的 uri。它是 Nginx 默認安裝的模塊。rewrite 模塊會根據正則匹配重寫 uri,然後發起內部跳轉再匹配 location, 或者直接做30x重定向返回客戶端。rewrite 模塊的指令有 break, if, return, rewrite, set 等,這些都是我們常用到的。
return 指令返回後,Http 請求將在 return 的階段終止,後續階段將無法進行,所以許多模塊得不到執行。
1、將 regex 指定的 url 替換成 replacement 這個新的 url,可以使用正則表達式及變數提取。
2、當 replacement 以 http:// 或者 https:// 或者 $schema 開頭,則直接返回 302 重定向
3、替換後的 url 根據 flag 指定的方式進行處理
if 指令的條件表達式:
location 匹配是在 FIND_CONFIG 階段進行的,我們需要掌握 location 的匹配規則和匹配順序。
有一個簡單總結如下:
即:
realip 模塊默認沒有被編譯進 Nginx 的,我們需要在源碼編譯階段使用–with-http_realip_mole,將 realip 模塊編譯進來後方可使用。接下來,我們做個簡單測試,首先准備一個 server 塊如下:
首先,我們將 real_ip_recursive 設置為 off,然後做一次請求:
這里返回的是頭部參數 X-Forwarded-For 中最後一個 ip,如果將 real_ip_recursive 設置為 on,此時,由於 set_real_ip_from 中設置218.19.206.164為信任的方向代理 ip,那麼 Nginx 會往前找一位,認為 1.1.1.1 是用戶的真實ip。
我們寫一個簡單配置如下:
先測試if指令,當請求方法為 POST 時,我們能得到 『post request!』 這樣的字元串輸出。GET 請求時候,針對 404 情況,會跳轉到/403.html,我們准備一個 403.html 頁面,裡面寫上』403, forbidden!』 這一行內容,開始下面的 Http 請求:
如果我們打開 return 405 這行指令,則 error_page 將不會生效,連同後面的 location 匹配也不會生效。無論我們發送如何請求,都會返回405的錯誤信息。這是因為 server 中的 return 指令是在 SERVER_REWRITE中執行的,而 location 匹配則是在下一個階段 FIND_CONFIG 中執行的,所以上一個階段在 return 後,根本不會進入後面的階段執行。
首先,我們准備環境,首先是新建一個目錄 third(全路徑為/root/test/third),再該目錄下新建一個文件 3.txt, 裡面只有一行內容 『hello, world』。接下來,我們准備一個 server 塊,加到 Http 指令塊中:
上述配置中,要打開 rewrite_log指令,這樣我們可以看到 rewrite 指令的相應日誌,方便查看結果。
當我們在 /second 配置中,使用 break 時,請求命令:
如果是不使用 break 標識,則請求結果如下:
首先是 /first/3.txt 請求在 /first 中匹配,並被替換為 /second/3.txt, last 標識表示將繼續進行匹配,在 /second 中,uri 又被 rewrite 成 /third/3.txt, 如果後面跟了 break 標識,表示 rewrite 到此結束,不會執行後面的 return 指令,直接請求靜態資源 /third/3.txt,得到其內容』hello, world』;如果是沒有 break 標識,則會在執行 return 指令後直接返回,並不會繼續執行下去,最後返回』second!'字元串。
我們按照這樣的 location 規則,進行匹配實驗,結果如下:
這里介紹了 Nginx 處理 Http 請求的 11 個階段,並重點介紹了 前三個階段POST_READ、REWRITE以及FIND_CONFIG以及這些階段中涉及到的模塊和指令。前面講到的指令都是 Nginx 中的高頻指令,必須要熟練掌握。
❺ http模塊與http程序處理程序有什麼區別具體點
ASP.NET HTTP 處理程序是響應對 ASP.NET Web 應用程序的請求而運行的過程(通常稱為「終結點」)。最常用的處理程序是處理 .aspx 文件的 ASP.NET 頁處理程序。用戶請求 .aspx 文件時,頁通過頁處理程序來處理請求。您可以創建自己的 HTTP 處理程序將自定義輸出呈現給瀏覽器。
HTTP 模塊是一個在每次針對應用程序發出請求時調用的程序集。HTTP 模塊作為 ASP.NET 請求管道的一部分調用,它們能夠在整個請求過程中訪問生命周期事件。HTTP 模塊使您可以檢查傳入和傳出的請求並根據該請求進行操作。
自定義 HTTP 處理程序通常具有以下用途:
RSS 源 若要為網站創建 RSS 源,可以創建一個可發出 RSS 格式 XML 的處理程序。 然後可以將文件擴展名(如 .rss)綁定到此自定義處理程序。當用戶向站點發送以 .rss 結尾的請求時,ASP.NET 將調用您的處理程序來處理請求。
圖像伺服器 如果希望 Web 應用程序能夠提供不同大小的圖像,可以編寫一個自定義處理程序來調整圖像大小,然後將調整後的圖像作為處理程序的響應發送給用戶。
HTTP 模塊通常具有以下用途:
安全 因為您可以檢查傳入的請求,所以 HTTP 模塊可以在調用請求頁、XML Web services 或處理程序之前執行自定義的身份驗證或其他安全檢查。 在以集成模式運行的 Internet 信息服務 (IIS) 7.0 中,可以將 Forms 身份驗證擴展到應用程序中的所有內容類型。
統計信息和日誌記錄 因為 HTTP 模塊是在每次請求時調用的,所以,您可以將請求統計信息和日誌信息收集到一個集中的模塊中,而不是收集到各頁中。
自定義的頁眉或頁腳 因為您可以修改傳出響應,所以可以在每一個頁面或 XML Web services 響應中插入內容,如自定義的標頭信息。
ASP.NET 頁處理程序僅僅是一種類型的處理程序。ASP.NET 包括其他幾種內置的處理程序,例如.asmx .aspx處理程序。比如,你可以為.rar類型的文件或.jpg的文件或.txt設置不同的處理程序.是下載,是打開還是處理里邊的數據就由你自己決定了
HTTP 模塊是一個在每次針對應用程序發出請求時調用的程序集。ASP.NET HTTP模塊針對所有請求調用,可以檢查傳入的請求並根據該請求進行操作。它們還使您可以檢查傳出的響應並修改它。
❻ HTTP緩存與header模塊
HTTP緩存分為緩存控制和緩存校驗,緩存控制有Cache-Control和Pragma
Pragma是舊產物,已經逐步拋棄,有些網站為了向下兼容還保留了這兩個欄位。如果一個報文中同時出現Pragma和Cache-Control時,以Pragma為准。同時出現Cache-Control和Expires時,以Cache-Control為准。即優先順序從高到低是 Pragma -> Cache-Control -> Expires
如果在請求header有如下參數
則Pragma的優先順序更高
Cache-Control一般值為
緩存校驗有Last-Modified和ETag
如果請求Cache-Control值為max-age=0,表示客戶端要去服務端做資源校驗,校驗通過會發生304,使用本地緩存的資源,校驗不通過的話,服務端將數據返回給客戶端
服務端在響應時候會有響應頭Last-Modified,這是一個格林威治時間,表示資源最後的修改時間
客戶端在刷新頁面時候,會發一個請求頭If-Modified-Since,表示收到的上一次服務端給的Last-Modified
當服務端會對比自己的Last-Modifed和客戶端的If-Modified-Since,如果
If-Modified-Since >= Last-Modifed
那麼服務端會直接響應304,響應body體長度為0,以下為一個304響應的nginx-access日誌
但是Last-Modifed無法解決資源在一秒內連續修改的問題,一秒內連續修改後,客戶端只會更新一次
更好的解決方法是ETag,伺服器會響應一個根據資源算出來的字元,如
第二次客戶端請求時候會攜帶If-None-Match請求頭
如果
If-None-Match == ETag
表示資源沒有修改,服務端響應304
如果同時有ETag和Last-Modify,則ETag的優先順序會更高
但是ETag也有問題,如果服務端是多節點集群,那麼有可能A節點算出來的ETag和B節點的ETag可能不同,造成無法正常304響應,在nginx中可以關閉ETag
200狀態碼會發生於瀏覽器第一次載入頁面、強制刷新、304校驗失敗、資源緩存過期、瀏覽器禁用緩存情況
如果是瀏覽器第一次載入,那麼請求頭不會有 Cache-Control 、 If-None-Match 、 If-Modified-Since
服務端正常響應200,正常將數據傳給客戶端
如果是強制刷新,那麼瀏覽器會強制加請求頭
表示需要服務端響應真實數據,不用做校驗
如果瀏覽器禁用了緩存Disable Cache,那麼也會強制加請求頭no-cache
304狀態碼會發生於刷新頁面情況
刷新情況瀏覽器會強制加請求頭
表示需要瀏覽器校驗,校驗成功就是304,校驗失敗就是200
發生過程
由於訪問靜態資源,服務端通常都會響應Cache-Control:max-age,表示需要客戶端緩存這個靜態資源多長時間,如
同一個瀏覽器新窗口再次訪問會發生from disk cache
from disk cache情況服務端不會收到請求
響應碼為 200 , 201 , 206 , 301 , 302 , 303 , 307 , 308 情況下會發這個響應頭
參數可以是正數或者負數,如果為負,則發送的頭為
可以配置max,這樣響應的就是,可以認為是永久緩存
off參數可以禁用添加或者修改expire和Cache-Control響應
響應碼為200、201、204、206、301、302、303、304、307、308則添加指定的響應頭
如果當前級別沒有add_header,則從上一個級別繼承,僅僅當前級別沒有的話
如果定義了always,則不管響應碼為多少都添加header