nginx

認識Nginx

Nginx是由俄羅斯人Igor Sysoev開發的一款開源的,輕量級的Web服務器。Ngnix以其功能豐富著稱於世。它既可以作爲HTTP服務器,也可以作爲反向代理服務器或者郵件服務器能夠快速的響應靜態頁面(HTML)的請求;支持FastCGO、SSL、Virtual Host、URL、Rewrite、HTTP Basic Auth、Gzip等大量功能;並且支持更多的第三方功能模塊的擴展。

Nginx的特點

1、跨平臺:Nginx 可以在大多數 Unix like OS編譯運行,而且也有Windows的移植版本。

2、配置異常簡單,非常容易上手。配置風格跟程序開發一樣,神一般的配置

3、非阻塞、高併發連接:數據複製時,磁盤I/O的第一階段是非阻塞的。官方測試能夠支撐5萬併發連接,在實際生產環境中跑到2~3萬併發連接數.(這得益於Nginx使用了最新的epoll模型)

4、事件驅動:通信機制採用epoll模型,支持更大的併發連接。

5、master/worker結構:一個master進程,生成一個或多個worker進程

6、內存消耗小:處理大併發的請求內存消耗非常小。在3萬併發連接下,開啓的10個Nginx 進程才消耗150M內存(15M*10=150M)

7、成本低廉:Nginx爲開源軟件,可以免費使用。而購買F5 BIG-IP、NetScaler等硬件負載均衡交換機則需要十多萬至幾十萬人民幣

8、內置的健康檢查功能:如果 Nginx Proxy 後端的某臺 Web 服務器宕機了,不會影響前端訪問。

9、節省帶寬:支持 GZIP 壓縮,可以添加瀏覽器本地緩存的 Header 頭。

10、穩定性高:用於反向代理,宕機的概率微乎其微

Nginx的特性

基本功能:

靜態資源的web服務器,能緩存打開的文件描述符;

反向代理服務器,緩存、負載均衡;

支持FastCGI

模塊化,非DSO機制,過濾器gzip,SSI和圖像大小調整等

支持SSL

擴展功能:

基於名稱和IP做虛擬主機

支持keepalive

支持平滑配置更新或程序版本升級

定製訪問日誌,支持使用日誌緩存以提高性能

支持url rewrite

支持路徑別名

支持基於IP及用戶的認證;

支持速率限制,併發限制等;

nginx的基本架構:

一個master, 生成一個或多個worker

事件驅動:kqueue, epoll, /dev/poll

消息通知:select, poll, rt signals

支持sendfile, sendfile64

文件AIO

支持mmap

nginx: 非阻塞、事件驅動、一個master多個worker,一個worker響應多個用戶請求

clip_image002

Nginx的模塊類別

核心模塊

標準http模塊

可選的http模塊

郵件模塊

第三方擴展模塊

Nginx的安裝方法

1、編譯安裝

2、rpm包安裝:

epel源

Nginx的配置文件

main配置段

http {

}

配置參數需要以分號結尾,語法格式:

參數名 值1 [值2 ...];

還支持使用變量:

模塊內置變量

用戶自定義變量

set var_name value

Nginx的配置

Nginx基本核心配置的類別:

用於調試、定位問題

正常運行的必備配置

優化性能的配置

事件類的配置

正常運行的必備配置

1、user username [groupname];

指定運行worker進程的用戶和組

2、pid /path/to/pidfile_name;

指定nginx的pid文件

3、worker_rlimit_nofile #;

指定一個worker進程所能夠打開的最大文件句柄數;

4、worker_rlimit_sigpending #;

設定每個用戶能夠發往worker進程的信號的數量;

優化性能相關的配置:

1、worker_processes #;

worker進程的個數;通常其數值應該爲CPU的物理核心數減1;

2、worker_cpu_affinity cpumask ...;

0000

0001

0010

0100

1000

worker_processes 6;

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000;

3、ssl_engine device;

在存在ssl硬件加速器的服務器上,指定所使用的ssl硬件加速設備;

4、timer_resolution t;

每次內核事件調用返回時,都會使用gettimeofday()來更新nginx緩存時鐘;timer_resolution用於定義每隔多久纔會由gettimeofday()更新一次緩存時鐘;x86-64系統上,gettimeofday()代價已經很小,可以忽略此配置;

5、worker_priority nice;

-20,19之間的值;

事件相關的配置:

1、accept_mutex [on|off]

是否打開Ningx的負載均衡鎖;此鎖能夠讓多個worker進輪流地、序列化地與新的客戶端建立連接;而通常當一個worker進程的負載達到其上限的7/8,master就儘可能不再將請求調度此worker;

2、lock_file /path/to/lock_file;

lock文件

3、accept_mutex_delay #ms;

accept鎖模式中,一個worker進程爲取得accept鎖的等待時長;如果某worker進程在某次試圖取得鎖時失敗了,至少要等待#ms才能再一次請求鎖;

