初識nginx

先來一波官方站點關於nginx介紹。nginx相關歷史這裏再也不贅述啦。php

 

nginx 是免費,開源,高性能 HTTP 服務器和反向代理服務器,也可做爲IMAP/POP3代理服務器。nginx以它的高性能,穩定性,豐富的特徵設定,配置簡單和資源消耗低而著稱。html

 nginx是爲數很少能夠解決C10K問題的服務器。不像傳統服務器,nginx不依賴線程處理請求。它使用的是更爲高明事件驅動(異步)架構。在高負荷下,也能保持低消耗,更重要的是可預估的內存佔用量。若是你不指望去解決上千的併發請求難題,你也能夠從nginx的高性能,低消耗而嚐到好處。nginx應用規模可大可小:小至 VPS,大至組建服務器集羣。node

 瞭解nginx架構

nginx爲何是高性能,低消耗的,可解決高併發問題 linux

首先是master/worker二層架構,master負責加載配置文件、管理worker進程、平滑升級;worker負責 處理請求。並且是基於事件驅動模型設計的處理模型,這使得nginx

worker數量和cpu核心數至關便可,可是一個worker進程能夠同時處理多個請求,在高併發訪問的狀況下使用較少的資源從容應對。web

簡單來說,異步非阻塞,事件驅動機制是其核心特徵。正則表達式

同時nginx擁有一套緩存機制,能夠進一步下降網絡壓力,加速用戶響應。算法

模塊化設計 瀏覽器

 nginx整體設計理念秉承模塊化設計思想,把各功能細分模塊進行開發,實現靈活地裝卸載所需模塊,方便後續功能拓展。緩存

nginx模塊 分爲五類

1)核心模塊

2)標準http模塊

3)可選http模塊

4)mail模塊

5)第三方模塊

 安裝nginx

rpm包,官方預製,下載地址: http://nginx.org/packages

編譯安裝:編譯安裝根據須要選擇編譯的模塊,因人而異,下例僅供參考
~]# yum install pcre-devel openssl-devel zlib-devel
~]# useradd -r nginx
~]#  ./configure --prefix=/usr/local/nginx  --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-http_stub_status_module --with-threads --with-file-aio
# make && make install

 瞭解nginx配置

 主配置文件:nginx.conf今後處爲入口,開始你的nginx配置吧。主配置文件中,使用include命令引用分支配置文件。

 nginx配置風格爲劃地而治,要嚴格按照模塊爲區域進行配置

配置結構以下:

main block:主配置段,也即全局配置段;
event {
...

事件驅動相關的配置;

 }

http {
...

http/https 協議相關的配置段; 

}
mail {
...

mail相關模塊

       } 

stream {
...

tcp/udp 傳輸層負載均衡配置段; 

}

再來說講配置語法

directive      value...;  #語法格式

(1) 指令必須以分號結尾;
(2) 支持使用配置變量;
內建變量:由Nginx模塊引入,可直接引用;
自定義變量:由用戶使用set命令定義;
set variable_name value;
引用變量:$variable_name

 內建變量傳送門:http://nginx.org/en/docs/varindex.html  數量繁多,用起來也是很是方便滴,想用什麼變量,來這裏查查。

 配置nginx,從基礎開始————

主配置段

一、定義進程用戶,用戶組

user   username  usergroup;

默認爲nobody。 指定一個系統用戶。

 二、定義主程序pid文件路徑

pid /PATH/TO/PID_FILE;

三、 引入分支配置文件

include file;

