目錄
- 一.配置
- 配置檔案結構
- 配置參數
- 二.日志變量解析
- 三.location
- 簡介
- 文法規則
- 例子
- 四.if語句
- 五.set變量
- 六.echo_page
- 七.Nginx_return
- 文法配置
1.全局塊:配置影響nginx全局的指令。一般有運作nginx伺服器的使用者組,nginx程序pid存放路徑,日志存放路徑,配置檔案引入,允許生成worker process數等。
2.events塊:配置影響nginx伺服器或與使用者的網絡連接配接。有每個程序的最大連接配接數,選取哪種事件驅動模型處理連接配接請求,是否允許同時接受多個網路連接配接,開啟多個網絡連接配接序列化等。
3.http塊:可以嵌套多個server,配置代理,緩存,日志定義等絕大多數功能和第三方子產品的配置。如檔案引入,mime-type定義,日志自定義,是否使用sendfile傳輸檔案,連接配接逾時時間,單連接配接請求數等。
4.server塊:配置虛拟主機的相關參數,一個http中可以有多個server。
5.location塊:配置請求的路由,以及各種頁面的處理情況。
#使用nginx這個使用者運作,更加安全,預設nobody
user nginx;
#pid檔案位置
pid logs/nginx.pid;
#指定全局日志輸出位置,notice是日志級别
error_log logs/nginx.log notice;
#開啟的工作程序數量,和cpu核心數相同即可
worker_processes auto;
#工作程序綁定哪個cpu,或單個工作程序綁定到多個cpu,通常不用配置
#worker_cpu_affinity 01 10;
#這個指令是指當一個nginx 程序打開的最多檔案描述符數目,理論值應該是最多打開檔案數(ulimit -n)一樣。
#現在在linux 2.6核心下開啟檔案打開數為65535
#最好根據測試資料來限定,超過承受能力會導緻其它通路很卡,但若限定後,其它通路正常,多出的會禁止通路。
worker_rlimit_nofile 65535;
#每個work程序可以建立的最大的連結數
# 并發限定總數是 worker_processes 和 worker_connections 的乘積
# 在設定了反向代理的情況下,max_clients = worker_processes * worker_connections / 2 因為作為反向代理伺服器,每個并發會建立與用戶端的連接配接和與後端服務的連接配接,會占用兩個連接配接。
worker_connections 65535;
#将日志加載到記憶體,一起寫入日志檔案。
#max:最大條目數的,如果緩存被占滿,采用 LRU 算法将描述符關閉。
#inactive:設定存活時間,預設10s
#min_uses:設定在 inactive 時間段内,日志檔案最少使用多少次後,該日志檔案描述符記入緩存中,預設是 1 次
#valid:設定檢查頻率,預設 60s
open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
events {
epoll模型是Linux 2.6以上版本核心中的高性能網絡I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
}
http {
#[日志格式]
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" "$request_time" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_time" "$content_type"'
'" $request_body"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log info;
#由 ngx_http_rewrite_module 子產品提供的。用來記錄重寫日志的。對于調試重寫規則建議開啟。
#rewrite_log on;
#[limit限制]
#設定用于儲存各種 key(比如目前連接配接數)的共享記憶體的參數。 5m 就是 5兆位元組,這個值應該被設定的足夠大以存儲(32K*5) 32byte 狀态或者(16K*5) 64byte 狀态。
limit_conn_zone $binary_remote_addr zone=addr:5m;
#我們設定的值是 100,也就是說我們允許每一個 IP 位址最多同時打開有 100 個連接配接。
limit_conn addr 50;
#限速子產品,前3M下載下傳時不限速
limit_rate_after 3m;
#限速子產品
limit_rate 512k;
#[基礎設定]
#禁用ssi
ssi off;
#禁用autoindex 子產品
autoindex off;
#媒體類型,标準
include mime.types;
#預設檔案類型,預設為text/plain
default_type application/octet-stream;
#隐藏版本号
server_tokens off;
#編碼格式
charset UTF-8;
#[資訊傳輸]
#開啟高效檔案傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出檔案,對于普通應用設為 on,如果用來進行下載下傳等應用磁盤IO重負載應用,可設定為off,以平衡磁盤與網絡I/O處理速度,降低系統的負載。如果圖檔顯示不正常把這個改成off。
sendfile on;
#必須在sendfile開啟模式才有效,告訴nginx在一個資料包裡發送所有頭檔案,而不一個接一個的發送。
tcp_nopush on;
#必須在sendfile開啟模式才有效告訴nginx不要緩存資料,而是一段一段的發送--當需要及時發送資料時,就應該給應用設定這個屬性,這樣發送一小塊資料資訊時就不能立即得到傳回值。
tcp_nodelay on;
#[逾時設定,機關均為秒]
#用戶端連接配接保持會話逾時時間,超過這個時間,伺服器斷開這個連結,對于後端是php,可以低一些,因為php解析快,java的話要長一些,java解析慢
keepalive_timeout 30;
#設定請求頭的逾時時間。我們也可以把這個設定低些,如果超過這個時間沒有發送任何資料,nginx将傳回request time out的錯誤
client_header_timeout 10;
#設定請求體的逾時時間。我們也可以把這個設定低些,超過這個時間沒有發送任何資料,和上面一樣的錯誤提示
client_body_timeout 10;
#響應用戶端逾時時間,服務端給用戶端發送資料,如果用戶端遲遲不接受沒超過以下時間将斷開連接配接
send_timeout 10;
#告訴nginx關閉不響應的用戶端連接配接。這将會釋放那個用戶端所占有的記憶體空間。
reset_timedout_connection on;
#[server_name控制]
#儲存伺服器名字(server_name www.xx.com這種)的hash表,如果名字太長,就需要将如下值變大為64
server_names_hash_bucket_size 64;
#存儲伺服器名字的值大小,預設512kb,如果一個server對應多個域名,就要加大此值
server_names_hash_max_size 512;
#[送出緩存]
#nginx 會将整個請求頭都放在一個 buffer 裡面,這個buffer 的大小通過配置項 client_header_buffer_size 來設定,如果使用者的請求頭太大,這個 buffer 裝不下,那 nginx 就會重新配置設定一個新的更大的 buffer來裝請求頭,這個大 buffer 可以通過 large_client_header_buffers 來設定,這個 large_buffer 這一組 buffer,比如配置 4 8k,就是表示有四個 8k 大小的buffer 可以用。
client_header_buffer_size 32k;
#此指令規定了用于讀取大型用戶端請求頭的緩沖區的最大數量和大小。 這些緩沖區僅在預設緩沖區不足時按需配置設定。 當處理請求或連接配接轉換到保持活動狀态時,釋放緩沖區。如下例子:
large_client_header_buffers 4 32k;
#此指令設定NGINX能處理的最大請求主體大小。 如果請求大于指定的大小,則NGINX發回HTTP 413(Request Entity too large)錯誤。如果在上傳大檔案,可以将此值設定大一些
client_max_body_size 8m;
#這個将為打開檔案指定緩存,預設是沒有啟用的,max指定緩存數量,建議和打開檔案數一緻,inactive 是指經過多長時間檔案沒被請求後删除緩存。
open_file_cache max=100000 inactive=20s;
#這個是指多長時間檢查一次緩存的有效資訊。
open_file_cache_valid 30s;
#open_file_cache指令中的inactive 參數時間内檔案的最少使用次數,如果超過這個數字,檔案描述符一直是在緩存中打開的,如上例,如果有一個檔案在inactive 時間内一次沒被使用,它将被移除。
open_file_cache_min_uses 2;
#指定了當搜尋一個檔案時是否緩存錯誤資訊,也包括再次給配置中添加檔案。我們也包括了伺服器子產品,這些是在不同檔案中定義的。如果你的伺服器子產品不在這些位置,你就得修改這一行來指定正确的位置
open_file_cache_errors off;
#[壓縮方面]
#開啟頁面壓縮
gzip on;
#gzip壓縮是要申請臨時記憶體空間的,假設前提是壓縮後大小是小于等于壓縮前的。例如,如果原始檔案大小為10K,那麼它超過了8K,是以配置設定的記憶體是8 * 2 = 16K;再例如,原始檔案大小為18K,很明顯16K也是不夠的,那麼按照 8 * 2 * 2 = 32K的大小申請記憶體。如果沒有設定,預設值是申請跟原始資料相同大小的記憶體空間去存儲gzip壓縮結果。
gzip_buffers 2 8k;
#進行壓縮的原始檔案的最小大小值,也就是說如果原始檔案小于1K,那麼就不會進行壓縮了
gzip_min_length 1K;
# 預設值: gzip_http_version 1.1(就是說對HTTP/1.1協定的請求才會進行gzip壓縮)
# 識别http的協定版本。由于早期的一些浏覽器或者http用戶端,可能不支援gzip自解壓,使用者就會看到亂碼,是以做一些判斷還是有必要的。
# 注:99.99%的浏覽器基本上都支援gzip解壓了,是以可以不用設這個值,保持系統預設即可。
# 假設我們使用的是預設值1.1,如果我們使用了proxy_pass進行反向代理,那麼nginx和後端的upstream server之間是用HTTP/1.0協定通信的,如果我們使用nginx通過反向代理做Cache Server,而且前端的nginx沒有開啟gzip,同時,我們後端的nginx上沒有設定gzip_http_version為1.0,那麼Cache的url将不會進行gzip壓縮
gzip_http_version 1.1;
# 預設值:1(建議選擇為4)
# gzip壓縮比/壓縮級别,壓縮級别 1-9,級别越高壓縮率越大,當然壓縮時間也就越長(傳輸快但比較消耗cpu)。
gzip_comp_level 5;
#需要進行gzip壓縮的Content-Type的Header的類型。建議js、text、css、xml、json都要進行壓縮;圖檔就沒必要了,gif、jpge檔案已經壓縮得很好了,就算再壓,效果也不好,而且還耗費cpu。
gzip_types text/HTML text/plain application/x-javascript text/css application/xml;
# 禁用IE6的gzip壓縮,又是因為杯具的IE6。當然,IE6目前依然廣泛的存在,是以這裡你也可以設定為“MSIE [1-5].”
# IE6的某些版本對gzip的壓縮支援很不好,會造成頁面的假死,今天産品的同學就測試出了這個問題後來調試後,發現是對img進行gzip後造成IE6的假死,把對img的gzip壓縮去掉後就正常了為了確定其它的IE6版本不出問題,是以建議加上gzip_disable的設定
gzip_disable "msie6";
#[--壓縮--]
# 預設值:off
# Nginx作為反向代理的時候啟用,開啟或者關閉後端伺服器傳回的結果,比對的前提是後端伺服器必須要傳回包含"Via"的 header頭。
#off - 關閉所有的代理結果資料的壓縮
#expired - 啟用壓縮,如果header頭中包含 "Expires" 頭資訊
#no-cache - 啟用壓縮,如果header頭中包含 "Cache-Control:no-cache" 頭資訊
#no-store - 啟用壓縮,如果header頭中包含 "Cache-Control:no-store" 頭資訊
#private - 啟用壓縮,如果header頭中包含 "Cache-Control:private" 頭資訊
#no_last_modified - 啟用壓縮,如果header頭中不包含 "Last-Modified" 頭資訊
#no_etag - 啟用壓縮 ,如果header頭中不包含 "ETag" 頭資訊
#auth - 啟用壓縮 , 如果header頭中包含 "Authorization" 頭資訊
#any - 無條件啟用壓縮
gzip_proxied any;
#盡量發送壓縮過的靜态檔案
gzip_static on;
server { #主機字段
listen 80; #監聽端口
server_name www.zjswdlt.cn; #域名
location / {
root html; #頁面所在目錄
index index.html index.htm index.php; #首頁檔案
}
#error_page 404 /404.html; #404頁面
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ /\.ht { #禁止通路htxx檔案
deny all;
}
}
}
$remote_addr, $http_x_forwarded_for 記錄用戶端 IP
$remote_user 記錄用戶端使用者名稱
$request 記錄請求的 URL 和 HTTP Protocol
$status 記錄請求狀态
$body_bytes_sent 發送給用戶端的 Bytes,不包括 Header 的大小;該變數與 Apache mod_log_config 的 "%B" 相容
$bytes_sent 發送給用戶端的 總Bytes數
$connection 連接配接的序列号
$connection_requests 目前通過一個連接配接獲得的請求數量
$msec 日志寫入時間。機關為秒,精度是毫秒
$pipe 如果請求是通過HTTP流水線(pipelined)發送,pipe值為"p",否則為"."
$http_referer 記錄從哪個頁面連結通路過來的
$http_user_agent 記錄用戶端浏覽器相關資訊
$request_length 請求的長度(包括請求行,請求頭和請求正文)
$request_time 請求處理時間,機關為秒,精度毫秒; 從讀入用戶端的第一個位元組開始,直到把最後一個字元發送給用戶端後進行日志寫入為止
$time_iso8601 ISO8601标準格式下的本地時間
$time_local 通用日志格式下的本地時間
location可以對通路的URL路徑進行解析,将對不同路徑的通路請求比對到不同的規則上。通常将圖檔請求放到本地,php請求轉發給php-fpm解析。
文法規則: location [=|~|~*|^~] /uri/ { … }
= 表示精确比對,這個優先級也是最高的
^~ 表示 uri 以某個正常字元串開頭,了解為比對 url 路徑即可。 nginx 不對 url 做編碼,是以請求為
/static/20%/aa,可以被規則^~ /static/ /aa 比對到(注意是空格)。
~ 表示區分大小寫的正則比對
~* 表示不區分大小寫的正則比對(和上面的唯一差別就是大小寫)
!~和!~*分别為區分大小寫不比對及不區分大小寫不比對的正則
/ 通用比對,任何請求都會比對到,預設比對
多個 location 配置的情況下比對順序為:
優先級=>^~>
首先比對 =,其次比對^~, 其次是按檔案中順序的正則比對,最後是交給 / 通用比對。當有比對成功時候,停止
比對,按目前比對規則處理請求。
通路www..com/show 或者 www..com/show/ 傳回403
location ~ ^/(show|show/)$ {
return 403;
}
if是nginx配置檔案中的一個文法,可以用if和nginx的變量來比對一些東西,讓比對的ip或者是通路的頁面做某些限制或跳轉。
1.if規則。if 不支援 && 或 || 也不支援嵌套。如果需要利用 && 可以通過設定變量的方式。
正規表達式比對:
==:等值比較;
~:與指定正規表達式模式比對時傳回“真”,判斷比對與否時區分字元大小寫;
~*:與指定正規表達式模式比對時傳回“真”,判斷比對與否時不區分字元大小寫;
!~:與指定正規表達式模式不比對時傳回“真”,判斷比對與否時區分字元大小寫;
!~*:與指定正規表達式模式不比對時傳回“真”,判斷比對與否時不區分字元大小寫;
檔案及目錄比對判斷:
-f, !-f:判斷指定的路徑是否為存在且為檔案;
-d, !-d:判斷指定的路徑是否為存在且為目錄;
-e, !-e:判斷指定的路徑是否存在,檔案或目錄均可;
-x, !-x:判斷指定路徑的檔案是否存在且可執行;
1.需要将固定ip通路的時候,比如内網通路,可以看到一個管理頁面,其他ip通路将看到首頁
if ( $remote_addr = 192.168.2.148 ) { #比對通路位址是192.168.2.148的
set $my_ip 1; #将變量my_ip設定為1
}
if ( $my_ip = 1) { #等于1,則通路單獨頁面
rewrite ^/(.*)$ /one.html;
}
if ( $my_ip != 1) { #若不等于1,則讓他通路首頁
rewrite ^/(.*)$ /index.html;
}
我們使用了标準 ngx_rewrite 子產品的 set 配置指令對變量 $a 進行了指派操作。特别地,我們把字元串 hello world 賦給了它。
Nginx 變量的建立隻能發生在 Nginx 配置加載的時候,或者說 Nginx 啟動的時候;而指派操作則隻會發生在請求實際處理的時候。這意味着不建立而直接使用變量會導緻啟動失敗,同時也意味着我們無法在請求處理時動态地建立新的 Nginx 變量。
nginx變量隻能在同location生效,局部。
這裡我們使用第三方 ngx_echo 子產品的 echo 配置指令将 $foo 變量的值作為目前請求的響應體輸出。
server {
listen 8080;
location /test {
set $foo hello;
echo "foo: $foo";
}
}
# curl http://127.0.0.1/test
#輸出 foo: hello
1.set變量效果範圍
location / {
set $a "666";
echo "a: $a" ;
}
location /xx {
echo "a: $a";
}
下圖說明,set變量隻會在location中進行影響,相當于副本和局部變量
2.變量的傳遞
location / {
set $a "666";
rewrite ^ /xx ;
}
location /xx {
echo "a: $a"; #若$a後面有字元串,可以用${a}xx 隔開
}
從下圖可以看出變量是内部轉發到/xx區塊,但是變量是傳遞過去了。不同于301跳轉,目前是nginx内部跳轉。
3.set順序,nginx在執行中,先将set都實行一遍,再按echo的順序echo。
server {
listen 8080;
location /test {
set $a 11;
echo $a;
set $a 55;
echo $a;
}
}
# curl http://127.0.0.1/test
#輸出 55
# 55
echo_page可以将通路的狀态碼傳回固定的頁面。一般将404通路顯示一個特定頁面,而不是預設的。
将404頁面301跳轉到其他首頁,用于老的連結跳轉到新的頁面。
error_page 404 =301 http:/example.com/new/path.html;
1.找不到則将404轉發給後端處理
server {
location /images/ {
root /html;
#這裡的設定表示如果檔案沒有找到,不記錄這條日志資訊,因為後面的location正确處理了,是以沒有必要記錄
open_file_cache_errors off;
#将404頁面轉發給後面的location去處理,将$uri也轉交給後面
error_page 404 = /fetch$uri;
}
location /fetch/ {
proxy_pass http://backend/;
}
}
return一般用于接收到ip通路或非指定域名通路時會傳回指定錯誤(500)錯誤,或者用于流量引入至某個網站
重定向
location /test {
return 301 http:/www.52wiki.cn/
}
1.傳回404頁面
location /test {
return 404
}
本文版權歸作者所有,歡迎轉載,請務必添加原文連結。