Nginx簡介和常用的一些配置

十五十六發表於2018-09-09

簡介

Nginx是一個免費的、開源的、高效能的HTTP伺服器和反向代理,以及IMAP/POP3代理伺服器。Nginx是為解決C10K問題編寫的少數伺服器之一。與傳統伺服器不同,NGNX不依賴執行緒來處理請求。相反,它使用了更可擴充套件的事件驅動(非同步)架構。這種架構使用較小但更重要的是在負載下可預測的記憶體量。即使您不希望同時處理數千個請求,您仍然可以從Nginx的高效能和小記憶體佔用中受益。

特點

  • 靜態的web資源伺服器;(圖片伺服器,或js/css/html/txt等靜態資源伺服器)
  • 結合FastCGI/uwSGI/SCGI等協議反代動態資源請求;
  • http/https協議的反向代理;
  • imap4/pop3協議的反向代理;
  • tcp/udp協議的請求轉發;
  • 使用epoll模型,使Nginx在高併發環境下表現的很好。但是處理動態請求的時候沒有太多優勢(靜態小檔案多的情況下同時處理的連線數多)
  • 佔用資源少
  • 配置簡單,靈活

應用的場景

  • 處理靜態請求(圖片,視訊服務)html js css flv等等
  • 處理動態請求,nginx+fastcgi 的方式執行
  • 反向代理,負載均衡
  • 快取服務

安裝

這裡使用編譯安裝
可以再官網找到tar包,http://nginx.org/en/download.html

系統: CentOS7
Nginx版本:1.14

yum install openssl openssl-devel gcc gcc-devel pcre pcre-devel -y
useradd -M -s /sbin/nologin nginx
cd /usr/local/src/
wget http://nginx.org/download/nginx-1.14.0.tar.gz ##這裡直接wget吧tar包下載下來
tar -xf nginx-1.14.0.tar.gz 
cd nginx-1.14.0
./configure --prefix=/usr/local/nginx1.14 --user=nginx --group=nginx --with-http_ssl_module  --with-http_stub_status_module --with-http_flv_module --with-http_mp4_module --with-threads --with-file-aio
make && make install 
ln -sv /usr/local/nginx1.14 /usr/local/nginx
PATH=/usr/local/nginx/sbin/:$PATH

我們可以看一下Nginx目錄結構

[root@localhost nginx-1.14.0]# tree /usr/local/nginx -L 1
/usr/local/nginx
├── conf    #存放配置檔案的目錄
├── html    #預設的站點目錄
├── logs    #存放日誌的目錄
└── sbin    #nginx命令的目錄

常見配置指令

1.user

格式:user user [group]
定義worker程式所屬的使用者和使用者組

2.pid /PATH/TO/PID_FILE

pid檔案路徑

3.include file

指明包含進來的其它配置檔案片斷;

4.load_module file

指明要裝載的動態模組

效能優化相關的配置

1.worker_processes number | auto;

worker程式的數量;通常應該等於小於當前主機的cpu的物理核心數;
auto:當前主機物理CPU核心數;

2.worker_cpu_affinity cpumask …;

worker_cpu_affinity auto [cpumask];
cpu核心繫結,將worker程式繫結在固定的cpu核上,我們考慮這樣一種場景,worker程式沒有繫結在固定的cpu上,worker程式可能每次都在不同的cpu上執行,比如第一次在第一個cpu上,第二次在第二個cpu上,這樣你在第一個cpu上的快取就用不到了。就會被浪費掉,減少了快取命中。
舉個例子,加入有4個cpu我們可以這樣寫
worker_cpu_affinity 0001 0010 0100 1000;
其中0001表示繫結在0號cpu上,0010表示繫結在1號cpu上。以此類推。

ps axo pid,command,psr| grep nginx| grep -v grep  #可以用這個命令檢視是否繫結成功,請求進來的時候,執行看一下繫結的cpu變了沒。

3.worker_priority number;

指定worker程式的nice值,設定worker程式優先順序;[-20,20]

4.worker_rlimit_nofile number;

worker程式所能夠開啟的檔案數量上限;

事件驅動相關的配置

1.worker_connections number;

每個worker程式所能夠開啟的最大併發連線數數量;
nginx所有程式併發連線數=worker_processes * worker_connections

2.use method;

指明併發連線請求的處理方法,一般使用epoll

3.accept_mutex on | off;

處理新的連線請求的方法;on意味著由各worker輪流處理新請求,Off意味著每個新請求的到達都會通知所有的worker程式;

與套接字相關的配置:

1.server { … }

配置一個虛擬主機;

server {
        listen address[:PORT]|PORT;
        server_name SERVER_NAME;
        root /PATH/TO/DOCUMENT_ROOT;                            
}

2.listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE

格式:listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]

  • default_server:設定為預設虛擬主機;
  • ssl:限制僅能夠通過ssl連線提供服務;
  • backlog=number:後援佇列長度;
  • rcvbuf=size:接收緩衝區大小;
  • sndbuf=size:傳送緩衝區大小;

3.server_name name …;

指明虛擬主機的主機名稱;後可跟多個由空白字元分隔的字串;
支援通配任意長度的任意字元;server_name www.ice.*
支援~起始的字元做正規表示式模式匹配;
匹配優先順序機制:
首先是字串精確匹配;
左側*萬用字元;
右側*萬用字元;
正規表示式;

4.tcp_nodelay on | off;

在keepalived模式下的連線是否啟用TCP_NODELAY選項;同個連結比如請求多個資源,會到一定程度一起傳送,而不是馬上傳送。開啟狀態就是直接發。不攢起來發。

