看完這篇還不了解Nginx服務(wù)器配置,那我要哭了

寫(xiě)在前面

Nginx是高性能輕量級(jí)WEB服務(wù)器的優(yōu)秀代表,由于其提供HTTP代理和反向代理、負(fù)載均衡、緩存等一系列重要特性,從而廣泛應(yīng)用于當(dāng)今的Web后端服務(wù)之中,而且各大互聯(lián)網(wǎng)公司也都在重度使用,所以作為一個(gè)開(kāi)發(fā)者,學(xué)會(huì)Nginx的使用和配置很有必要。

在本文中,我們將會(huì)從一份示例配置清單開(kāi)始,來(lái)簡(jiǎn)單梳理一下Nginx服務(wù)器的各種常見(jiàn)配置指令的作用和用法。

話(huà)不多說(shuō),上菜!

本文在GitHub開(kāi)源倉(cāng)庫(kù)「編程之路https://github.com/rd2coding/Road2Coding 中已經(jīng)收錄,里面有我整理的6大編程方向(崗位)的自學(xué)路線+知識(shí)點(diǎn)大梳理、面試考點(diǎn)我的簡(jiǎn)歷、幾本硬核pdf筆記,以及我的程序員人生,歡迎鑒賞。


Nginx配置文件的整體結(jié)構(gòu)

這里直接畫(huà)一幅圖就一目了然了,幾個(gè)大的配置模塊看得就很清楚。

image

從圖中可以看出主要包含以下幾大部分內(nèi)容:

1. 全局塊

該部分配置主要影響Nginx全局,通常包括下面幾個(gè)部分:

  • 配置運(yùn)行Nginx服務(wù)器用戶(hù)(組)
  • worker進(jìn)程數(shù)
  • Nginx進(jìn)程PID存放路徑
  • 錯(cuò)誤日志的存放路徑
  • 配置文件的引入
  • ...

2. events塊

該部分配置主要影響Nginx服務(wù)器與用戶(hù)的網(wǎng)絡(luò)連接,主要包括:

  • 設(shè)置網(wǎng)絡(luò)連接的序列化
  • 是否允許同時(shí)接收多個(gè)網(wǎng)絡(luò)連接
  • 事件驅(qū)動(dòng)模型的選擇
  • 最大連接數(shù)的配置
  • ...

3. http塊

  • 定義MIMI-Type
  • 自定義服務(wù)日志
  • 是否允許sendfile方式傳輸文件
  • 連接超時(shí)時(shí)間
  • 單連接請(qǐng)求數(shù)上限
  • ...

4. server塊

  • 配置網(wǎng)絡(luò)端口監(jiān)聽(tīng)
  • 訪問(wèn)日志和錯(cuò)誤頁(yè)
  • 基于名稱(chēng)的虛擬主機(jī)配置
  • 基于IP的虛擬主機(jī)配置
  • location塊配置
  • ...

5. location塊

  • location配置
  • 請(qǐng)求根目錄配置
  • 更改location的URI
  • 網(wǎng)站默認(rèn)首頁(yè)配置
  • ...

一份配置清單例析

這里給出了一份簡(jiǎn)要的Nginx配置清單舉例:

image

配置代碼如下:

user  nobody  nobody;
worker_processes  3;
error_log  logs/error.log;
pid  logs/nginx.pid;

events {
    use epoll;
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  main;
    sendfile  on;
    keepalive_timeout  65;

    server {
        listen       8088;
        server_name  codesheep;
        access_log  /codesheep/webserver/server1/log/access.log;
        error_page  404  /404.html;

        location /server1/location1 {
            root   /codesheep/webserver;
            index  index.server2-location1.htm;
        }

        location /server1/location2 {
        root   /codesheep/webserver;
            index  index.server2-location2.htm;
        }

    }

    server {
        listen       8089;
        server_name  192.168.31.177;
        access_log  /codesheep/webserver/server2/log/access.log;
        error_page  404  /404.html;
        
        location /server2/location1 {
            root   /codesheep/webserver;
            index  index.server2-location1.htm;
        }

        location /srv2/loc2 {
            alias   /codesheep/webserver/server2/location2/;
            index  index.server2-location2.htm;
        }
        
        location = /404.html {
            root /codesheep/webserver/;
            index 404.html;
        }
        
    }

}

接下來(lái)就對(duì)照這份示例配置清單來(lái)詳細(xì)剖析一下配置文件中幾個(gè)主要指令的含義及用法。


Nginx用戶(hù)(組)配置

