1. 程式人生 > 其它 >淺談資料結構和資料型別

淺談資料結構和資料型別

目錄

一.配置

配置檔案結構

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

簡介

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語句

簡介

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;
}

五.set變數

簡介

我們使用了標準 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

簡介

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/;
    }
}

七.Nginx_return

簡介

return一般用於接收到ip訪問或非指定域名訪問時會返回指定錯誤(500)錯誤,或者用於流量引入至某個網站

語法配置

重定向

location /test {
	return 301 http:/www.52wiki.cn/
}

例子

1.返回404頁面

location /test {
	return 404
}
本文版權歸作者所有,歡迎轉載,請務必新增原文連結。