4、multi_accept on|off;

是否允許一次性地響應多個用戶請求;默認爲Off;

5、use [epoll|rtsig|select|poll];

定義使用的事件模型,建議讓nginx自動選擇;

6、worker_connections #;

每個worker能夠併發響應最大請求數;

用於調試、定位問題: 只調試nginx時使用:

1、daemon on|off;

是否讓ningx運行後臺;默認爲on,調試時可以設置爲off,使得所有信息去接輸出控制檯;

2、master_process on|off

是否以master/worker模式運行nginx;默認爲on;調試時可設置off以方便追蹤;

3、error_log /path/to/error_log level;

錯誤日誌文件及其級別;默認爲error級別;調試時可以使用debug級別,但要求在編譯時必須使用--with-debug啓用debug功能;

Nginx的web功能

虛擬主機相關的配置:

1、server {}

定義一個虛擬主機;nginx支持使用基於主機名或IP的虛擬主機;

2、listen

listen address[:port];

listen port

default_server:定義此server爲http中默認的server;如果所有的server中沒有任何一個listen使用此參數,那麼第一個server即爲默認server;

rcvbuf=SIZE: 接收緩衝大小;

sndbuf=SIZE: 發送緩衝大小;

ssl: https server;

3、server_name [...];

server_name可以跟多個主機名,名稱中可以使用通配符和正則表達式(通常以~開頭);當nginx收到一個請求時,會取出其首部的server的值,而後跟衆server_name進行比較;比較方式:

(1) 先做精確匹配;www.magedu.com

(2) 左側通配符匹配;*.magedu.com

(3) 右側通配符匹配;www.abc.com, www.*

(4) 正則表達式匹配: ~^.*\.magedu\.com$

4、server_name_hash_bucket_size 32|64|128;

爲了實現快速主機查找,nginx使用hash表來保存主機名;

5、location [ = | ~ | ~* | ^~ ] uri { ... }

location @name { ... }

功能:允許根據用戶請求的URI來匹配指定的各location以進行訪問配置;匹配到時,將被location塊中的配置所處理;比如:http://www.magedu.com/images/logo.gif

=:精確匹配;

~:正則表達式模式匹配,匹配時區分字符大小寫

~*:正則表達式模式匹配,匹配時忽略字符大小寫

^~: URI前半部分匹配,不檢查正則表達式

http://www.magedu.com/index.html

http://www.magedu.com/

http://www.magedu.com/documents/index.html

http://www.magedu.com/images/index.html

http://www.magedu.com/images/a.png

匹配優先級:

字符字面量最精確匹配、正則表達式檢索(由第一個匹配到所處理)、按字符字面量

文件路徑定義:

1、root path

設置web資源路徑;用於指定請求的根文檔目錄;

location / {

root /www/htdocs;

}

location ^~ /images/ {

root /web;

}

root: root/URI/

http://www.magedu.com/images/b.html

2、alias path

只能用於location中,用於路徑別名;

location / {

root /www/htdocs;

}

location ^~ /images/ {

alias /web;

}

alias: alias/

http://www.magedu.com/images/b.html

3、index file ...;

定義默認頁面,可參跟多個值;

4、error_page code ... [=[response]] uri;

當對於某個請求返回錯誤時,如果匹配上了error_page指令中設定的code,則重定向到新的URI中。

錯誤頁面重定向;

5、try_files path1 [path2 ...] uri;

自左至右嘗試讀取由path所指定路徑,在第一次找到即停止並返回;如果所有path均不存在,則返回最後一個uri;

location ~* ^/documents/(.*)$ {

root /www/htdocs;

try_files $uri /docu/$1 /temp.html;

}

http://www.magedu.com/documents/a.html

http://www.magedu.com/docu/a.html

http://www.magedu.com/temp.html

網絡連接相關的設置:

1、keepalive_timeout time;

保持連接的超時時長;默認爲75秒;

2、keepalive_requests n;

在一次長連接上允許承載的最大請求數;

3、keepalive_disable [msie6 | safari | none ]

對指定的瀏覽器禁止使用長連接;

4、tcp_nodelay on|off

對keepalive連接是否使用TCP_NODELAY選項;

5、client_header_timeout time;

讀取http請求首部的超時時長;

6、client_body_timeout time;

讀取http請求包體的超時時長;

7、send_timeout time;

發送響應的超時時長;

對客戶端請求的限制:

1、limit_except method ... { ... }

指定對範圍之外的其它方法的訪問控制;

limit_except GET {

allow 172.16.0.0/16;

deny all;

}

2、client_max_body_size SIZE;

http請求包體的最大值;常用於限定客戶所能夠請求的最大包體;根據請求首部中的Content-Length來檢測,以避免無用的傳輸;

3、limit_rate speed;

限制客戶端每秒鐘傳輸的字節數;默認爲0,表示沒有限制;

4、limit_rate_after time;

