nginx系列 3 nginx.conf介紹(1)

来源:https://www.cnblogs.com/MrHSR/archive/2019/01/04/10218756.html
-Advertisement-
Play Games

一. nginx.conf 文件結構概述 在第一篇中講到nginx的安裝,安裝完後,預設的nginx伺服器配置文件都存在安裝目錄conf中,主配置文件名為nginx.conf。下麵是我linux系統安裝nginx的目錄信息: 下麵將說明nginx.conf原始文件中,各條語句的生效範圍,對指令作用域 ...


一. nginx.conf 文件結構概述

  在第一篇中講到nginx的安裝,安裝完後,預設的nginx伺服器配置文件都存在安裝目錄conf中,主配置文件名為nginx.conf。下麵是我linux系統安裝nginx的目錄信息:

    [root@xuegod64 nginx]# pwd
    /usr/local/nginx
    [root@xuegod64 nginx]# ls
    client_body_temp  conf  fastcgi_temp  html  logs  proxy_temp  sbin  scgi_temp  uwsgi_temp

  下麵將說明nginx.conf原始文件中,各條語句的生效範圍,對指令作用域有一個初步的瞭解。在nginx.conf文件結構中,最外層的花括弧將內容整體分為兩部分(event、http)。nginx.conf一共由三部分組成,分別為全局塊、events塊、http塊。 在http塊中,又包含http全局塊、多個server塊。每個server塊中,可以包含server全局塊和多個location塊。在同一配置塊中嵌入的配置塊,各個之間不存在次序關係。

  配置文件支持大量可配置的指令,絕大多數指令不是特定屬於某一塊的。同一個指令放在不同層級的塊中,其作用域也不同。一般情況下,高一級塊中的指令可以作用於自身所在的塊和此塊包含的所有低層級塊。 如果某個指令在兩個不同層級的塊中同時出現,則採用"就近原則,即以較低層級的塊中的配置為準。

  下麵是一個nginx.conf簡單的配置示例:

#user  nobody;
user nginx nginx;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;
#以上是全局塊

events {
    worker_connections  1024;
}
#以上是events塊

#最後是http塊,裡面包括location塊
http {
    include       mime.types;
    default_type  application/octet-stream;

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        if ($request_uri ~* \.html$) {
                proxy_pass http://htmlservers;
           }
         if ($request_uri ~* \.aspx$){
               proxy_pass http://aspxservers;
           }
           proxy_pass http://picservers;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}

      upstream  htmlservers{
          server 192.168.2.50:80;
          server 192.168.2.51:80;
      }
      upstream  aspxservers{
          server 192.168.2.50:80;
          server 192.168.2.51:80;
      }
      upstream   picservers{
          server 192.168.2.50:80;
          server 192.168.2.51:80;
      }
}
View Code

 

  1. 全局塊

    全局塊是預設配置文件從開始到events塊之間的一部份內容,主要設置一些影響nginx伺服器整體運行的配置指令,因此這些指令作用域是nginx伺服器全局。通常包括配置運行nginx伺服器的用戶(組),允許生成的worker process數、nginx進程pid存放路徑、日誌的存放路徑和類型以及配置文件引入等。

 

  2. events塊

    events塊涉及的指令主要影響nginx伺服器與用戶的網路連接,常用到的設置包括是否開啟對多worker process下的網路連接進行序列化,是否允許同時接收多個網路連接,選取哪種事件驅動模型處理連接請求,每個worker process可以同時支持的最大連接數。這一塊對nginx伺服器的性能影響較大,應該根據實際情況靈活調整。

 

  3. http

    http塊是nginx伺服器配置中重要部分,代理、緩存和日誌定義等絕大多數的功能和第三方模塊的配置都可以放在這個模塊中。可以在http全局塊中配置的指令包括文件引入、mime-type定義、日誌自定義、是否使用sendfile轉輸文件、連接超時時間、單連接請求數上限等。

 

  4.server

    配置虛擬主機的相關參數,一個http中可以有多個server。server塊和"虛擬主機"的概述有密切聯繫,虛擬主機又稱虛擬伺服器或虛擬機。例如使用VMware來虛擬一個主機。對外表現為多個伺服器。從用戶角度來看,一臺虛擬主機和一臺獨立的硬體主機是完全一樣的。前面提過每一個http塊可以包含多個server塊,而每個server塊就相當於一臺虛擬主機,它內部可有多台主機聯合提供服務,一起對外提供在邏輯上關係密切的一組服務(或網站)

    和http塊相同,server塊也可以包含自己的全局塊,同時可以包含多個location塊,在server全局塊中,最常見的兩個配置項是本虛擬主機的監聽配置和本虛擬主機的名稱或ip配置。

 

  5.  location

    用於配置請求的路由,以及各種頁面的處理情況。每個server塊中可以包含多個location塊,locationserver塊的一個指令,由於在整個nginx配置中起著重要的作用,而且許多功能上靈活性往往在location指令的配置中體現出來,所以單獨列為一個""  這些location塊的主要作用是,基於nginx伺服器接收到的請求字元串(例如:server_name  url_string),對除虛擬主機名稱(ip) 之外的字元串如url_stirng進行匹配,對特定的請求進行處理。地址定向、數據緩存、和應答控制等功能都是在這部分實現,許多第三方模塊的配置也是在location塊中提供功能。

 