~ include  conf.d/*.conf      ####「~」在本文中表示配置實例語句####

 四、裝載動態模塊

load_modulefile;

~  load_module modules/ngx_mail_module.so;

 五、error 日誌

error_logfile[level]

~ error_log logs/error.log  info 

主配置段中,性能調優的指令 

 一、指定worker數量

worker_processes number | auto;

數量最宜和cpu核心數相同。

二、綁定worker與cpu核心對應關係

worker_cpu_affinity auto | cpumask; 

 若是不設置此項,worker會在不一樣的工做內核上切換,這會形成沒必要要的開銷,將它們固定起來就好,通常設置爲auto便可。

worker_cpu_affinity0001 0010 0100 1000   #指定cpumask例子

三、指定worker進程的nice值 範圍[-20,20]

worker_priority number; 

 四、設置worker打開文件數量限制

worker_rlimit_nofile  number;

 ~ worker_rlimit_nofile   2390251

固然系統內核參數要改大,sysctl -w fs.file-max=2390251;sysctl -p

 Event 區域設置

 一、每一個worker進程所可以打開的最大併發鏈接數數量;

worker_connections number;

~ worker_connections  65535; #通常設置爲65535,最大端口數量

二、指明併發鏈接請求的處理方法;

use method;

~ use epoll; #linux平臺
三、網絡鏈接序列化

accept_mutex  on | off;

處理新的鏈接請求的方法;on表示開啓網絡鏈接序列化,避免「驚羣」效應——即一個新鏈接請求,全部worker進程都被激活。建議開啓

 四、多路接收

multi_accept  on|off;

 on表示一個worker同時接受盡量多的請求。建議開啓

Http區域設置----進階開始

一、配置虛擬主機:server

 使用server指令配置虛擬主機,通常格式以下:

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

}

1.1 listen 指令

配置監聽地址,端口指令

有三種形式:

1) listen  address[:port] [args..];

  監聽在指定IP,指定端口;當端口省略時,監聽全部端口

2) listen  port [args...];

  監聽主機全部IP的80端口

3) listen unix:path  [args...];

  監聽unix socket,一種本機內部通訊IPC機制,非重點。

-----介紹上面[args] 內容:

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

default_server: 標識符,表示此虛擬主機爲address:port 的默認主機

ssl:標識符,虛擬主機使用https協議通訊時,標識此項

backlog=number:設置容許同時最大網絡監聽鏈接處於掛起狀態的個數,默認爲511

rcvbuf=size:設置監聽socket接收緩衝區大小

sndbuf=size:設置監聽socket發送緩衝區大小

-----小結:

通常listen 指令無需太過複雜

~ listen 10.1.0.1:8080 default_server  backlog=1024

~ listen  8080;

1.2 server_name 指令

使用server_name 指令配置基於名稱或基於IP的虛擬主機

1)基於名稱的虛擬主機

格式: server_name   name...   容許跟多個名稱,空格符分隔

------name支持glob通配符*

*能夠出如今三段式名稱中的首段或尾段;以及兩段式名稱中的尾段

server_name  *.cutemsyu.com  www.cutemsyu.*  cutemsyu.*;

------name支持正則表達式~

以~起始表示正則表達式標記

server_name  ~^www\d+\.cutemsyu\.com$

其中\d表明數字0-9,像這樣的表達式可匹配www1.cutemsyu.com,www2.cutemsyu.com 等等

拓展:nginx 支持name 正則表達式字符捕捉功能

server_name  ~^([^.]+)\.cutemsyu\.com$

如此定義,當該表示式匹配www.cutemsyu.com 名稱時,在server塊中可以使用$1 表示 www 字符串

-----關於一個名稱被多個表達式匹配的問題

若是一個主機配置多個虛擬主機,則有可能發生此種狀況

nginx有以下server_name 匹配規定:

對於一個名稱匹配多個表達式狀況,按如下規則處理,排在前面優先級高

1.準確匹配

2.左側*通配符

3.右側*通配符

4.正則表達式

若是被同一級別的多個表達式匹配,則按第一個匹配的表達式處理

2)基於IP的虛擬主機

用法: server_name  IP;

1.3 配置請求根目錄指令:root

 root指令定義根路徑目錄,可定義在http,server,location塊;

語法:root  path;

web服務器接收到請求後,首先在根目錄下尋找資源。後面會介紹location塊,root在location用到的狀況比較多。

二、配置location塊

用法:

location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }

應用在server塊中,或在location塊中嵌套使用。

在一個server中location配置段可存在多個,用於實現從uri到文件系統的路徑映射;ngnix會根據用戶請求的URI來檢查定義的全部location,並找出一個最佳匹配,然後應用其配置;

uri部分方便下面敘述,稱不含正則表達式的uri爲標準uri;反之,含有正則的uri稱爲正則uri,並且正則uri 前必須使用~或~*。同時支持正則字符串捕捉,使用$1等應用。

[ = | ~ | ~* | ^~ ] 這部分符號是具備特殊定義的符號,表示特定含義,可省略。

server接收到一個請求uri後,先與全部標準uri進行匹配,並記錄匹配度最高的一個。而後按序與正則uri進行匹配,匹配到第一個正則uri後,當即按相應location塊處理。若是全部正則匹配失敗,則應用以前記錄的標準uri對應的location塊進行處理。

1) =    使用在標準uri前,表示精準匹配,若是請求uri與此對應,則該請求當即由該location塊進行處理,再也不與正則uri匹配。

2) ~    使用在正則uri前,而且區分大小寫字母

3) ~*  使用在正則uri前,不區分大小寫字母

4) ^~  使用在標準uri前,要求與標準uri匹配,找到匹配度最高的一個後不進行與正則uri匹配

如,對於"/" 的請求較多的話,使用如下定義

  location = / {

    ....

  }

則能實現快速匹配。

看一看nginx官方文檔給出的例子:

location = / { [ configuration A ] } location / { [ configuration B ] } location /documents/ { [ configuration C ] } location ^~ /images/ { [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { [ configuration E ] }

請求URI            應用的location配置

/                configuration A

/index.html                 configuration B

/documents/document.html   configuration C

/images/1.gif           configuration D

/documents/1.jpg              configuration E

 

至於@name 形式的location,是用來處理重定向類型的請求。在try_files 指令中會提到。

三、路徑重定向類的指令

3.1 路徑別名 alias

用法: alias  path;

定義路徑別名,文檔映射的另外一種機制;僅能用於location上下文。

與root 指令容易混淆。參考下面示例

  location /data {

    alias  /documents/www;

    }

請求uri爲/data/index.html,則nginx服務器將在路徑 /documents/www 下尋找index.html 文件。

3.2 設置網站默認首頁

做用是用戶不需輸入完整的uri來訪問默認主頁

用法: index  filename... ;

可設置多個默認網頁,若是前一個頁面文件不存在則顯示下一頁面文件,以此類推。

3.3 錯誤頁面重定向

用法:error_page code ... [=[response]] uri|path;

當客戶端訪問遇到問題時,nginx支持自定義錯誤頁面顯示,並返回一個指定狀態碼,若是指定的話。

做用域爲 http,server,location 。具備在子域有效的特徵。

  Example:

error_page 404             /404.html;
error_page 500 502 503 504 /50x.html;

此示例跳轉的資源使用相對路徑方式,意味着從定義的根路徑下查找文件。

  Example:

error_page 404 =200 /empty.gif;

此示例指定轉換的狀態碼。

  Example:

error_page 404 = /404.php;

若是響應的錯誤狀態碼來自代理服務器,或者FastCGI/uwsgi/SCGI 服務器,應使用該示例方式返回代理服務器返回的狀態碼。

  Example:

error_page 403      http://example.com/forbidden.html;
error_page 404 =301 http://example.com/notfound.html;

該示例重定向爲一個指定uri。此種狀況重定向的狀態碼爲302。可修改成 301,302,303,307。

3.4 嘗試查找文件

用法: try_files file ... uri;

    try_files file ... =code;

按順序檢查文件,若是都不存在,則定向最後一個參數。最後一個參數若是是文件則必須存在;能夠是狀態碼;內部重定向。

  example:

location /images/ {
    try_files $uri /images/default.gif;
}
location / {
    try_files $uri $uri/index.html $uri.html =404;
}

  example:重定向型

location / {
    try_files $uri $uri/ @wordpress;
}

location ~ \.php$ {
    try_files $uri @wordpress;         #這裏使用重定向,若是請求的資源頁不在會自動跳轉@wordpress塊中的index.php。若是使用uri的話,不會顯示動態資源頁面。

    fastcgi_pass ...;

    fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;
    ... other fastcgi_param's
}

location @wordpress {
    fastcgi_pass ...;

    fastcgi_param SCRIPT_FILENAME /path/to/index.php;
    ... other fastcgi_param's
}

四、套接字相關配置

   做用域:httpserverlocation

4.1  tcp_nodelay on | off;

  在keepalived模式下的鏈接是否啓用TCP_NODELAY選項;默認開啓;建議開啓

4.2  sendfile   on|off;

  是否開啓sendfile 特性,減小數據在內核與用戶空間之間的copy次數。建議開啓。詳見標題6內容

4.3  sendfile_max_chunk  size;

  worker process 每次調用sendfile() 傳輸數據的最大值,減小一次調用sendfile()最大阻塞時長,0爲不限制,建議設置128K

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

做用域:httpserverlocation

 

5.1  keepalive_timeout timeout [header_timeout];
  設定保持鏈接的超時時長,0表示禁止長鏈接;默認爲75s;header_timeout 可選項,在應答報文首部中表示keepalive超時時間

5.2  keepalive_requests number;
  在一次長鏈接上所容許請求的資源的最大數量,默認爲100;

5.3  keepalive_disable none | browser ...;
  對哪一種瀏覽器禁用長鏈接;

5.4  send_timeout time;
  向客戶端發送響應報文的超時時長,此處,是指兩次寫操做之間的間隔時長;若是客戶端在規定時長內無任何活動則關閉鏈接

  send_timeout 10s;

5.5  client_header_buffer_size  size;
  設置客戶端請求報文首部緩衝區大小,默認值爲1K。有時客戶端請求首部帶有cookie很大的信息,會形成400錯誤,強烈建議增大大小

  大小設置爲系統分頁大小,命令 getconf PAGESIZE 可查看

  通常設置爲 client_header_buffer_size 4K;
5.6  client_body_buffer_size size;
  用於接收客戶端請求報文的body部分的緩衝區大小;默認爲16k;超出此大小時,其將被暫存到磁盤上的由client_body_temp_path指令所定義的位置;

5.7  client_body_temp_path path [level1 [level2 [level3]]];
  設定用於存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量;16進制的數字;

  client_body_temp_path path  /var/tmp/client_body  1 2 2   #可定義在高性能磁盤分區上

六、文件操做優化的配置

做用域:httpserverlocation

6.1  aio on | off | threads[=pool];
  是否啓用aio功能;

6.2  directio size | off;
  在Linux主機啓用O_DIRECT標記,此處意味文件大於等於給定的大小時使用,例如directio 4m;

6.3  directio_alignment size;

  爲directio設置 alignment 大小,默認512字節,通常不用調整。可是xfs 文件系統須要增大至4k

--------這裏花必定篇幅講講aio,directio,和sendfile之間的關係-------

首先aio和sendfile是互相排斥的。啓用aio,必須也啓用directio,否則的話read()將成爲阻塞。

sendfile適合小文件,佔用的是系統緩存。當傳輸大文件時,並且系統內存不夠大的狀況,使用sendfile()將較不適宜。此時應使用aio機制。

推薦的一個配置示例:文件小於8M,使用sendfile,大於或等於8M使用aio

location /video/ {
    sendfile       on;
  sendfiel_max_chunk 256K; aio on; directio 8m;
  output_buffers 1 128k;
}

特別地,在大文件傳輸較多的狀況下,適宜啓用aio  threads 。nginx編譯須要--with-threads 選項

location /video/ {
    sendfile       on;
  sendfiel_max_chunk 256K; aio threads; #這裏使用默認的線程池,可自行建立。 directio 8m;
  output_buffers 1 128k;
}


6.4  open_file_cache off;
open_file_cache max=N [inactive=time];
nginx能夠緩存如下三種信息:
(1) 文件的描述符、文件大小和最近一次的修改時間;
(2) 打開的目錄結構;
(3) 沒有找到的或者沒有權限訪問的文件的相關信息;

max=N:可緩存的緩存項上限;達到上限後會使用LRU算法實現緩存管理;

inactive=time:緩存項的非活動時長,在此處指定的時長內未被命中的或命中的次數少於open_file_cache_min_users指令所指定的次數的緩存項即爲非活動項;

6.5 open_file_cache_valid time;
緩存項有效性的檢查頻率;默認爲60s;

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

6.7  open_file_cache_errors on | off;
是否緩存查找時發生錯誤的文件一類的信息;

  Example:

open_file_cache          max=1000 inactive=20s;
open_file_cache_valid    30s;
open_file_cache_min_uses 2;
open_file_cache_errors   on;

 

本篇就介紹到這裏,nginx餘下內容請關注後續博客。

相關文章
相關標籤/搜索