nginx 配置參數

系統內核參數配置

net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 1800 

net.ipv4.ip_conntrack_max = 16777216 # 如果使用默認參數,容易出現網絡丟包 

net.ipv4.netfilter.ip_conntrack_max = 16777216# 如果使用默認參數,容易出現網絡丟包 

net.ipv4.tcp_max_syn_backlog = 65536 

net.core.netdev_max_backlog = 32768 

net.core.somaxconn = 32768 

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優化




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