配置項(xiàng)格式:user user [group];

  • user:指定可以運(yùn)行Nginx的用戶(hù)
  • group:指定可以運(yùn)行Nginx的用戶(hù)組(可選項(xiàng))

如果user指令不配置或者配置為 user nobody nobody ,則默認(rèn)所有用戶(hù)都可以啟動(dòng)Nginx進(jìn)程。


worker進(jìn)程數(shù)配置

這是Nginx服務(wù)器實(shí)現(xiàn)并發(fā)處理的關(guān)鍵配置,配置項(xiàng)格式為:

worker_processes number數(shù);

  • number:Nginx進(jìn)程最多可以產(chǎn)生的worker process數(shù)
  • 如果設(shè)置為auto,則Nginx將進(jìn)行自動(dòng)檢測(cè)

按照上文中的配置清單的實(shí)驗(yàn),我們給worker_processes配置的數(shù)目是:3,啟動(dòng)Nginx服務(wù)器后,我們可以后臺(tái)看一下主機(jī)上的Nginx進(jìn)程情況:

ps -aux | grep nginx

很明顯,理解 worker_processes 這個(gè)指令的含義就很容易了

image

error日志路徑配置

配置項(xiàng)格式:error_log file [可選日志級(jí)別];

  • file:指定日志輸出到某個(gè)文件file
  • 常見(jiàn)的可選日志級(jí)別包括:info、debug、warn、error...等

Nginx進(jìn)程PID存放路徑配置

由于Nginx進(jìn)程是作為系統(tǒng)守護(hù)進(jìn)程在后臺(tái)運(yùn)行,所以該選項(xiàng)用于自定義配置PID文件的保存路徑。

配置項(xiàng)格式:pid file;

  • file:指定其存放路徑+文件名稱(chēng)
  • 如果不指定默認(rèn)置于路徑 logs/nginx.pid

事件驅(qū)動(dòng)模型配置

配置項(xiàng)格式:use model;

  • model模型可選擇項(xiàng)包括:select、poll、kqueue、epoll、rtsig等......

最大連接數(shù)配置

配置項(xiàng)格式:worker_connections number數(shù);

  • number默認(rèn)值為512,表示允許每一個(gè)worker進(jìn)程可以同時(shí)開(kāi)啟的最大連接數(shù)。

配置文件的引入

該配置主要用于引入其他或者第三方的Nginx配置文件到當(dāng)前的主配置文件中

配置項(xiàng)格式:include conf_file;


網(wǎng)絡(luò)連接的序列化配置

配置項(xiàng)格式:accept_mutex on;

  • 該配置默認(rèn)為on狀態(tài),表示會(huì)對(duì)多個(gè)Nginx工作進(jìn)程接收連接進(jìn)行序列化,防止多個(gè)worker進(jìn)程對(duì)連接的爭(zhēng)搶。

說(shuō)到該指令,首先得闡述一下什么是所謂的“驚群?jiǎn)栴}”。就Nginx的場(chǎng)景來(lái)解釋的話(huà)大致的意思就是:當(dāng)一個(gè)新網(wǎng)絡(luò)連接來(lái)到時(shí),多個(gè)worker進(jìn)程會(huì)被同時(shí)喚醒,但僅僅只有一個(gè)進(jìn)程可以真正獲得連接并處理之。如果每次喚醒的進(jìn)程數(shù)目過(guò)多的話(huà),其實(shí)是會(huì)影響一部分性能的。

所以在這里,如果accept_mutex on,那么多個(gè)worker將是以串行方式來(lái)處理,其中有一個(gè)worker會(huì)被喚醒;反之若accept_mutex off,那么所有的worker都會(huì)被喚醒,不過(guò)只有一個(gè)worker能獲取新連接,其它的worker會(huì)重新進(jìn)入休眠狀態(tài)。

這個(gè)值的開(kāi)關(guān)與否其實(shí)是要和具體場(chǎng)景掛鉤的,一定程度上會(huì)影響系統(tǒng)的吞吐量。Nginx默認(rèn)打開(kāi)了accept_mutex,也算是一種保守的做法。


多網(wǎng)絡(luò)連接 接收配置

配置項(xiàng)格式:multi_accept off;

  • 該配置默認(rèn)為off,意指每個(gè)worker進(jìn)程一次只能接收一個(gè)新到達(dá)的網(wǎng)絡(luò)連接。如果想讓每個(gè)Nginx的worker process都能同時(shí)接收多個(gè)網(wǎng)絡(luò)連接,則需要開(kāi)啟此配置。

MIME-Type定義

MIME-Type指的是網(wǎng)絡(luò)資源的媒體類(lèi)型,也即前端請(qǐng)求的資源類(lèi)型。

