Ngnix如何處理http請求

来源:https://www.cnblogs.com/ufto/archive/2020/04/08/12636436.html
-Advertisement-
Play Games

一, 基於名稱的虛擬伺服器nginx首先確定哪個伺服器應處理該請求。讓我們從一個簡單的配置開始,其中所有三個虛擬伺服器都在埠*:80上偵聽: server { listen 80; server_name example.org www.example.org; ... } server { li ...




一, 基於名稱的虛擬伺服器

nginx首先確定哪個伺服器應處理該請求。讓我們從一個簡單的配置開始,其中所有三個虛擬伺服器都在埠*:80上偵聽:

    server {
        listen 80;
        server_name example.org www.example.org;
        ...
    }

    server {
        listen 80;
        server_name example.net www.example.net;
        ...
    }

    server {
        listen 80;
        server_name example.com www.example.com;
        ...
    }

在此配置中,nginx僅測試請求的header欄位“host”以確定應將請求路由到哪個伺服器。如果其值與任何伺服器名稱都不匹配,或者請求根本不包含此header欄位,則nginx會將請求路由到該埠的預設伺服器。在上面的配置中,預設伺服器是第一個伺服器-這是nginx的標準預設行為。還可以使用listen指令中的default_server參數來顯式設置哪個伺服器應為預設伺服器:

    server {
        listen 80 default_server;
        server_name example.net www.example.net;
        ...
    }

    自0.8.21版以後的版本,default_server參數已可用。在早期版本中,應改用預設參數。

請註意,預設伺服器是偵聽埠的屬性,而不是伺服器名稱的屬性。稍後再詳細介紹。


二, 如何阻止使用未定義的伺服器名稱的http請求

如果不允許不帶“主機”header欄位的請求,則可以定義僅丟棄請求的伺服器:

    server {
        listen 80
        server_name ””;
        return 444;
    }

在這裡,伺服器名稱設置為空字元串,該字元串將與沒有“ Host”header欄位的請求進行匹配,並返回特殊的nginx的非標準代碼444,以關閉連接。

    從版本0.8.48開始,這是伺服器名稱的預設設置,因此可以省略server_name“”。在早期版本中,電腦的主機名用作預設伺服器名。


三, 基於名稱和IP地址混合的虛擬伺服器

讓我們看一個更複雜的配置,其中一些虛擬伺服器偵聽不同的地址:

    server {
        listen 192.168.1.1:80;
        server_name example.org www.example.org;
        ...
    }

    server {
        listen 192.168.1.1:80;
        server_name example.net www.example.net;
        ...
    }

    server {
        listen 192.168.1.2:80;
        server_name example.com www.example.com;
        ...
    }

在這種配置中,nginx首先根據伺服器塊的偵聽指令測試請求的IP地址和埠。然後,它根據與IP地址和埠匹配的伺服器塊的server_name條目測試請求的“主機”header欄位。如果找不到伺服器名稱,則預設伺服器將處理該請求。例如,在192.168.1.1:80埠上收到的對www.example.com的請求將由192.168.1.1:80埠的預設伺服器(即第一臺伺服器)處理,因為沒有www.example.com為此埠定義。

如前所述,預設伺服器是偵聽埠的屬性,並且可以為不同的埠定義不同的預設伺服器:

    server {
        listen 192.168.1.1:80;
        server_name example.org www.example.org;
        ...
    }

    server {
        listen 192.168.1.1:80 default_server;
        server_name example.net www.example.net;
        ...
    }

    server {
        listen 192.168.1.2:80 default_server;
        server_name example.com www.example.com;
        ...
    }

四, 一個簡單的PHP站點配置

現在,讓我們看看nginx如何選擇一個位置來處理典型的簡單PHP網站的請求:

    server {
        listen 80
        server_name example.org www.example.org;
        root       /data/www;

        location / {
            index index.html index.php;
        }

        location ~* \。(gif | jpg | png)$ {
            expires 30d;
        }

        location ~\ .php $ {
            fastcgi_pass  localhost:9000;
            fastcgi_param SCRIPT_FILENAME
                          $ document_root $ fastcgi_script_name;
            include       fastcgi_params;
        }
    }
    
無論列出的順序如何,nginx首先搜索文字字元串給定的最特定的首碼位置。在上面的配置中,唯一的首碼位置是“/”,並且由於它匹配任何請求,因此將被用作最後的手段。然後,nginx按照配置文件中列出的順序檢查由正則表達式指定的位置。第一個匹配的表達式將停止搜索,nginx將使用此位置。如果沒有正則表達式與請求匹配,則nginx使用較早發現的最特定的首碼位置。

請註意,所有類型的位置僅測試沒有參數的請求行的URI部分。這樣做是因為查詢字元串中的參數可以通過幾種方式給出,例如:

    /index.php?user=john&page=1
    /index.php?page=1&user=john

此外,任何人都可以在查詢字元串中請求任何內容:

    /index.php?page=1&something+else&user=john

現在,讓我們看一下在以上配置中如何處理請求:

    請求“/logo.gif”, 首先與首碼位置“/”匹配,然後與正則表達式“\.(gif | jpg | png)$”匹配,因此由後一個位置處理。使用指令“root /data/www”將請求映射到文件/data/www/logo.gif,然後將文件發送給客戶端。
    請求“/index.php”, 也首先與首碼位置“/”匹配,然後與正則表達式“\.(php)$”匹配。因此,它由後一個位置處理,並將請求傳遞到在localhost:9000上偵聽的FastCGI伺服器。 fastcgi_param指令將FastCGI參數SCRIPT_FILENAME設置為“ /data/www/index.php”,然後FastCGI伺服器執行該文件。變數$document_root等於root指令的值,變數$fastcgi_script_name等於請求URI,即“/index.php”。
    請求“/about.html”僅與首碼位置“/”匹配,因此在該位置進行處理。使用指令“root /data/www”將請求映射到文件/data/www/about.html,然後將文件發送給客戶端。
    處理請求“/”更為複雜。它僅與首碼位置“/”匹配,因此由該位置處理。然後,index指令根據其參數和“root /data/www”指令對索引文件的存在進行測試。如果文件/data/www/index.html不存在,文件/data/www/index.php存在,則該指令將內部重定向到“/index.php”,並且nginx再次搜索位置如果請求是由客戶端發送的。如前所述,重定向的請求最終將由FastCGI伺服器處理。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一般建議從msdn我告訴你上面下載系統,下麵是 Windows 微軟官網系統下載地址 首先,我們先查看一下Windows10系統狀態。 點擊桌面左下角的 Windows + X + N 快捷方式打開設置,再打開的Windows 設置面板中找到,系統和安全 點擊,在此就可以查看到當前系統的狀態。 Wi ...
  • [TOC] 1.MySQL安裝前準備 1.1.安裝依賴包 1.2.安裝cmake 1.3.創建用戶 2.MySQL下載安裝 2.1.創建軟體下載目錄 2.2.下載並上傳到/server/tools 2.3.解壓 2.4.安裝 3.配置並啟動 3.1.創建軟鏈接 3.2.拷貝配置文件到/etc 3.3 ...
  • 安裝 設置密碼 啟動之後,輸入一行 5.7.x對密碼有了更嚴格的要求,分為LOW,MEDIUM,STRONG三個等級,對應要求如下: LOW Length = 8 MEDIUM Length = 8, numeric, mixed case, and special characters STRON ...
  • 一、安裝中文版man 官方下載地址:https://code.google.com/archive/p/manpages-zh/ GITHUB項目地址:https://github.com/man-pages-zh/manpages-zh 安裝方法一 1、Debian / Ubuntu安裝 sudo ...
  • CPU優化 我們接下來從應用程式和系統的角度,分別來看看如何才能降低 CPU 使用率,提高 CPU 的並行處理能力。 應用程式優化 首先,從應用程式的角度來說,降低 CPU 使用率的最好方法當然是,排除所有不必要的工作,只保留最核心的邏輯。比如減少迴圈的層次、減少遞歸、減少動態記憶體分配等等。除此之外 ...
  • 中斷 中斷其實是一種非同步的事件處理機制,可以提高系統的併發處理能力。 由於中斷處理程式會打斷其他進程的運行,所以,為了減少對正常進程運行調度的影響,中斷處理程式就需要儘可能快地運行。如果中斷本身要做的事情不多,那麼處理起來也不會有太大問題;但如果中斷要處理的事情很多,中斷服務程式就有可能要運行很長時 ...
  • 之前一直用pycharm開發python程式,這個ide編輯器確實香,一點毛病都沒有,唯一毛病就是太貴了。也看到很多人在用免費、開源的Visual Studio Code, 開發的這個ide也號稱宇宙最強ide,不知道我用了會不會變強。下麵是配置並運行python的過程,記錄一下,安裝就不說了,直接 ...
  • (本文老生長談,因為最近在B站錄了個視頻,所以順便把文稿也發出來) 熟悉我的朋友應該知道,我是一名Linux工程師。那麼我來問大家一個問題,提到Linux,你們第一時間想到的是這是一個怎樣的崗位呢?我相信會有很大一部分的朋友會想到兩個字:運維。 聽到大家這樣的回答,我真的是很無奈,但也是非常的理解, ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...