.  全局塊指令配置

  2.1 運行Nginx伺服器用戶()  user指令

    該指令配置屬於全局塊,在文件的第一行,預設是user nobody。該user指令的語法格式為

        user  用戶  [用戶組];

    用戶:是指定可以運行nginx伺服器的用戶。用戶組:是可選項,指定可以運行nginx伺服器的用戶組。只有被設置的用戶或者用戶組成員才有許可權啟動nginx進程。如果希望所有用戶可以啟動Nginx進程,可以註釋掉user指令。下麵是user指令,指定nginx用戶和nginx用戶組。第一行#表示已註釋,不生效。

    #user  nobody;
    user nginx nginx;

    nginx.conf配置文件中,每一條指令配置都必須以分號結束。

 

  2.2 允許生成的工作進程數 worker_processes指令

    worker processnginx伺服器實現併發處理服務(網站)的關鍵所在。理念上講,值越大,可以支持的併發處理量也越多。但實現受限於軟體本身、操作系統資源。一般建議啟動的工作進程數,通常設置成和cpu核數相等。該worker process指令的語法格式為:

       worker_processes number | auto;

    number:指定nginx進程最多可以產生的進程數。auto:自動檢測。下麵是worker_processes指令,指定一個進程數:

    worker_processes  1;

    當啟動nginx伺服器後,可以查看nginx伺服器除了主進程master process之處,還生成了一個worker process:

    [root@xuegod64 nginx]# ps -ef | grep nginx
    root       5454      1  0 1月03 ?       00:00:00 nginx: master process ./nginx -c /usr/local/nginx/conf/nginx.conf
    nginx      5455   5454  0 1月03 ?       00:00:00 nginx: worker process
    root      19141   2678  1 10:34 pts/0   00:00:00 grep --color=auto nginx

  

   2.3 nginx進程存放路徑 PID指令  

     nginx進程作為系統的守護進程運行,需要在某文件中保存當前運行程式的主進程號。nginx支持對它的存放路徑進行自定義配置。該pid指令語法格式為:

        pid    file;

    file:指定存放路徑和文件名稱。配置文件預設將此文件存放在nginx安裝目錄logs下,名字為nginx.pid。file可以是相對路徑,註意file除了路徑一定要指定文件名。下麵是pid指令的配置路徑存放於安裝目錄logs文件夾下:

    pid   logs/nginx.pid;

    

  2.4 錯誤日誌的存放路徑 error_log指令

    在全局塊、http塊、server塊都可以對nginx伺服器的日誌進行相關配置。這裡首先介紹全局塊下日誌的存放配置,另二塊配置基本相同,只是作用域不同。該error_log指令語法格式為:

        error_log file | level [debug | info |notice |warn | error| crit | alert| emerg];

    nginx伺服器日誌支持輸出到某一固定的文件file 以及level日誌級別。日誌的級別是可選項,由低到高,級別越高記錄的信息越少, 比如設置了warn級別後,級別為warn、error、crit、alert、emerg的日誌都會被記錄下來。生產場景一般是 warn | error | crit 這三個級別之一。下麵看一個配置實例,也是nginx預設的日誌存放路徑和預設日誌級別設置:

    error_log  logs/error.log  error;

    註意指定的文件對於運行nginx進程的用戶具有寫許可權,否則在啟動ningx進程時會報錯(/nginx/logs/error.log permission denied)。

  