配置項(xiàng)格式:

include mime.types;

default_type type類(lèi)型;
  • include配置用于將mime.types文件包含進(jìn)來(lái)

可以用cat mime.types 來(lái)查看mime.types的文件內(nèi)容,我們發(fā)現(xiàn)其就是一個(gè)types結(jié)構(gòu),里面包含了各種瀏覽器能夠識(shí)別的MIME類(lèi)型以及對(duì)應(yīng)類(lèi)型的文件后綴名,如下所示:

image

訪問(wèn)日志配置

配置項(xiàng)格式:

access_log path [format];
  • path:自定義訪問(wèn)日志的路徑+名稱(chēng)
  • format:自定義服務(wù)日志的格式(可選項(xiàng))。

連接超時(shí)配置

配置項(xiàng)格式:keepalive_timeout timeout [header_timeout];

  • timeout 表示server端對(duì)連接的保持時(shí)間
  • header_timeout表示在應(yīng)答報(bào)文頭部的 Keep-Alive 域設(shè)置超時(shí)時(shí)間,可選項(xiàng)。

sendfile配置

配置項(xiàng)格式:

sendfile on;
  • sendfile配置用于開(kāi)啟或關(guān)閉使用sendfile()系統(tǒng)調(diào)用來(lái)傳輸文件,默認(rèn)off
  • 注:在很多Web Server中,都引入了 sendfile的機(jī)制,來(lái)實(shí)現(xiàn)高性能文件傳輸。

網(wǎng)絡(luò)地址監(jiān)聽(tīng)配置

配置項(xiàng)格式:

  • 第一種:配置監(jiān)聽(tīng)的IP地址:listen IP[:PORT];
  • 第二種:配置監(jiān)聽(tīng)的端口:listen PORT;

實(shí)際舉例:

listen 192.168.31.177:8080; # 監(jiān)聽(tīng)特定IP和端口上的連接
listen 192.168.31.177;      # 監(jiān)聽(tīng)特定IP上所有端口的連接
listen 8080;                # 監(jiān)聽(tīng)特定端口上的所有IP的連接

基于名稱(chēng)或IP的虛擬主機(jī)配置

配置項(xiàng)格式:server_name name1 name2 ...

  • name可以有多個(gè)并列名稱(chēng),而且此處的name支持正則表達(dá)式書(shū)寫(xiě)

實(shí)際舉例:

server_name ~^www\.codesheep\d+\.com$;

至于基于IP的虛擬主機(jī)配置就更簡(jiǎn)單了:

配置項(xiàng)格式:server_name IP地址


location配置

配置項(xiàng)格式為:location [ = | ~ | ~* | ^~ ] /uri/ {...}

  • 這里的uri可包含正則表達(dá)式的模糊匹配。

uri前面的方括號(hào)中的內(nèi)容是可選項(xiàng),幾種常見(jiàn)的情形如下:

  • “=”:用于標(biāo)準(zhǔn)uri,進(jìn)行字符串的精確匹配
  • “~”:用于正則uri,表示區(qū)分大小寫(xiě)的匹配
  • “~*”:用于正則uri,表示不區(qū)分大小寫(xiě)的匹配
  • ~”:用于標(biāo)準(zhǔn)uri,進(jìn)行前綴匹配,~表示區(qū)分大小寫(xiě)

根目錄配置

配置項(xiàng)格式:root path;

  • path:表示Nginx接收到請(qǐng)求以后查找資源的根目錄路徑

當(dāng)然,也還可以通過(guò)alias指令來(lái)更改location接收到的URI請(qǐng)求路徑,指令為:

alias path;  # path為修改后的根路徑 

默認(rèn)首頁(yè)配置

配置項(xiàng)格式:index index_file ......

  • index_file可以包含多個(gè)用空格隔開(kāi)的文件名,首先找到哪個(gè)頁(yè)面,就使用哪個(gè)進(jìn)行響應(yīng)。

后 記

另外前段時(shí)間花了大把力氣,把自用的編程學(xué)習(xí)資源做了個(gè)大整理。

都是純肝貨,目錄如下。

image

該內(nèi)容在GitHub開(kāi)源倉(cāng)庫(kù)「編程之路https://github.com/rd2coding/Road2Coding 中已經(jīng)收錄,里面有我整理的6大編程方向(崗位)的自學(xué)路線+知識(shí)點(diǎn)大梳理面試考點(diǎn)、我的簡(jiǎn)歷、幾本硬核pdf筆記,以及我的程序員人生,歡迎star。

下篇見(jiàn)!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容