一、nginx是什麼
Nginx (engine x) 是一個高性能的HTTP和反向代理服
務器,也是一個IMAP/POP3/SMTP服務器。Nginx是
由伊戈爾·賽索耶夫爲俄羅斯訪問量第二的Rambler.ru站
點(俄文:Рамблер)開發的,第一個公開版本0.1.0
發佈於2004年10月4日。
其將源代碼以類BSD許可證的形式發佈,因它的穩定性
、豐富的功能集、示例配置文件和低系統資源的消耗而
聞名。2011年6月1日,nginx 1.0.4發佈。
Nginx是一款輕量級的Web 服務器/反向代理服務器及
電子郵件(IMAP/POP3)代理服務器。其特點是佔有
內存少,併發能力強,事實上nginx的併發能力確實在
同類型的網頁服務器中表現較好,中國大陸使用nginx
網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等
二、nginx特性
跨平臺: Nginx 可以在大多數 Unix like OS編譯運行, 而且也有Windows
的移植版本。 配置異常簡單, 非常容易上手。 配置風格簡單, 神一般的配
置易讀性
高併發連接: 數據複製時, 官方測試能夠支撐5萬併發連接, 在實際生產環
境中跑到2~3萬併發連接數.(這得益於Nginx使用了最新的epoll模型)通信
機制採用epoll模型, 支持更大的併發連接。
master/worker結構: 一個master進程, 生成一個或多個worker進程
功能模塊化: nginx的內部結構是由核心部分和一系列的功能模塊所組成
。 這樣劃分是爲了使得每個模塊的功能相對簡單, 便於開發, 同時也便於
對系統進行功能擴展。
成本低廉: Nginx可實現負載均衡功能, 可以免費使用。 而購買F5 BIG-IP
、 NetScaler等硬件負載均衡交換機則需要十多萬至幾十萬人民幣
內置的健康檢查功能: 如果 Nginx Proxy 後端的某臺 Web 服務器宕機了,
不會影響前端訪問。
節省帶寬: 有緩存模塊, 支持 GZIP 壓縮, 可實現瀏覽器本地緩存的
Header 頭。
穩定性高: 用於反向代理(負載均衡) , 宕機的概率微乎其微
Nginx的特性Nginx的架構Nginx的模塊流程圖
Nginx模塊主要有4種角色:
(1) core(核心模塊):構建
nginx基礎服務、管理其他模塊。
(2) handlers(處理模塊): 用於
處理HTTP請求,然後產生輸出。
(3) load-balancers(負載均衡
模塊):當有多於一臺的後端備選
服務器時,選擇一臺轉發HTTP請
求。
(4) filters(過濾模塊): 過濾
handler產生的輸出。21
Nginx安裝方式
nginx安裝常用兩種方式,yum安裝和源碼包安裝
yum 安裝:通常是在線安裝,好處是安裝方式簡單,不易出錯;常
用的安裝yum源爲epel
源碼包安裝:是先將 nginx 的源碼下載下來,在自己的系統裏編譯
生成可執行文件,然後執行,好處是因爲是在自己的系統上編譯的,
更符合自己系統的性能,也就是說在自己的系統上執行 nginx 服務
性能效率更好。(推薦,需要安裝開發環境)
區別:路徑和啓動方式不同,支持的模塊也不同
三、nginx的模塊
Nginx模塊主要有4種角色:
(1) core(核心模塊):構建
nginx基礎服務、管理其他模塊。
(2) handlers(處理模塊): 用於
處理HTTP請求,然後產生輸出。
(3) load-balancers(負載均衡
模塊):當有多於一臺的後端備選
服務器時,選擇一臺轉發HTTP請
求。
(4) filters(過濾模塊): 過濾
handler產生的輸出。
四、Nginx安裝方式
nginx安裝常用兩種方式,yum安裝和源碼包安裝
yum 安裝:通常是在線安裝,好處是安裝方式簡單,不易出錯;常
用的安裝yum源爲epel
源碼包安裝:是先將 nginx 的源碼下載下來,在自己的系統裏編譯
生成可執行文件,然後執行,好處是因爲是在自己的系統上編譯的,
更符合自己系統的性能,也就是說在自己的系統上執行 nginx 服務
性能效率更好。(推薦,需要安裝開發環境)
區別:路徑和啓動方式不同,支持的模塊也不同。
五、nginx的配置
主配置文件: nginx.conf
擴展相關配置文件: include conf.d/*.conf
協議配置: fastcgi, uwsgi, scgi等協議相關的配置文件
類型配置: mime.types: 支持的mime類型
六、主配置文件結構
main : #主配置段, 也即全局配置段; 正常運行必備配置
優化性能配置, 用於調試和定位的配置。
event {
...
}; 事件驅動相關的配置;
http {
...
}; http/https 協議相關的配置段;
七、Nginx配置文件講解
nginx的主配置文件路徑一般在
/etc/nginx/nginx.conf下(yum安裝
) 或
者源碼安裝指定位置的conf目錄
下, 如
/usr/local/nginx/conf/nginx.conf
配置文件主要配置設置:
main(全區設置)
http(協議配置)
upstream(負載均衡服務器設置)
和server、 location(URL匹配特定
位置設置)
1) 全局配置
#Nginx的worker進程運行用戶以及用戶組
user nobody nobody;
#Nginx開啓的進程數
worker_processes 2;
worker_processes auto;
#也可以下參數指定了哪個cpu分配給哪個進程,
#worker_processes 4 #4核CPU
#worker_cpu_affinity 0001 0010 0100 1000
#定義全局錯誤日誌定義類型, [debug|info|notice|warn|crit]
error_log logs/error.log info;
#指定進程ID存儲文件位置
pid logs/nginx.pid;
2) 服務配置
非虛擬主機的配置或公共配置, 需要定義在server之外, http之內;
http {
directive value;
...
server {
}s
erver {
}
...
}}必
須使用虛擬主機來配置站點; 每個虛擬主機使用一個server {}段配置;
server {
}
3)http段參數介紹
1. #文件擴展名與文件類型映射表
2. include mime.types;
3. #默認文件類型
4. default_type application/octet-stream;
6.#日誌相關定義
7. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
8. # '$status $body_bytes_sent "$http_referer" '
9. # '"$http_user_agent" "$http_x_forwarded_for"';
10. #定義日誌的格式。 後面定義要輸出的內容。
11. #1.$remote_addr 與$http_x_forwarded_for 用以記錄客戶端的ip地址;
12. #2.$remote_user : 用來記錄客戶端用戶名稱;
13. #3.$time_local : 用來記錄訪問時間與時區;
14. #4.$request : 用來記錄請求的url與http協議;
15. #5.$status : 用來記錄請求狀態;
16. #6.$body_bytes_sent : 記錄發送給客戶端文件主體內容大小;
17. #7.$http_referer : 用來記錄從那個頁面鏈接訪問過來的;
18. #8.$http_user_agent : 記錄客戶端瀏覽器的相關信息
19. #連接日誌的路徑, 指定的日誌格式放在最後。
20. #access_log logs/access.log main;
21. #只記錄更爲嚴重的錯誤日誌, 減少IO壓力
22. error_log logs/error.log crit;
http段參數介紹30
26. #默認編碼
27. #charset utf-8;
28. #服務器名字的hash表大小
29. server_names_hash_bucket_size 128;
30. #客戶端請求單個文件的最大字節數
31. client_max_body_size 8m;
32. #指定來自客戶端請求頭的hearerbuffer大小
33. client_header_buffer_size 32k;
34. #指定客戶端請求中較大的消息頭的緩存最大數量和大小。
35. large_client_header_buffers 4 64k;
36. #開啓高效傳輸模式。
37. sendfile on;
38. #防止網絡阻塞
39. tcp_nopush on;
40. tcp_nodelay on;
41. #客戶端連接超時時間, 單位是秒
42. keepalive_timeout 60;
43. #客戶端請求頭讀取超時時間
44. client_header_timeout 10;
45. #設置客戶端請求主體讀取超時時間
46. client_body_timeout 10;
47. #響應客戶端超時時間
48. send_timeout 10;
50.#FastCGI相關參數是爲了改善網站的性能: 減少資源佔用, 提高訪問速度。
51. fastcgi_connect_timeout 300;
52. fastcgi_send_timeout 300;
53. fastcgi_read_timeout 300;
54. fastcgi_buffer_size 64k;
55. fastcgi_buffers 4 64k;
56. fastcgi_busy_buffers_size 128k;
57. fastcgi_temp_file_write_size 128k;
59.#gzip模塊設置
60. #開啓gzip壓縮輸出
61. gzip on;
62. #最小壓縮文件大小
63. gzip_min_length 1k;
64. #壓縮緩衝區
65. gzip_buffers 4 16k;
66. #壓縮版本(默認1.1, 前端如果是squid2.5請使用1.0)
67. gzip_http_version 1.0;
68. #壓縮等級 1-9 等級越高, 壓縮效果越好, 節約寬帶, 但CPU消耗大
69. gzip_comp_level 2;
70. #壓縮類型, 默認就已經包含text/html, 所以下面就不用再寫了, 寫上去也不會有問題, 但是會有一個warn。
71. gzip_types text/plain application/x-javascript text/css application/xml;
72. #前端緩存服務器緩存經過壓縮的頁面
73. gzip_vary on;
4)虛擬主機相關介紹
虛擬主機相關的配置:
1、 server {}
定義一個虛擬主機; nginx支持使用基於主機名或IP的虛擬主機;
2、 listen
listen address[:port];
listen port
default_server: 定義此server爲http中默認的server; 如果所有的server中沒有任何一個
listen使用此參數, 那麼第一個server即爲默認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$
test.test.magedu.com
test.magedu.com/text
www.taobao.com
5)文件路徑定義相關介紹
server段內
1、 root path
設置web資源路徑; 用於指定請求的根文檔目錄;
location / {
root /www/htdocs;(本機的文件路徑)
}lo
cation ^~ /p_w_picpaths/ {
root /web;
} 2
、 alias path
只能用於location中, 用於路徑別名;
location / {
root /www/htdocs;
}lo
cation ^~ /p_w_picpaths/ {
alias /web/;
}
6)虛擬主機相關介紹
(1)location [ = | ~ | ~* | ^~ ] uri { ... }
(2)location @name { ... }
功能: 允許根據用戶請求的URI來匹配指定的各location以進行訪
問配置; 匹配到時, 將被location塊中的配置所處理
=: 精確匹配;
~: 正則表達式模式匹配, 匹配時區分字符大小寫
~*: 正則表達式模式匹配, 匹配時忽略字符大小寫
^~: URI前半部分匹配, 匹配時忽略字符大小寫。 不檢查正則表達
式 匹
配優先級:
= (大於) ^~ (大於) ~ (大於) 不帶符號
7)文件路徑定義相關介紹
(1) index file ...;
定義默認頁面, 可參跟多個值;
(2) error_page code ... [=[response]] uri;
錯誤頁重定向: 當對於某個請求返回錯誤時, 如果匹配上了
error_page指令中設定的code, 則重定向到新的URI中。
錯誤頁面重定向;
例: error_page 404 /404.html;當用戶請求一個不存在的資源
是, 會自動跳轉到自定義的404.html頁面。
注意跳轉的狀態碼還是原來的狀態碼, 即使是跳轉成功!