1、nginx的核心配置:php
>>> 正常運行的必備配置:
1. user username [groupname]; #指定運行worker子進程的用戶或組
2. pid /path/to/pidfile_name; #指定nginx的pid文件
3. worker_rlimit_nofile number; #worker進程能打開的文件描述符個數
4. worker_rlimit_sigpending number; #設定每一個用戶可以發往worker進程的信號的數量(設定信號隊列的大小);html
>>> 優化性能相關的配置:
1. worker_processes number; #work進程的個數;一般其數值應該比CPU數量小
#woker_processes 1;
2. worker_cpu_affinity cpumask(CPU掩碼)...; #worker進程的CPU的傾向性,綁定worker進程到某個CPU上
#例子:
#worker_processes 2; #兩個worker進程
#worker_cpu_affinity 0000(表明有4個CPU) 0001(第一個進程綁定第一個CPU上) 0010(第二個進程綁定到第二個CPU上)
3. ssl_engine device; #在存在ssl加速設備的服務器上,指定所使用的ssl硬件加速設備;
#因爲SSL比較消耗資源:加密、解密
4. timer_resolution interval; #多長時間獲取一次系統時間並更新nginx的緩存時鐘
#每次內核事件調用返回時,都會使用gettimeofday()來獲取系統時間更新nginx的緩存時鐘;不過在X86架構的服務器上,可忽略該項
#timer_resolution 100ms; 100毫秒node
5.worker_priority nice; #worker進程的優先級
nice爲:-20,19之間的值nginx
>>> 事件相關的配置
1. accept_mutex on|off; #是否打開nginx的負載均衡鎖;默認是開啓的
#爲了實現多個worker響應均衡,打開鎖後,就能夠實現worker進程的負載均衡(誰擁有鎖誰就接收用戶的請求)
#可是,當打開worker的負載均衡鎖後,會增長系統的開銷(對請求進行調度)
#而一般當一個worker進程的負載達到其上限的7/8時,master就儘量不在將請求調度至此worker;
2. lock_file /path/to/lock_file; #負載均衡的鎖文件
3. accept_mutex_delay interval;
#accept鎖模式中,一個worker進程爲取得accept鎖若是失敗了,須要等待此選項定義的時長後才能繼續獲取鎖;
#accept_mutex_delay 100ms;
4. multi_accept on|off; #是否容許worker一次性接受多個請求;
#默認爲off的
5. use [epoll|rtsig|select|poll]; #指定使用哪一種事件模型
#建議讓nginx自行選擇
6. worker_connections number; #每一個worker可以併發響應的最大請求數
#Web服務器上這個值最比如worker_rlimit_nofile多一些
#代理服務器上這個值最好是worker_rlimit_nofile的50%
>>> 用於調試、定位問題:只調試nginx時使用
1. daemon on|off; #是否讓nginx運行於後臺;默認爲on,調試時應該爲off
#在後臺時,不輸出信息到控制檯
2. master_process on|off; #是否讓一個master管理多個worker進程運行;默認爲off
#調試時能夠啓用該項,只啓用master進程,方便追蹤
3. error_log /path/to/error_log level; #定義錯誤日誌輸出及日誌級別
#調試時可使用debug級別,但要求在編譯時必須使用--with-debug啓用debug功能;
#默認爲error級別web
2、nginx的http配置格式:
1. nginx的http功能使用http {}段配置:
http {
}
2. nginx必須使用虛擬主機來配置Web站點!每一個虛擬主機使用一個server {}段配置:
server {
}
3. server {}須要定義在http {}以內:
http{
server {
}
}
4. Web服務器的公共配置,須要定義在server {}以外,http {}以內
3、nginx的http的配置參數正則表達式
1. listen [addres:port]; #監聽指定地址的端口
port; #監聽的端口
default_server; #定義此server爲httpd中默認的server,若是全部的server都沒有定義default_server,則第一個爲默認server;好比訪問一個不存在的虛擬主機,默認響應的主機!
rcvuf=SIZE; #接收緩衝大小;
sndbuf=SIZE; #發送緩衝大小
ssl:https server; #https的地址
2. server_name localhost localhost2; #主機名,能夠多個主機名
#當nginx收到一個請求時,會取出其首部的server的值,然後跟衆server進行比較:
#(1) 先作精確匹配:www.meng.com
#(2) 左側通配符匹配:*.meng.com
#(3) 右側通配符匹配:www.*
#(4) 正則表達式匹配:以波浪線開頭(~^\*\.meng\.com$)
3.server_name_hash_bucket_size 32|64|128; #hash表的大小
#爲了實現快速主機查找,nginx使用hash表來保存主機名;
5.location [ = | ~ | ~* | ^~ ] URI {
#根據用戶的URI匹配location中的表達式,匹配到後作一些操做
#僅能在server {}或其餘location中定義
=:精確匹配;區分大小寫
~:正則表達式匹配,區分字符大小寫
~*:正則表達式匹配,忽略字符大小寫
^~:只須要前半部分與URI匹配便可,不檢查正則表達式
沒有符號時,僅以起始路徑匹配
匹配優先級:
(1) 字符精確匹配
(2) 正則表達式檢索(有多個,由第一個匹配處處理)
(3) 字符串比較
};
6.Location的經常使用參數:
(1) root /html; #網頁根目錄
#能夠放在http {},server {},location {}中
Location的根目錄是以root的設定路徑爲開始的,例如:
Location ^~ /images/ {
root /html;
index index.html;
}
#實際訪問的地址是:http://localhost/images/index.html;可是index.html是在/html目錄下的images目錄裏;
(2) alias /html; #指定路徑別名
將Location映射到alias上,例如:
Location ^~ /images/ {
alias /html;
}
#實際訪問的地址是:http://localhost/images/File,可是文件所在的路徑在/html中;
(3) index index.html idnex.html2; #網站首頁文件,
(4) error_page code ... [=[code]] uri; #配置錯誤頁面重定向
#當對於某個請求返回錯誤時,若是匹配上了error_page指令中的設定的code,則重定向到新的URI中。
(5) try_files /path [/path2 ...] uri; #多路徑配置
#嘗試匹配每個PATH中的文件(從左到右),在第一次找到返回結果,若是都沒有,則重定向到URI中(URI必定得存在);算法
4、網絡鏈接相關的設置:
1. keepalive_timeout time; #保持鏈接的超時時間
#默認是75秒;
2. keepalive_requests number; #保持鏈接上容許承載的最大請求數
3. keepalive_disable [msie6 | safari | none]; #對指定的瀏覽器禁止使用長鏈接
4. tcp_nodelay on|off; #對keepalive鏈接是否使用TCP_NODELAY選項;
#多個確認報文合併傳過去,確認延遲(提升TCP性能)
#默認爲on,不啓動此選項
5. client_header_timeout time; #讀取http請求首部的超時時長
6. client_body_timeout time; #讀取http請求實體的超時時長
7. send_timeout time; #發送響應的超時時長瀏覽器
5、對客戶端請求的限制:
1. limit_except method ... { #指定客戶端不能使用的方法;
}
2. client_max_body_size SIZE; #http請求包體的最大值;
#用於限制用戶上傳文件的大小;
#若是基於程序控制用戶上傳文件的大小(好比1g),當用戶上傳一個2g的文件時,只有已經傳輸完的包體超過1g纔會通知用戶文件過大,致使用戶以前的操做所有白了;而基於此方法,能夠直接讀取請求頭部的包體大小,若是過大,直接拒絕;避免作無用功;緩存
3. limit_rate spped; #速率限制
限制客戶端每秒傳輸的字節數;默認爲0,表示沒有限制。
4. limit_rate_after time; #響應不限速的時長
nginx向客戶端發送響應報文時,若是時長超出了此處指定的時長,則後續的發送過程開始限速;服務器
6、文件操做的優化:
1. sendfile on|off; #是否啓用sendfile功能
2. aio on|off; #是否啓用aio功能
3. open_file_cache max=N [inactive=time]|off; #是否打開文件緩存功能
max:緩存條目的最大值;當滿了之後根據LRU算法進行置換;
inactive timeout:若是一個緩存條目在指定時間內沒有被訪問過,將自動被刪除;默認爲60秒
緩存的信息包括:
文件句柄(文件描述符)、文件大小和上次修改時間;
已經打開的目錄結構;
沒有找到或無權操做的信息;
4. open_file_cache_errors on|off; #是否緩存"文件沒有找到或無權操做"的信息
5. open_file_cache_valid time; #多長時間檢查一次緩存中的條目是否超出inactive時長
#默認爲60秒
6. open_file_cache_min_use number; #inactive時長內的訪問次數超過該參數定義的值,不管inactive是否超時,都不刪除;
7、對客戶端請求的特殊處理:
1. ignore_invalid_headers on|off; #是否忽略不合法的http首部
#若是爲off,當請求首部中出現不合法的http首部時,拒絕響應
2. log_not_found on|off; #當用戶訪問的文件不存在時,是否將該信息記錄到錯誤日誌中
3. resolver address; #指定nginx使用的dns服務器地址
4. resover_timeout time; #指定dns解析超時時長,默認爲30s;
5. server_tokens on|off; #是否顯示nginx的版本號
8、nginx的http核心模塊內置變量:
1. $uri:當前請求的URI,不帶參數
2. $request_uri:請求的uri,帶完整參數
3. $host:http請求報文中的host首部,若是請求中沒有host首部,則以處理此請求的虛擬主機的主機名代替
4. $hostname:nginx服務運行在的主機的主機名
5. $remote_addr:客戶端IP
6. $remote_port:客戶端端口
7. $remote_user:啓用用戶認證時,客戶端輸入的用戶名
8. $request_filename:用戶請求中的uri通過本地root或alias轉換後映射的本地文件路徑
9. $request_method:請求方法
10. $server_addr:服務器地址
11. $server_name:服務器域名
12. $server_port:服務器端口
13. $server_protocol:服務器向客戶端發送響應時的協議,如http/1.1
14. $scheme:在請求中使用scheme,如https://www.magedu.com/中的scheme
15. $http_HEADER:匹配請求報文中指定的HEADER,例如:$http_host匹配請求報文中的host首部
16. $sent_http_HEADER;匹配響應報文中指定的HEADER,例如$http_content_type匹配響應報文中content-type首部
17. $document_root:當前請求映射到的root配置項
9、nginx的基本配置:
1.定義一個虛擬主機:
server {
listen 80;
server_name www.a.com;
root /web/html;
#Location = / {
# root index.html
# index index.html
#}
}
2.定義訪問控制:
#默認容許全部主機訪問
allow 172.16.
deny all
3.用戶認證限制:
auth_basic "提示信息";
auth_basic_user_file /etc/.nginxpasswd;
> htpasswd -c -m /etc/.nginxpasswd jerry
4.索引:
autoindex on|off; #若是沒有首頁文件是否列出目錄中的全部文件
#通常用做下載站
5.限制:
limit requests; #限制同一客戶端某時間內的最大請求數
limit conn; #限制客戶端併發訪問數
6.日誌設置:
log_format:定義日誌訪問格式
7.防盜鏈的方法:
(1)valid_referers none | blocked | server_names | string ...; #定義合法的引用
none:經過瀏覽器直接訪問
blocked:referers的首部被清除
server_names:來源的服務器名稱(應該容許本身網站域名訪問)
(2)$invalid_referer: #定義不合法的引用
Location可使用if指令:
if ($invalid_referer) {
rewrite ^/ http://www.baidu.com break;
}
(1)正則表達式匹配:
~:與指定正則表達式模式匹配時返回"真",判斷匹配與否時區分字符大小寫;
~*:與指定正則表達式模式匹配時返回"真",判斷匹配與否時不區分字符大小寫;
!~:與指定正則表達式不匹配時返回"真",判斷匹配與否時區分字符大小寫;
!~*:與指定正則表達式不匹配是返回"真",判斷匹配與否時不區分字符大小寫;
==:等值比較
(2)文件及目錄匹配判斷
-f,!-f:判斷指定的路徑的文件是否存在
-d,!-d:判斷指定的路徑的目錄是否存在
-e,!-e:判斷指定的路徑資源是否存在,文件和目錄都可;
-x,!-x:判斷執行的路徑的文件是否存愛且可執行;
8.rewrite的URL地址重寫:
可用在server {},location {},if
(1)rewrite regex replacment [flag];
regex:正則表達式
replacment:替換值
flag:標識位,避免死循環
last #一旦被當前規則匹配並重寫後當即中止檢查後續的其餘rewrite規則,而經過重寫後的規則從新發起請求,若是該請求繼續可以被rewrite到,陷入循環
break #一旦被當前規則匹配並重寫當即中止檢查後續的其餘rewrite規則,然後繼續其餘模塊處理(例如直接響應)
redirect #返回302臨時重定向
permanent #返回301永久重定向
一旦陷入死循環,nginx最多循環10次,超出以後會返回500錯誤;
通常將rewrite寫在location中時,都是用break標記,或者將rewrite寫在if語句中;
(2)rewrite_log on|off; #是否把重寫過程記錄到錯誤日誌中,默認爲off,級別爲notice級別;
(3)return code; #用於結束rewrite規則,而且爲客戶端返回狀態碼
可使用的狀態碼有:204,400,402-400,500-504等;
if (condition) {
}
9.stub_status:
location /server-status {
stub_status on;
access_log off;
allow 172.16.10.1/24;
deny all;
}
active:活躍鏈接數
server accepts handled requests:服務器讀取的鏈接數,已經處理的鏈接數,正在處理的請求數
reading:讀取的請求個數
writing:正在處理請求或者正在把請求發往客戶端
wating:保持鏈接的狀態,等待用戶請求
10.壓縮功能:
gizp on|off
gizp_buffers 4 16k;申請4個單位爲16k的內存做爲壓縮結果流緩存
gzip_com_level levle;:指定gzip壓縮級別,1-9,級別越高,壓縮比越大
gzip_disable regex ie6; 禁止在ie6上使用gzip壓縮
gzip_min_length length; 最小壓縮字節
gzip types text/palin ...; 壓縮的文件類型
gizp_http_version 1.1; 壓縮後使用什麼協議傳輸
gzip_vary:讓緩存服務器緩存gzip壓縮過的數據
11. nginx內置變量補充
ngx_http_core_module 模塊在處理請求時,會有大量的變量,這些變量能夠經過訪問日誌來記錄下來,也能夠用於其它
nginx 模塊:
參數名稱 註釋 1. $arg_PARAMETER HTTP 請求中某個參數的值,如/index.php?site=www.ttlsa.com,能夠用$arg_site 取得 www.ttlsa.com 這個值. 2. $args HTTP 請求中的完整參數。例如,在請求/index.php?width=400&height=200 中,$args 表示字符串 width=400&height=200. 3. $binary_remote_addr 二進制格式的客戶端地址。例如:\x0A\xE0B\x0E 4. $body_bytes_sent 表示在向客戶端發送的 http 響應中,包體部分的字節數 5. $content_length 表示客戶端請求頭部中的 Content-Length 字段 6. $content_type 表示客戶端請求頭部中的 Content-Type 字段 7. $cookie_COOKIE 表示在客戶端請求頭部中的 cookie 字段 8. $document_root 表示當前請求所使用的 root 配置項的值 9. $uri 表示當前請求的 URI,不帶任何參數 10. $document_uri 與$uri 含義相同 11. $request_uri 表示客戶端發來的原始請求 URI,帶完整的參數。$uri 和$document_uri 未必是用戶的原始請求,在內部重定向後多是重定向後的 URI,而$request_uri 永遠不會改變,始終是客戶端的原始 URI. 12. $host 表示客戶端請求頭部中的 Host 字段。若是 Host 字段不存在,則以實際處理的 server(虛擬主機)名稱代替。若是 Host 字段中帶有端口,如 IP:PORT,那麼$host 是去掉端口的,它的值爲 IP。$host是全小寫的。 這些特性與 http_HEADER 中的 http_host 不一樣,http_host 只取出 Host 頭部對應的值。 13. $hostname 表示 Nginx 所在機器的名稱,與 gethostbyname 調用返回的值相同 14. $http_HEADER 表示當前 HTTP 請求中相應頭部的值。HEADER 名稱全小寫。例如,示請求中 Host 頭部對應的值 用 $http_host 表 15. $sent_http_HEADER 表示返回客戶端的 HTTP 響應中相應頭部的值。HEADER 名稱全小寫。例如,用 $sent_http_content_type 表示響應中 Content-Type 頭部對應的值 16. $is_args 表示請求中的 URI 是否帶參數,若是帶參數,$is_args 值爲 ?,若是不帶參數,則是空字符串 17. $limit_rate 表示當前鏈接的限速是多少,0 表示無限速 18. $nginx_version 表示當前 Nginx 的版本號 19. $query_string 請求 URI 中的參數,與 $args 相同,然而 $query_string 是隻讀的不會改變 20. $remote_addr 表示客戶端的地址 21. $remote_port 表示客戶端鏈接使用的端口 22. $remote_user 表示使用 Auth Basic Module 時定義的用戶名 23. $request_filename 表示用戶請求中的 URI 通過 root 或 alias 轉換後的文件路徑 24. $request_body 表示 HTTP 請求中的包體,該參數只在 proxy_pass 或 fastcgi_pass 中有意義 25. $request_body_file 表示 HTTP 請求中的包體存儲的臨時文件名 26. $request_completion 當請求已經所有完成時,其值爲 「ok」 。若沒有完成,就要返回客戶端,則其值爲空字符串;或者在斷點續傳等狀況下使用 HTTP range 訪問的並非文件的最後一塊,那麼其值也是空字符串。 27. $request_method 表示 HTTP 請求的方法名,如 GET、PUT、POST 等 28. $scheme 表示 HTTP scheme,如在請求 https://nginx.com/中表示 https 29. $server_addr 表示服務器地址 30. $server_name 表示服務器名稱 31. $server_port 表示服務器端口 32. $server_protocol 表示服務器向客戶端發送響應的協議,如 HTTP/1.1 或 HTTP/1.0