系統內核參數配置
php
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 1800 html
net.ipv4.ip_conntrack_max = 16777216 # 若是使用默認參數,容易出現網絡丟包 nginx
net.ipv4.netfilter.ip_conntrack_max = 16777216# 若是使用默認參數,容易出現網絡丟包 web
net.ipv4.tcp_max_syn_backlog = 65536 正則表達式
net.core.netdev_max_backlog = 32768 算法
net.core.somaxconn = 32768 apache
net.core.wmem_default = 8388608 瀏覽器
net.core.rmem_default = 8388608 緩存
net.core.rmem_max = 16777216 服務器
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries =
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.ip_local_port_range = 1024 65535
location的配置選項及說明
語法規則: location [=|~|~*|^~] /uri/ { … }
= 表示精確匹配,這個優先級也是最高的
^~ 表示uri以某個常規字符串開頭,理解爲匹配 url路徑便可。nginx不對url作編碼,所以請求爲/static/20%/aa,能夠被規則^~ /static/ /aa匹配到(注意是空格)。
~ 表示區分大小寫的正則匹配
~* 表示不區分大小寫的正則匹配(和上面的惟一區別就是大小寫)
!~和!~*分別爲區分大小寫不匹配及不區分大小寫不匹配的正則
/ 通用匹配,任何請求都會匹配到,默認匹配.
下面講講這些語法的一些規則和優先級
多個location配置的狀況下匹配順序爲(參考資料而來,還未實際驗證,試試就知道了,沒必要拘泥,僅供參考):
優先級=>^~>
首先匹配 =,其次匹配^~, 其次是按文件中順序的正則匹配,最後是交給 / 通用匹配。當有匹配成功時候,中止匹配,按當前匹配規則處理請求。 例子,有以下匹配規則:
root&alias文件路徑配置
root與alias主要區別在於nginx如何解釋location後面的uri,這會使二者分別以不一樣的方式將請求映射到服務器文件上。
[root] 語法:root path
默認值:root html
配置段:http、server、location、if
[alias] 語法:alias path
配置段:location
location ~ ^/weblogs/ {
root /path/to/weblogs/site.com;
autoindex on;
auth_basic "Restricted";
auth_basic_user_file passwd/weblogs;
}
root會根據完整的URI來映射,就是/path/uri
location ^~ /binapp/ {
limit_conn limit 4;
limit_rate 200k;
internal;
alias /path/to/site/statics/bin/apps/;
}
alias會把location後面配置的路徑丟棄掉,把當前匹配到的目錄指向到指定的目錄。
1. 使用alias時,目錄名後面必定要加」/」。
2. alias能夠指定任何名稱。
3. alias在使用正則匹配時,必須捕捉要匹配的內容並在指定的內容處使用。
4. alias只能位於location塊中
ngx_http_core_module模塊的變量
$arg_PARAMETER HTTP請求中某個參數的值,如/index.php?site=www.domain.com,能夠用$arg_site取得www.domain.com 這個值。
$args HTTP 請求中的完整參數。例如,在請求/index.php?width=400&height=200 中,$args表示字符串width=400&height=200.
$binary_remote_addr 二進制格式的客戶端地址。例如:\x0A\xE0B\x0E
$body_bytes_sent 表示在向客戶端發送的http響應中,包體部分的字節數
$content_length 表示客戶端請求頭部中的Content-Length 字段
$content_type 表示客戶端請求頭部中的Content-Type 字段
$cookie_COOKIE 表示在客戶端請求頭部中的cookie 字段
$document_root 表示當前請求所使用的root 配置項的值
$uri 表示當前請求的URI,不帶任何參數
$document_uri 與$uri 含義相同
$request_uri 表示客戶端發來的原始請求URI,帶完整的參數。$uri和$document_uri未必是用戶的原始請求,在內部重定向後多是重定向後的URI,而$request_uri 永遠不會改變,始終是客戶端的原始URI.
$host 表示客戶端請求頭部中的Host字段。若是Host字段不存在,則以實際處理的server(虛擬主機)名稱代替。若是Host字段中帶有端口,如IP:PORT,那麼$host是去掉端口的,它的值爲IP。$host 是全小寫的。這些特性與http_HEADER中的http_host不一樣,http_host只取出Host頭部對應的值。
$hostname 表示 Nginx所在機器的名稱,與 gethostbyname調用返回的值相同
$http_HEADER 表示當前 HTTP請求中相應頭部的值。HEADER名稱全小寫。例如,示請求中 Host頭部對應的值 用 $http_host表
$sent_http_HEADER 表示返回客戶端的 HTTP響應中相應頭部的值。HEADER名稱全小寫。例如,用 $sent_ http_content_type表示響應中 Content-Type頭部對應的值
$is_args 表示請求中的 URI是否帶參數,若是帶參數,$is_args值爲 ?,若是不帶參數,則是空字符串
$limit_rate 表示當前鏈接的限速是多少,0表示無限速
$nginx_version 表示當前 Nginx的版本號
$query_string 請求 URI中的參數,與 $args相同,然而 $query_string是隻讀的不會改變
$remote_addr 表示客戶端的地址
$remote_port 表示客戶端鏈接使用的端口
$remote_user 表示使用 Auth Basic Module時定義的用戶名
$request_filename 表示用戶請求中的 URI通過 root或 alias轉換後的文件路徑
$request_body 表示 HTTP請求中的包體,該參數只在 proxy_pass或 fastcgi_pass中有意義
$request_body_file 表示 HTTP請求中的包體存儲的臨時文件名
$request_completion 當請求已經所有完成時,其值爲 「ok」。若沒有完成,就要返回客戶端,則其值爲空字符串;或者在斷點續傳等狀況下使用 HTTP range訪問的並非文件的最後一塊,那麼其值也是空字符串。
$request_method 表示 HTTP請求的方法名,如 GET、PUT、POST等
$scheme 表示 HTTP scheme,如在請求 https://nginx.com/中表示 https
$server_addr 表示服務器地址
$server_name 表示服務器名稱
$server_port 表示服務器端口
$server_protocol 表示服務器向客戶端發送響應的協議,如 HTTP/1.1或 HTTP/1.0
日誌配置
如access_log、log_format、open_log_file_cache、log_not_found、log_subrequest、rewrite_log、error_log。
1. access_log指令
語法: access_log path [format [buffer=size [flush=time]]];
access_log path format gzip[=level] [buffer=size] [flush=time];
access_log syslog:server=address[,parameter=value] [format];
access_log off;
默認值: access_log logs/access.log combined;
配置段: http, server, location, if in location, limit_except
gzip壓縮等級。
buffer設置內存緩存區大小。
flush保存在緩存區中的最長時間。
不記錄日誌:access_log off;
使用默認combined格式記錄日誌:access_log logs/access.log 或 access_log logs/access.log combined;
2. log_format指令
語法: log_format name string …;
默認值: log_format combined 「…」;
配置段: http
name表示格式名稱,string表示等義的格式。log_format有一個默認的無需設置的combined日誌格式,至關於apache的combined日誌格式,
log_format combined '$remote_addr - $remote_user [$time_local] '
' "$request" $status $body_bytes_sent '
' "$http_referer" "$http_user_agent" ';
nginx做爲負載均衡,squid,nginx反向代理後,$remote_addr獲取反向代理的IP地址。反向代理服務器中在轉發請求的http頭信息中,增長X-Forwarded-For信息,用來記錄客戶端IP地址和客戶端請求的服務器地址。
log_format porxy '$http_x_forwarded_for - $remote_user [$time_local] '
' "$request" $status $body_bytes_sent '
' "$http_referer" "$http_user_agent" ';
$remote_addr, $http_x_forwarded_for 記錄客戶端IP地址
$remote_user 記錄客戶端用戶名稱
$request 記錄請求的URL和HTTP協議
$status 記錄請求狀態
$body_bytes_sent 發送給客戶端的字節數,不包括響應頭的大小; 該變量與Apache模塊mod_log_config裏的「%B」參數兼容。
$bytes_sent 發送給客戶端的總字節數。
$connection 鏈接的序列號。
$connection_requests 當前經過一個鏈接得到的請求數量。
$msec 日誌寫入時間。單位爲秒,精度是毫秒。
$pipe 若是請求是經過HTTP流水線(pipelined)發送,pipe值爲「p」,不然爲「.」。
$http_referer 記錄從哪一個頁面連接訪問過來的
$http_user_agent 記錄客戶端瀏覽器相關信息
$request_length 請求的長度(包括請求行,請求頭和請求正文)。
$request_time 請求處理時間,單位爲秒,精度毫秒; 從讀入客戶端的第一個字節開始,直到把最後一個字符發送給客戶端後進行日誌寫入爲止。
$time_iso8601 ISO8601標準格式下的本地時間。
$time_local 通用日誌格式下的本地時間。
3. open_log_file_cache指令
語法: open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
默認值: open_log_file_cache off;
配置段: http, server, location
對於每一條日誌記錄,都將是先打開文件,再寫入日誌,而後關閉。可使用open_log_file_cache來設置日誌文件緩存(默認是off),格式以下:
參數註釋以下:
max:設置緩存中的最大文件描述符數量,若是緩存被佔滿,採用LRU算法將描述符關閉。
inactive:設置存活時間,默認是10s
min_uses:設置在inactive時間段內,日誌文件最少使用多少次後,該日誌文件描述符記入緩存中,默認是1次
valid:設置檢查頻率,默認60s
off:禁用緩存
4. log_not_found指令
語法: log_not_found on | off;
默認值: log_not_found on;
配置段: http, server, location
是否在error_log中記錄不存在的錯誤。默認是。
5. log_subrequest指令
語法: log_subrequest on | off;
默認值: log_subrequest off;
配置段: http, server, location
是否在access_log中記錄子請求的訪問日誌。默認不記錄。
6. rewrite_log指令
由ngx_http_rewrite_module模塊提供的。用來記錄重寫日誌的。對於調試重寫規則建議開啓。 Nginx重寫規則指南
語法: rewrite_log on | off;
默認值: rewrite_log off;
配置段: http, server, location, if
啓用時將在error log中記錄notice級別的重寫日誌。
7. error_log指令
語法: error_log file | stderr | syslog:server=address[,parameter=value] [debug | info | notice | warn | error | crit | alert | emerg];
默認值: error_log logs/error.log error;
配置段: main, http, server, location
配置錯誤日誌。
nginx的rewrite模塊
重寫規則就是正則匹配,依賴於PCRE庫
nginx的重寫模塊是一個簡單的正則表達式匹配與一個虛擬堆疊機結合。
指令
break
語法:break
默認值:none
使用字段:server, location, if
完成當前設置的重寫規則,中止執行其餘的重寫規則。
if
語法:if (condition) { … }
默認值:none
使用字段:server, location
注意:儘可能考慮使用trp_files代替。
判斷的條件能夠有如下值:
1. 一個變量的名稱:空字符傳」「或者一些「0」開始的字符串爲false。
2. 字符串比較:使用=或!=運算符
3. 正則表達式匹配:使用~(區分大小寫)和~*(不區分大小寫),取反運算!~和!~*。
4. 文件是否存在:使用-f和!-f操做符
5. 目錄是否存在:使用-d和!-d操做符
7. 文件、目錄、符號連接是否存在:使用-e和!-e操做符
8. 文件是否可執行:使用-x和!-x操做符
return
語法:return code
默認值:none
使用字段:server, location, if
nginx隱藏版本號
nginx.conf中修改http zone中的變量值: server_tokens off;
php-fpm fastcgi.conf中的變量值: fastcgi_param SERVER_SOFTWARE nginx;
nginx正向代理
server {
listen 8090;
location / {
resolver 218.85.157.99 218.85.152.99;
resolver_timeout 30s;
proxy_pass http://$host$request_uri;
}
access_log /data/httplogs/proxy-$host-aceess.log;
}
resolver指令
語法: resolver address ... [valid=time];
默認值: —
配置段: http, server, location
配置DNS服務器IP地址。能夠指定多個,以輪詢方式請求。
nginx會緩存解析的結果。默認狀況下,緩存時間是名字解析響應中的TTL字段的值,能夠經過valid參數更改。
resolver_timeout指令
語法: resolver_timeout time;
默認值: resolver_timeout 30s;
配置段: http, server, location
解析超時時間。
haproxy、 nginx、 varnish的CDN調度
nginx的TCP代理
nginx的反向代理
nginx+keepalived+proxy_cache高可用nginx集羣和高速緩存
nginx優化