三. events塊指令配置 

 

  3.1  最大連接數worker_connections指令

    該指令用來設置允許每一個worker process同時開啟的最大連接數。number預設值是1024。這個number不僅僅包括和前端用戶建立的連接數,而是包括所有可能的連接數。該worker_connections指令語法格式為:

      worker_connections number;

 

  3.2 事件驅動模型 use指令

    nginx伺服器提供了多種事件驅動模型來處理網路消息,可以使用user指令來指定某一事件驅動模型。後面再詳細介紹。 user指令語法結構為:

      use  select | poll | kqueue | epoll | rtsig | /dev/poll | eventport;

 

  3.3 是否允許同時接收多個網路連接 multi_accept 指令

    每個nginx伺服器的worker_process都有能力同時接收多個新到達的網路連接,但是這需要在配置文件中進行設置,預設是關閉。當指令預設為關閉狀態,即每個worker_process一次只能接收一個新到達的網路連接。 該multi_accept 指令語法結構為:

      multi_accept  on | off

  

  3.4 設置網路連接的序列化 accept_mutex指令

    這裡涉及到一個名詞"驚群"。驚群(thundering herd problem) 大意是:當某一時候只有一個網路連接到來時,多個睡眠進程會被同時叫醒,但只有一個進程可獲得連接。如果每次喚醒的進程數目太多,會影響一部分系統性能。在nginx伺服器的多進程下,有可能出現這樣的問題。

    為瞭解決這樣的問題,nginx配置中包含了這樣一條指令accept_mutex。當設置為開啟的時候會對多個nginx進程接收連接進行序列化,防止多個進程對連接的爭搶。預設為開啟狀態。其語法結構為:

    accept_mutex   on | off;

 

  本篇最後先展示nginx.conf配置文件的全局塊和event塊的指令條數示例:

    user nginx nginx;
    worker_processes  1;
    pid   logs/nginx.pid;
    error_log  logs/error.log  error;  #制定日誌路徑,級別。這個設置可以放入全局塊,http塊,server塊

    events {
        accept_mutex on;  #預設為on
        multi_accept on;  #預設為off
        use epoll;      #事件驅動模型
        worker_connections  1024;    #最大連接數
     }

 

參考文獻:

  Nginx高性能Web伺服器詳解

 


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

-Advertisement-
Play Games
更多相關文章
  • 轉發請註明此文章作者與路徑,請尊重原著,違者必究。 本篇文章與其它系列文章不同,為了方便測試,新建了一個ASP.Net Core視圖應用。 備註:下麵說的應用,只是在容器中運行的應用程式。 查看現在運行的應用 容器中已經運行了一個應用testaspnetcoredockerlinuxname,版本是 ...
  • 前言: 第一次接觸ABP的項目是在2018年6月份,但是當時沒有深入具體的研究,而今天因為工作的需要,需要學習、瞭解這個框架,在時隔半年之後,今天重新下載了這個項目,雖然在園子里有很多前輩們寫的這類的文章,但是我還是會在博客園中記錄一下學習的過程,一是希望能夠幫助到有需要的人,二是也算是自己學習的一 ...
  • 最近一直在思考如何對Web API的其介面數據進行獨立開發的問題,隨著Web API的越來越廣泛應用,很多開發也要求前端後端分離,例如統一的Web API介面後,Winform團隊、Web前端團隊、微信小程式或者APP團隊大家可以同步開發,在最初約定一些介面的輸入JSON數據和輸出JSON數據,但是... ...
  • 我們直接進入主題,使用VS2017開發工具 首先要創建一個WebApi項目,創建完之後,在wwwroot文件下,創建一個文件夾 名字可以隨意起 我這裡呢就叫做Upload了 ok ! 然後我們再創建一個控制器 IndexController 代碼如下 要知道上傳圖片都是通過HTTP去請求,服務端從r ...
  • 一,crontab服務的簡介 二、安裝cron服務 檢出cron服務 運行crontab -l 可能會報錯:no crontab for root 解決方法: 在 root 用戶下輸入 crontab -e ,按 Esc 按: wq 回車 ,再輸入 crontab -l 就沒有問題了 主要原因是由於 ...
  • 【作品名稱】 a simple game based on RT-Thread 【背景描述】 學了一段時間的嵌入式操作系統RT-Thread,發現是真的好用。於是想做一個小作品來鍛煉鞏固自己學習的知識。(童年的記憶啊^_^) 【所用物料及實物圖】 實物圖: 主控:STM32F103C8T6 編譯環境 ...
  • 工程基於NXP LPC2468 1 為什麼試用IRAM MODE 2 設置Program algorithm 編程演算法的作用是什麼 3 IRAM和FLASH 模式下IROM和IRAM的地址為什麼不一樣 4 RAM.ini有什麼作用 5 IRAM模式下為什麼用到外部下載器 6 如何設置程式的起始地址, ...
  • 在安裝完CentOS7後,當我每次啟動CentOS並使用SecureCRT鏈接時,都發現CentOS的IP總是在變,這就很苦惱了,總不能每次鏈接的時候都先查一下虛擬機的IP吧,所以打算把它設置成固定IP。這樣使用SecureCRT連接時只需要連接一次以後就不需要反覆更新連接的IP了。 IP地址的設置 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...