nginx向客戶發送響應報文時,如果時長超出了此處指定的時長,則後續的發送過程開始限速;

文件操作的優化:

1、sendfile on|off

是否啓用sendfile功能;

2、aio on|off

是否啓用aio功能;

3、open_file_cache max=N [inactive=time]|off

是否打開文件緩存功能;

max: 緩存條目的最大值;當滿了以後將根據LRU算法進行置換;

inactive: 某緩存條目在指定時長時沒有被訪問過時,將自動被刪除;默認爲60s;

緩存的信息包括:

文件句柄、文件大小和上次修改時間;

已經打開的目錄結構;

沒有找到或沒有訪問權限的信息;

4、open_file_cache_errors on|off

是否緩存文件找不到或沒有權限訪問等相關信息;

5、open_file_cache_valid time;

多長時間檢查一次緩存中的條目是否超出非活動時長,默認爲60s;

6、open_file_cache_min_use #;

在inactive指定的時長內被訪問超此處指定的次數地,纔不會被刪除;

對客戶端請求的特殊處理:

1、ignore_invalid_headers on|off

是否忽略不合法的http首部;默認爲on; off意味着請求首部中出現不合規的首部將拒絕響應;只能用於server和http;

2、log_not_found on|off

是否將文件找不到的信息也記錄進錯誤日誌中;

3、resolver address;

指定nginx使用的dns服務器地址;

4、resover_timeout time;

指定DNS解析超時時長,默認爲30s;

5、server_tokens on|off;

是否在錯誤頁面中顯示nginx的版本號;

內存及磁盤資源分配:

1、client_body_in_file_only on|clean|off

HTTP的包體是否存儲在磁盤文件中;非off表示存儲,即使包體大小爲0也會創建一個磁盤文件;on表示請求結束後包體文件不會被刪除,clean表示會被刪除;

2、client_body_in_single_buffer on|off;

HTTP的包體是否存儲在內存buffer當中;默認爲off;

3、cleint_body_buffer_size size;

nginx接收HTTP包體的內存緩衝區大小;

4、client_body_temp_path dir-path [level1 [level2 [level3]]];

HTTP包體存放的臨時目錄;

client_body_temp_path /var/tmp/client/ 1 2

5、client_header_buffer_size size;

正常情況下接收用戶請求的http報文header部分時分配的buffer大小;默認爲1k;

6、large_client_header_buffers number size;

存儲超大Http請求首部的內存buffer大小及個數;

7、connection_pool_size size;

nginx對於每個建立成功的tcp連接都會預先分配一個內存池,此處即用於設定此內存池的初始大小;默認爲256;

8、request_pool_size size;

nginx在處理每個http請求時會預先分配一個內存池,此處即用於設定此內存池的初始大小;默認爲4k;

http核心模塊的內置變量:

$uri: 當前請求的uri,不帶參數;

$request_uri: 請求的uri,帶完整參數;

$host: http請求報文中host首部;如果請求中沒有host首部,則以處理此請求的虛擬主機的主機名代替;

$hostname: nginx服務運行在的主機的主機名;

$remote_addr: 客戶端IP

$remote_port: 客戶端Port

$remote_user: 使用用戶認證時客戶端用戶輸入的用戶名;

$request_filename: 用戶請求中的URI經過本地root或alias轉換後映射的本地的文件路徑;

$request_method: 請求方法

$server_addr: 服務器地址

$server_name: 服務器名稱

$server_port: 服務器端口

$server_protocol: 服務器向客戶端發送響應時的協議,如http/1.1, http/1.0

$scheme: 在請求中使用scheme, 如https://www.magedu.com/中的https;

$http_HEADER: 匹配請求報文中指定的HEADER,$http_host匹配請求報文中的host首部

$sent_http_HEADER: 匹配響應報文中指定的HEADER,例如$http_content_type匹配響應報文中的content-type首部;

$document_root:當前請求映射到的root配置;

Nginx的安裝方法:

1、 本次實驗通過配置yum倉庫進行安裝,首先開始配置yum倉庫的源;

# vi /etc/yum.repos.d/nginx.repo

[nginx]

name=centos-nginx repo

baseurl=http://nginx.org/packages/centos/6/$basearch/

gpgcheck=0

enabled=1

clip_image001

2、 第二步開始進行安裝;

# yum install nginx

clip_image003

選Y進行安裝;

clip_image005

3、 接下來啓動Nginx即可進行訪問;

# service nginx start

clip_image006

clip_image008

4、 在瀏覽器訪問,測試是否能夠訪問

clip_image009

出現此種訪問不了web默認頁的情況,一般是由於防火牆沒做規則導致的,此處,我們可以嘗試關閉防火牆;

# service iptables stop

clip_image010

clip_image012

5、 查看Nginx的主配置文件;

# vi /etc/nginx/nginx.conf

clip_image013

可在此處定義上文中的各種參數,進行Nginx的調優;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章