5.tcp_nopush on|off;

在sendfile模式下,是否啟用TCP_CORK選項;吧響應報文首部和檔案起始內容放在一起傳送,傳送一個檔案在一個報文裡,因為sendfile是高階io,使用者請求的資源在硬碟上,一般是從硬碟讀取到核心,然後從核心讀取到程式,然後再從程式發往核心,然後再送出去。sendfile模式則是,不需要從核心讀取到程式,而是直接從硬碟讀取到核心然後直接傳送出去。然後報文首部在nginx程式生成,然後傳送到核心,核心再從網路卡出去。而開啟了這個選項會讓核心裡的資源等一等程式的報文首部。合併成一個檔案再傳送出去

6.sendfile on | off;

是否啟用sendfile功能;sendfile是高階io,使用者請求的資源在硬碟上,一般是從硬碟讀取到核心,然後從核心讀取到程式,然後再從程式發往核心,然後再送出去。sendfile模式則是,不需要從核心讀取到程式,而是直接從硬碟讀取到核心然後直接傳送出去。

定義路徑相關的配置:

1.root path;

設定web資源路徑對映;用於指明使用者請求的url所對應的本地檔案系統上的文件所在目錄路徑;可用的位置:http, server, location, if in location;

2.location [ = | ~ | ~* | ^~ ] uri { … }

Sets configuration depending on a request URI.
在一個server中location配置段可存在多個,用於實現從uri到檔案系統的路徑對映;ngnix會根據使用者請求的URI來檢查定義的所有location,並找出一個最佳匹配,而後應用其配置;
=:對URI做精確匹配;
~:對URI做正規表示式模式匹配,區分字元大小寫;
~*:對URI做正規表示式模式匹配,不區分字元大小寫;
^~:對URI的左半部分做匹配檢查,不區分字元大小寫;
不帶符號:匹配起始於此uri的所有的url;
匹配優先順序:=, ^~, ~/~*,不帶符號;
官方的一個典型例子

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}
#請求“/”的時候會匹配configuration A
#請求“/index.html”將會匹配configuration B,
#請求“/documents/document.html”將會匹配configuration C
#請求“/images/1.gif”將會匹配configuration D
#請求“/documents/1.jpg”將會匹配configuration E

3.alias path;

定義路徑別名,文件對映的另一種機制;僅能用於location上下文;
注意:location中使用root指令和alias指令的意義不同;
(a) root,給定的路徑對應於location中的/uri/左側的/;
(b) alias,給定的路徑對應於location中的/uri/右側的/;

4.index file …;

預設資源;http, server, location;

5.error_page code … [=[response]] uri;

定義錯誤頁面,可以再location內定製錯誤頁面

#        error_page 404 /404.html;
#            location = /40x.html {  ##這裡可以用root指令定製錯誤頁面
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }

6.try_files file … uri;

定義客戶端請求的相關配置

1.keepalive_timeout timeout [header_timeout];

設定保持連線的超時時長,0表示禁止長連線;預設為75s;

2.keepalive_requests number;

在一次長連線上所允許請求的資源的最大數量,預設為100;

3.keepalive_disable none | browser …;

對哪種瀏覽器禁用長連線;

4.send_timeout time;

向客戶端傳送響應報文的超時時長,此處,是指兩次寫操作之間的間隔時長;

5.client_body_buffer_size size;

用於接收客戶端請求報文的body部分的緩衝區大小;預設為16k;超出此大小時,其將被暫存到磁碟上的由client_body_temp_path指令所定義的位置;
client_body_temp_path path [level1 [level2 [level3]]];
設定用於儲存客戶端請求報文的body部分的臨時儲存路徑及子目錄結構和數量;
client_body_temp_path /var/tmp/client_body 2 1 1
1:表示用一位16進位制數字表示一級子目錄;0-f
2:表示用2位16程式數字表示二級子目錄:00-ff
2:表示用2位16程式數字表示三級子目錄:00-ff

對客戶端進行限制的相關配置:

1.limit_rate rate;

限制響應給客戶端的傳輸速率,單位是bytes/second,0表示無限制;

2.limit_except method … { … }

限制對指定的請求方法之外的其它方法的使用客戶端;

limit_except GET {
    allow 192.168.1.0/24;
    deny  all;
}

檔案操作優化的配置

1.aio on | off | threads[=pool];

是否啟用aio功能;

2.directio size | off;

在Linux主機啟用O_DIRECT標記,此處意味檔案大於等於給定的大小時使用,例如directio 4m;

3.open_file_cache off;

open_file_cache max=N [inactive=time];
nginx可以快取以下三種資訊:
(1) 檔案的描述符、檔案大小和最近一次的修改時間;
(2) 開啟的目錄結構;
(3) 沒有找到的或者沒有許可權訪問的檔案的相關資訊;
max=N:可快取的快取項上限;達到上限後會使用LRU演算法實現快取管理;
inactive=time:快取項的非活動時長,在此處指定的時長內未被命中的或命中的次數少於open_file_cache_min_uses指令所指定的次數的快取項即為非活動項;

4.open_file_cache_valid time;

快取項有效性的檢查頻率;預設為60s;

5.open_file_cache_min_uses number;

在open_file_cache指令的inactive引數指定的時長內,至少應該被命中多少次方可被歸類為活動項;

6.open_file_cache_errors on | off;

是否快取查詢時發生錯誤的檔案一類的資訊;

相關文章