[NGINX] - 配置文件優化 - NGINX.CONF

[NGINX] - 配置文件優化 - NGINX.CONF

標籤(空格分隔): Nginx


本文主要針對公司的Nginx負載均衡配置進行解釋,配置文件在最下方。因爲公司沒有使用PHP,所以NGINX裏面並沒有太多facgi模塊相關優化
1.gif-10kB

NGINX.CONF

user

語法: user user[group];
標籤: main

定義user和工作group 進程使用的憑證。如果group省略,user則使用名稱等於的組。

worker_processes

句法: worker_processes number | auto;
默認: worker_processes 1;
標籤: main
---------------------
例如,
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
將工作進程綁定到CPU集合。每個CPU集合由允許的CPU的位掩碼錶示。應該爲每個工作進程定義一個單獨的集合。默認情況下,工作進程不綁定到任何特定的CPU。

綁定每個工作進程到一個單獨的CPU

worker_processes 2;
worker_cpu_affinity 0101 1010;

error_log

語法:error_log file [level];
默認:error_log logs / error.log錯誤;
可用標籤:main,http,mail,stream,server,location
配置日誌記錄。可以在同一級別上指定多個日誌(1.5.2)。如果在main配置級別上,未明確定義將日誌寫入文件,將使用默認文件。

第一個參數定義file將存儲日誌。特殊值stderr選擇標準錯誤文件。可以通過指定“ ”前綴來配置日誌記錄到syslogsyslog:。 可以通過指定“ ”前綴和緩衝區來配置對循環內存緩衝區的日誌記錄 ,並且通常用於調試(1.7.11)。 memory:size

第二個參數決定了level日誌記錄,並且可以是下列之一: debug,info,notice, warn,error,crit, alert,或emerg。以上的日誌級別按嚴重性遞增的順序列出。設置特定日誌級別將導致記錄指定日誌級別和更嚴重日誌級別的所有消息。例如,默認級別error會導致error,crit, alert,和emerg被記錄的消息。如果省略此參數,則error使用。

worker_connections

句法: worker_connections number;
默認: worker_connections 512;
標籤: events

設置工作進程可以打開的最大併發連接數

應該記住,這個數字包括所有連接(例如,與代理服務器的連接等等),而不僅僅是與客戶端的連接。另一個考慮是同時連接的實際數量不能超過打開文件的最大數量的當前限制,可以通過worker_rlimit_nofile更改

include

句法: include file | mask;
標籤: any

包括另一個file,或匹配指定的文件mask,到配置。包含的文件應包含語法正確的指令和塊。

用法實例:
include mime.types;
include vhosts/*.conf;

default_type

語法:default_type  application/octet-stream;
標籤:http

default_type:屬於HTTP核心模塊指令,這裏設定默認類型爲二進制流,也就是當文件類型未定義時使用這種方式,例如在沒有配置php環境時,nginx是不予解析的。此時,用瀏覽器訪問php文件就會出現下載窗口。

log_format

常用語法:
 log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                           '$status $body_bytes_sent "$http_referer" '
                           '"$http_user_agent" "$http_x_forwarded_for"';
標籤:http

解釋:  nginx的HttpLog模塊指令,用於指定Nginx日誌輸出格式,acc爲此日誌輸出格式的名稱,可以在access_log指令中引用。

   在HTTP協議中,有一個表頭字段叫referer,使用URL格式來表示哪裏的鏈接用了當前網頁的資源。通過referer可以檢測目標訪問的來源網頁,如果是資源文件,可以跟蹤到顯示它的網頁地址,一旦檢測出來不是本站,馬上進行阻止或返回指定的頁面。
  HTTP Refererheader的一部分,當瀏覽器向Web服務器發送請求的時候,一般會帶上Referer,告訴服務器我是從哪個頁面鏈接過來的,服務器籍此可以獲得一些信息用於處理,Apache、Nginx、Lighttpd三者都支持根據http referer實現防盜鏈referer是目前網站圖片、附件、html最常用的盜鏈手段。

access_log

語法: 
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
默認: access_log logs/access.log combined;
標籤: http, server, location, if in location, limit_except

該ngx_http_log_module模塊中指定的格式寫入請求日誌。
緩衝區大小不能超過對磁盤文件的原子寫入大小。對於FreeBSD,這個大小是無限的。

啓用緩衝時,數據將寫入文件:
如果下一個日誌行不適合緩衝區;
如果緩衝的數據比flush 參數(1.3.10,1.2.7)指定的舊;
當工作進程重新打開日誌文件或正在關閉時。

access_log /path/to/log.gz combined gzip flush = 5m;
要使gzip壓縮工作,nginx必須使用zlib庫構建。

示例配置
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

sendfile

語法:sendfile on|off
默認:sendfile off
標籤:http,server,location,if in location 

sendfile參數用於開啓文件的高效傳輸模式,同時將tcp_nopush和tcp_nodelay兩個指定設爲on,可防止網絡及磁盤I/O阻塞,提升Nginx工作效率。

參數作用:激活或者禁用sendfile()功能。sendfile()是作用於兩個文件描述符之間的數據拷貝函數,這個拷貝操作是在內核之中,被稱爲“零拷貝”,sendfile()和readwrite函數要高效很多,因爲read和wrtie函數要把數據拷貝到應用層再進行操作。相關控制參數還有sendfile_max_chunk。

tcp_nopush

語法: tcp_nopush on | off; 
默認: tcp_nopush off;
標籤:http, server, location

參數作用:激活或禁用Linux上的TCP_CORK socker選項,此選項僅僅開啓sendfile時才生效,激活這個tcp_nopush參數可以運行把http response header和文件的開始放在一個文件裏發佈,減少網絡報文段的數量。

tcp_nodelay

語法:tcp_nodelay on | off;
默認:tcp_nodelay on;
標籤:http, server, location
參數作用:用於激活tcp_nodelay功能,提高I/O性能

默認情況下數據發送時,內核並不會馬上發送,可能會等待更多的字節組成一個數據包,這樣可以提高I/O性能,但是,在每次只發送很少字節的業務場景,使用tcp_nodelay功能,等待時間會比較長。

  參數生產條件:激活或禁用tcp_nodelay選項,當一個連接進入到keep-alive狀態時生效

keepalive_timeout

語法:keepalive_timeout timeout [header_timeout]; 
默認:keepalive_timeout 75s; 
標籤:http, server, location  

參數作用:nginx長鏈接 keep-alive可以使客戶端到服務端已經建立的連接一直工作不退出,當服務器有持續請求時,keep-alive會使用正在建立的連接提供服務,從而避免服務器重新建立新連接處理請求。

keepalive_requests

keepalive_requests 8192; --每個連接最大請求數
標籤:http, server, location 

client_max_body_size

語法:client_max_body_size size;
默認:client_max_body_size 1m;
標籤:http, server, location

參數作用:設置最大的允許客戶端請求主體大小,在請求頭域有“Content-Length”,如果超過了此配置值,客戶端會收到413錯誤,意思是請求的條目過大,有可能瀏覽器不能正確的顯示這個錯誤,設置爲0表示禁止檢查客戶端請求主體大小,此參數對服務端的安全有一定的作用。

gzip

標籤:http,server,location

gzip on;       #開啓gzip壓縮功能

gzip_buffers     4 16k;
#壓縮緩衝區大小,表示申請4個單位爲16K的內存作爲壓縮結果流緩存,默認是申請與原始是數據大小相同的內存空間來存儲gzip壓縮結果;

gzip_http_version 1.1;
#壓縮版本(默認1.1 前端爲squid2.5時使用1.0)用於設置識別HTTP協議版本,默認是1.1,目前大部分瀏覽器已經支持GZIP壓縮,使用默認即可。

gzip_comp_level 9;
#壓縮比率,用來指定GZIP壓縮比,1壓縮比最小,處理速度最快;9壓縮比最大,傳輸速度快,但處理最慢,也消耗CPU資源

gzip_types       text/plain application/x-javascript text/css application/xml;
#用來指定壓縮的類型,“text/html”類型總是會被壓縮,這個就是HTTP原理部分講的媒體類型。

gzip_vary on;
#vary hear支持,該選項可以讓前端的緩存服務器緩存經過GZIP壓縮的頁面,例如用緩存經過Nginx壓縮的數據

gzip_proxied

句法:gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
默認:gzip_proxied off;
根據請求和響應啓用或禁用代理請求的響應的gzipping。請求被代理的事實由“Via”請求頭字段的存在來確定。該僞指令接受多個參數:

off 禁用所有代理請求的壓縮,忽略其他參數;
expired 如果響應頭包括具有禁用緩存的值的“Expires”字段,則啓用壓縮;
no-cache 如果響應頭包括具有“”參數的“Cache-Control”字段,則no-cache啓用壓縮;
no-store 如果響應頭包括具有“”參數的“Cache-Control”字段,則no-store啓用壓縮;
private 如果響應頭包括具有“”參數的“Cache-Control”字段,則private啓用壓縮;
no_last_modified 如果響應報頭不包括“Last-Modified”字段,則啓用壓縮;
no_etag 如果響應報頭不包括“ETag”字段,則啓用壓縮;
auth 如果請求頭包括“授權”字段則啓用壓縮;
any 啓用對所有代理請求的壓縮。

proxy

proxy_connect_timeout
句法:proxy_connect_timeout time;
默認:proxy_connect_timeout 60s;
標籤:http,server,location
作用:定義與代理服務器建立連接的超時。應該注意,該超時通常不能超過75秒。

proxy_read_timeout
句法:proxy_read_timeout time;
默認:proxy_read_timeout 60s;
作用:定義從代理服務器讀取響應的超時。超時僅在兩次連續讀取操作之間設置,而不是用於傳輸整個響應。如果代理服務器在此時間內未發送任何內容,則連接將關閉。

proxy_send_timeout
句法:proxy_send_timeout time;
默認:proxy_send_timeout 60s;
作用:設置將請求傳輸到代理服務器的超時。超時僅在兩個連續的寫操作之間設置,而不是用於傳輸整個請求。如果代理服務器在此時間內未收到任何內容,則連接將關閉。

proxy_buffer_size
句法:proxy_buffer_size size;
默認:proxy_buffer_size 4k | 8k;
作用:設置size用於讀取從代理服務器接收的響應的第一部分的緩衝區。這部分通常包含一個小的響應頭。默認情況下,緩衝區大小等於一個內存頁。這是4K或8K,取決於一個平臺

proxy_buffers 
句法:proxy_buffers number size;
默認:proxy_buffers 8 4k | 8k;
作用:設置用於從代理服務器讀取單個連接的響應的緩衝區number和size緩衝區。默認情況下,緩衝區大小等於一個內存頁。這是4K或8K,取決於一個平臺。

proxy_buffering
句法:proxy_buffering on | off;
默認:proxy_buffering on;
啓用或禁用來自代理服務器的響應緩衝。

當啓用緩衝時,nginx會盡快從代理服務器接收響應,將其保存到由proxy_buffer_size和proxy_buffers指令設置的緩衝區中 。如果整個響應不適合內存,它的一部分可以保存到磁盤上的臨時文件。寫入臨時文件是由控制 proxy_max_temp_file_size和 proxy_temp_file_write_size指令。

當禁用緩衝時,響應在接收到時立即同步傳遞到客戶端。nginx不會嘗試從代理服務器讀取整個響應。該nginx的可以同時接收來自服務器的數據的最大尺寸是由設置proxy_buffer_size指令。

還可以通過在“X-Accel-Buffering”響應頭字段中傳遞“ yes”或“ no” 來啓用或禁用緩衝。此功能可以使用proxy_ignore_headers指令禁用 


proxy_busy_buffers_size
句法:proxy_busy_buffers_size size;
默認:proxy_busy_buffers_size 8k | 16k;
作用:當緩衝啓用從代理服務器的響應,限制了總size緩衝器,可以是忙於發送到客戶端的響應,而該響應還沒有完全讀出。同時,其餘的緩衝區可以用於讀取響應,並且如果需要,緩衝對臨時文件的響應的一部分。默認情況下,size受限於由proxy_buffer_size和proxy_buffers指令設置的兩個緩衝區的大小 。

proxy_cache
句法:proxy_cache zone | off;
默認:proxy_cache off;
作用:定義用於緩存的共享內存區域。同一區域可以在幾個地方使用。參數值可以包含變量(1.7.9)。該off參數禁用從先前配置級別繼承的緩存。


proxy_temp_file_write_size
句法:proxy_temp_file_write_size size;
默認:proxy_temp_file_write_size 8k | 16k;
作用:size當啓用從代理服務器到臨時文件的響應緩衝時, 限制寫入臨時文件的數據。默認情況下,size受限於由proxy_buffer_size和proxy_buffers指令設置的兩個緩衝區 。臨時文件的最大大小由proxy_max_temp_file_size指令設置 。

large_client_header_buffers

句法:large_client_header_buffers number size;
默認:large_client_header_buffers 4 8k;
標籤:http, server
作用:設置用於讀取大客戶端請求標頭的最大值number和size緩衝區。請求行不能超過一個緩衝區的大小,或者414(Request-URI Too Large)錯誤返回到客戶端。請求頭字段也不能超過一個緩衝區的大小,或者400(錯誤請求)錯誤返回到客戶端。緩衝區僅在需要時分配。默認情況下,緩衝區大小等於8K字節。如果在請求處理結束之後,連接被轉換到保持活動狀態,則釋放這些緩衝器。

client_header_buffer_size

句法:client_header_buffer_size size;
默認:client_header_buffer_size 1k;
標籤:http, server
作用:設置讀取客戶端請求標頭的緩衝區大小。對於大多數請求,1K字節的緩衝區就足夠了。但是,如果請求包括長Cookie,或來自WAP客戶端,它可能不適合1K。如果請求行或請求頭字段不適合該緩衝區,則分配由large_client_header_buffers指令配置的較大緩衝區 。

proxy_temp_path

語法:proxy_temp_path path [level1 [level2 [level3]]];
默認:proxy_temp_path proxy_temp;
標籤:http, server, location

定義用於存儲具有從代理服務器接收的數據的臨時文件的目錄。最多可以在指定目錄下使用三級子目錄層次結構。例如,在以下配置中
proxy_temp_path / spool/nginx/roxy_temp 1 2;

proxy_cache_path

句法:proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
標籤:http

設置緩存的路徑和其他參數。緩存數據存儲在文件中。高速緩存中的文件名是將MD5函數應用於 高速緩存密鑰的結果。該levels參數定義高速緩存的層次結構級別:從13,每個級別接受值12.例如,在以下配置中
proxy_cache_path /data/nginx/cache levels = 12 keys_zone = one:10m;
proxy_cache one;  #引用
緩存中的文件名將如下所示:
/data/nginx/cache/c/29/ b7f54b2df7773722d382f4809d650 29c

緩存的響應首先寫入臨時文件,然後重命名該文件。從版本0.8.9開始,臨時文件和緩存可以放在不同的文件系統上。但是,請注意,在這種情況下,文件將跨兩個文件系統複製,而不是廉價的重命名操作。因此,建議對於任何給定的位置,緩存和保存臨時文件的目錄放在同一文件系統上。臨時文件的目錄是根據use_temp_path參數(1.7.10)設置的。如果省略此參數或將其設置爲該值on,則將使用由proxy_temp_path僞指令爲給定位置設置的目錄。如果該值設置爲off,臨時文件將直接放在緩存目錄中。

此外,所有的活性密鑰和有關數據的信息被存儲在共享存儲器區,其name與size 由配置keys_zone參數。一兆字節區域可以存儲大約8,000個密鑰。

在參數指定的時間內未訪問的緩存數據 inactive從緩存中刪除,而不管其新鮮度。默認情況下,inactive設置爲10分鐘。

特殊的“緩存管理器”進程監視由參數設置的最大緩存大小max_size。當超過此大小時,它會刪除最近使用的最少數據。數據是在由被配置迭代除去 manager_files, manager_threshold和 manager_sleep參數(1.11.5)。在一次迭代過程中,不超過manager_files項目被刪除(默認爲100)。一次迭代的持續時間受參數限制 manager_threshold(默認爲200毫秒)。在迭代之間,進行由manager_sleep 參數(默認爲50毫秒)配置的暫停。

啓動後一分鐘,特殊的“緩存加載器”進程被激活。它將關於存儲在文件系統上的先前高速緩存的數據的信息加載到高速緩存區中。加載也在迭代中完成。在一次迭代期間,不會loader_files加載任何項目(默認值爲100)。此外,一次迭代的持續時間受參數限制 loader_threshold(默認爲200毫秒)。在迭代之間,進行由loader_sleep 參數(默認爲50毫秒)配置的暫停。

purger= on|off
指示與通配符鍵匹配的高速緩存條目是否 將由高速緩存清除器從磁盤中刪除(1.7.12)。將參數設置爲on (默認爲off)將激活“緩存清除器”進程,該進程將永久遍歷所有緩存條目並刪除與通配符鍵匹配的條目。

purger_files=number
設置在一次迭代(1.7.12)期間將掃描的項目數。默認情況下,purger_files設置爲10。

purger_threshold=number
設置一次迭代的持續時間(1.7.12)。默認情況下,purger_threshold設置爲50毫秒。

purger_sleep=number
設置迭代之間的暫停(1.7.12)。默認情況下,purger_sleep設置爲50毫秒。

proxy_cache_key

句法: proxy_cache_key string;
默認: proxy_cache_key $ scheme $ proxy_host $ request_uri;
標籤: http,server,location

例如,定義緩存的鍵
proxy_cache_key“$ host $ request_uri $ cookie_user”;

默認情況下,指令的值接近字符串
proxy_cache_key $ scheme $ proxy_host $ uri $ is_args $ args;

proxy_cache_valid

句法:proxy_cache_valid [code ...] time;
默認: - -
標籤:http,server,location

設置不同響應代碼的緩存時間。例如,以下指令
對代碼200302的響應設置10分鐘的緩存,對代碼404的響應設置爲1分鐘。
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;

如果只緩存time指定
proxy_cache_valid 5m;
那麼只緩存200,301302響應。

此外,any可以指定參數以緩存任何響應
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;

緩存的參數也可以直接在響應頭中設置。這比使用指令設置緩存時間具有更高的優先級。

“X-Accel-Expires”頭字段設置響應的緩存時間(以秒爲單位)。零值禁用緩存用於響應。如果值以@前綴開頭,則它設置自Epoch開始的以秒爲單位的絕對時間,直到響應可以被緩存。
如果報頭不包括“X-Accel-Expires”字段,則可以在報頭字段“Expires”或“Cache-Control”中設置高速緩存的參數。
如果頭包括“Set-Cookie”字段,則這樣的響應將不被緩存。
如果頭包括具有特殊值“ *” 的“Vary”字段,則這樣的響應將不被緩存(1.7.7)。如果報頭包括具有另一個值的“Vary”字段,則這樣的響應將被緩存,考慮相應的請求報頭字段(1.7.7)。
可以使用proxy_ignore_headers指令禁用對這些響應頭字段中的一個或多個的處理。

proxy_no_cache

句法:proxy_no_cache string ...;
字段:http,server,location
定義響應不會保存到緩存的條件。如果字符串參數的至少一個值不爲空,並且不等於“0”,則不會保存響應:
proxy_no_cache $ cookie_nocache $ arg_nocache $ arg_comment;
proxy_no_cache $ http_pragma $ http_authorization;
可以與proxy_cache_bypass指令一起使用。

proxy_set_header

句法:proxy_set_header field value;
默認:proxy_set_header Host $ proxy_host;
     proxy_set_header連接關閉;
標籤:http,server,location

允許將字段重新定義或附加到傳遞到代理服務器的請求標頭 。在value可以包含文本,變量,和它們的組合。當且僅當沒有proxy_set_header 在當前級別上定義指令時,這些指令從上一級 繼承。

默認情況下,只重新定義兩個字段:
proxy_set_header Host $ proxy_host;
proxy_set_header連接關閉;

該ngx_http_proxy_module模塊允許將請求傳遞到另一個服務器
http / {
    proxy_pass http:// localhost:8000;
    proxy_set_header Host $ host;
    proxy_set_header X-Real-IP $ remote_addr;
}}


未更改的“主機”請求頭字段可以像這樣傳遞:
proxy_set_header Host $ http_host;

但是,如果此字段不存在於客戶端請求標頭中,則不會傳遞任何內容。在這種情況下,最好使用$host變量 - 其值等於“主機”請求頭字段中的服務器名稱或主服務器名稱(如果此字段不存在)
proxy_set_header Host $ host;

此外,服務器名稱可以與代理服務器的端口一起傳遞:
proxy_set_header Host $ host:$ proxy_port;

如果頭字段的值是空字符串,那麼此字段不會傳遞到代理服務器:
proxy_set_header Accept-Encoding“”;


允許重新定義或者添加發往後端服務器的請求頭。value可以包含文本、變量或者它們的組合。 當且僅當當前配置級別中沒有定義proxy_set_header指令時,會從上面的級別繼承配置。 默認情況下,只有兩個請求頭會被重新定義:
proxy_set_header Host       $proxy_host;
proxy_set_header Connection

http_cookie

proxy_set_header Cookie $http_cookie;
標籤:http,server
在proxy or fcgi 等場景給Cookies增加內容,比如,告訴後端你是那一臺fron                             
proxy_set_header Cookie "$http_cookie; node_id=018"
這裏增加了名爲node_id的一個cookie進去,當然,就這個例子來說,也可以這樣傳遞前端的ID給backend:
還需要在server字段進行引用   

X-Forwarded-For

在默認情況下,Nginx並不會對X-Forwarded-For頭做任何的處理,除非用戶使用proxy_set_header 參數設置:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for

$proxy_add_x_forwarded_for變量包含客戶端請求頭中的"X-Forwarded-For",與$remote_addr用逗號分開,如果沒有"X-Forwarded-For" 請求頭,則$proxy_add_x_forwarded_for等於$remote_addr$remote_addr變量的值是客戶端的IP。



當Nginx設置X-Forwarded-For$proxy_add_x_forwarded_for後會有兩種情況發生:

1、如果從CDN過來的請求沒有設置X-Forwarded-For頭(通常這種事情不會發生),而到了我們這裏Nginx設置將其設置爲$proxy_add_x_forwarded_for的話,X-Forwarded-For的信息應該爲CDN的IP,因爲相對於Nginx負載均衡來說客戶端即爲CDN,這樣的話,後端的web程序時死活也獲得不了真實用戶的IP的。

2、CDN設置了X-Forwarded-For,我們這裏又設置了一次,且值爲$proxy_add_x_forwarded_for的話,那麼X-Forwarded-For的內容變成 ”客戶端IP,Nginx負載均衡服務器IP“如果是這種情況的話,那後端的程序通過X-Forwarded-For獲得客戶端IP,則取逗號分隔的第一項即可。

 如上兩點所說,如果我們知道了CDN設置了X-Forwarded-For信息,且只有客戶端真實的IP的話,那麼我們的Nginx負載均衡服務器可以不必理會該頭,讓它默認即可。

其實Nginx中還有一個$http_x_forwarded_for變量,這個變量中保存的內容就是請求中的X-Forwarded-For信息。如果後端獲得X-Forwarded-For信息的程序兼容性不好的話(沒有考慮到X-Forwarded-For含有多個IP的情況),最好就不要將X-Forwarded-For設置爲 $proxy_add_x_forwarded_for。應該設置爲$http_x_forwarded_for或者乾脆不設置!

proxy_set_header Accept-Language "zh-CN";設置語言爲中文

user_agent

proxy_set_header User-Agent $http_user_agent;

關於上面參數我們先要知道什麼是User_Agent

介紹User Agent的含義,以及User Agent各部分的意義 “User
Agent”也被稱爲是用戶代理,現在被廣泛用來標識瀏覽器客戶端信息。User
Agent在互聯網早期就已經存在,那時互聯網是完全基於文本的,用戶直接瀏覽器互聯網時需要敲入各種鍵盤命令。後來開發人員開發出多種瀏覽工具來幫助進行互聯網瀏覽,這些工具就被稱爲是用戶“代理”(User
Agent),因爲這些工具模仿用戶敲入命令的行爲,但是用戶並不需要了解獲取信息的複雜命令。目前幾乎所有人都採用網絡瀏覽器來作爲用戶代理User
Agent。

有時候網站需要獲取客戶端的信息,以瞭解網站內容在客戶端的展現方式,因此大部分用戶代理會向網站發送用戶代理字段(User Agent
String),該字符串通常是由字母和數字組成的。

因此,各種不同的網絡瀏覽器(Internet Explorer,Firefox,Opera,遨遊、搜狗)會用不同的用戶代理字符串(user
agent
strings)來作爲自身的標誌。同時,像Google、Yahoo、Bing和百度這種搜索引擎,在通過網絡爬蟲來訪問網頁時,也會通過用戶代理字符串(user
agent strings)來進行作爲自身標誌。這也是爲何網站統計報告中都能夠統計瀏覽器信息以及爬蟲信息。

用戶代理字符串通常包括6個不同的部分,瀏覽器標識 (操作系統標識; 加密等級標識; 瀏覽器語言) 渲染引擎標識 版本信息 :
image_1b9idje20aoo9qj18s41avm16ot9.png-26.2kB

從上圖可知:上面的用戶代理字符串(user agent string)例子中,客戶端所用的瀏覽器是Internet
Explorer7。其他的瀏覽器如Firefox、Chrome、Opera、遨遊等的用戶代理字符串(user agent
string)與上面比較類似,詳情請見我們提供的常見的User Agent內容。

User Agent的結構 根據上面的介紹,大家瞭解到了用戶代理User Agent的基本意義,那用戶代理User Agent具體怎麼用呢?譬如當用戶使用Firefox訪問下載網站時,網站通過用戶代理字符串User Agent
String獲取到該用戶的瀏覽器版本,發現該版本的Firefox難以完美地展現網站的內容,就可以給出個性化的提示:“您可以試試最新版的Firefox,這樣能夠展現最新的WebGL和HTML5內容”。另外,網站還可以根據用戶代理字符串User
Agent String來給出不同的CSS文件,以保證在不同的瀏覽器上均能夠展現出最好的效果。

上面兩個例子都是用戶代理字符串User Agent String分析的典型場景。下圖是相關流程的示意圖:
image_1b9idkk0q13p2fr6i9l11n1re5m.png-46.2kB

expires

語法:expires time
標籤:server,http

在網站的開發和運營中,對於圖片 視頻 css js等網站元素的更改機會較少,特別是圖片,這時可以將圖片設置在客戶端瀏覽器本地緩存365天或3650天,而降css、js、html等代碼緩存10~30天,這樣用戶第一次打開頁面後,會在本地的瀏覽器按照過期日期緩存響應的內容,下次用戶再打開類似頁面,重複的元素就無需下載了,從而加快了用戶訪問速度,由於用戶的訪問請求和數據減少了,因此節省了服務器端大量的帶寬。此功能和apache的expire相似。

Nginx expires 功能優點 
1.Expires可以降低網站的帶寬,節約成本。 
2.加快用戶訪問網站的速度,提升了用戶訪問體驗。 
3.服務器訪問量降低了,服務器壓力就減輕了,服務器成本也會降低,甚至可以解決人力成本。 
對於幾乎所有Web來說,這是非常重要的功能之一,Apache服務也由此功能。

location ~.*\.(gif|jpg|jpeg|png|bmp|swf)$
   {
   expires 3650d;
   }

fastcgi_connect_timeout

句法:fastcgi_connect_timeout time;
默認:fastcgi_connect_timeout 60s;
標籤:http,server,location
定義與FastCGI服務器建立連接的超時。應該注意,該超時通常不能超過75秒。

fastcgi_send_timeout

句法:fastcgi_send_timeout time;
默認:fastcgi_send_timeout 60s;
標籤:http,server,location

設置將請求發送到FastCGI服務器的超時。超時僅在兩個連續的寫操作之間設置,而不是用於傳輸整個請求。如果FastCGI服務器在此時間內未收到任何內容,則連接將關閉。

fastcgi_read_timeout

句法:fastcgi_read_timeout time;
默認:fastcgi_read_timeout 60s;
標籤:http,server,location

定義從FastCGI服務器讀取響應的超時。超時僅在兩次連續讀取操作之間設置,而不是用於傳輸整個響應。如果FastCGI服務器在此時間內未發送任何內容,則連接將關閉

fastcgi_buffer_size

句法:fastcgi_buffer_size size;
默認:fastcgi_buffer_size 4k | 8k;
標籤:http,server,location

設置size用於讀取從FastCGI服務器接收的響應的第一部分的緩衝區。這部分通常包含一個小的響應頭。默認情況下,緩衝區大小等於一個內存頁。這是4K8K,取決於一個平臺

fastcgi_buffers

句法:fastcgi_buffers number size;
默認:fastcgi_buffers 8 4k | 8k;
標籤:http,server,location

設置用於從FastCGI服務器讀取單個連接的響應的緩衝區number和size緩衝區。默認情況下,緩衝區大小等於一個內存頁。這是4K8K,取決於一個平臺。

fastcgi_busy_buffers_size

句法:fastcgi_busy_buffers_size size;
默認:fastcgi_busy_buffers_size 8k | 16k;
標籤:http,server,location

當緩衝啓用從FastCGI的服務器的響應,限制了總size緩衝器,可以是忙於發送到客戶端的響應,而該響應還沒有完全讀出。同時,其餘的緩衝區可以用於讀取響應,並且如果需要,緩衝對臨時文件的響應的一部分。默認情況下,size受限於fastcgi_buffer_size和fastcgi_buffers指令設置的兩個緩衝區的大小 。

fastcgi_temp_file_write_size

句法:fastcgi_temp_file_write_size size;
默認:fastcgi_temp_file_write_size 8k | 16k;
標籤:http,server,location

size當啓用從FastCGI服務器到臨時文件的響應緩衝時,一次 限制寫入臨時文件的數據。默認情況下,size受限於由fastcgi_buffer_size和fastcgi_buffers指令設置的兩個緩衝區 。臨時文件的最大大小由fastcgi_max_temp_file_size指令設置 。

附上一個公司的Nginx.conf

硬盤:
[root@boxuegu ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda1              20G   15G  5.7G  72% /
tmpfs                 4.0G     0  4.0G   0% /dev/shm
/dev/xvdb1            197G   73G  114G  40% /data

內存
[root@boxuegu ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          7993       7434        558          0        305       5300
-/+ buffers/cache:       1828       6164
Swap:            0          0          0
[root@boxuegu ~]# uname -r
2.6.18-308.el5


提示:這是線上的一臺nginx負載均衡服務器
user  root;
worker_processes  4;

error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

events {
    worker_connections  15535;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;
    tcp_nopush     on;

    keepalive_timeout  65;
    client_max_body_size 300m;
    gzip on;
    gzip_buffers     4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 9;
    gzip_types       text/plain application/x-javascript text/css application/xml;
    gzip_vary on;


    proxy_connect_timeout    3;
    proxy_read_timeout       60;
    proxy_send_timeout       60;
    #proxy_buffer_size        12800k;
    #proxy_buffers            4 16400k;
    #proxy_busy_buffers_size 12800k;
    #proxy_temp_file_write_size 12800k;
    #gzip  on;

    large_client_header_buffers 4 512k;
    client_header_buffer_size 512k;
    proxy_temp_path  /data/nginx/temp;
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;

   fastcgi_intercept_errors on;

    upstream yx.abcdocker.com{
        server  abcdocker.com:8280;
        ip_hash;
    }

    upstream upnew.abcdocker.com{
        server  abcdocker.com:80;
        ip_hash;
    }

    upstream up.abcdocker.com{
        server  abcdocker.com:8081;
        ip_hash;
    }

    upstream ask.abcdocker.com{
    server abcdocker.com:80;
    ip_hash;
    }

    upstream bxg.tbh.abcdocker.com{
    server 127.0.0.1:8205;
    ip_hash; 
    }

    upstream league{
        server  127.0.0.1:8080;
        ip_hash;
    }

    server {
        listen       80;
        server_name  www.abcdocker.com;

        access_log  logs/www.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        proxy_pass              http://www.abcdocker.com;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        Host $http_host;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    server {
    listen 80;
    server_name ask.abcdocker.com;
    access_log  logs/ask.access.log main;

    location / {
        proxy_pass              http://ask.abcdocker.com;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        Host $http_host;
    }

    error_page  500 502 503 504 /50x.html;
    location = /50x.html {
        root html;
    }
    }

    server {
    listen 80;
    server_name bxg.tbh.abcdocker.com;
    access_log logs/tbh.access.log main;

    location / {
        proxy_pass          http://bxg.tbh.abcdocker.com;
        proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        Host $http_host;
    }

    error_page  500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }

    server {
        listen       80;
        server_name  st.abcdocker.com;

        access_log  logs/st.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass              http://league;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        Host $http_host;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    server {
        listen       80;
        server_name  yx.abcdocker.com;

        access_log  logs/yx.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass              http://yx.abcdocker.com;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        Host $http_host;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    server {
        listen       80;
        server_name  up.abcdocker.com;

        access_log  logs/up.access.log  main;

        location ^~ /study/ {
            root   html;
            index  index.html index.htm;
            proxy_pass              http://up.abcdocker.com;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        Host $http_host;
        }

        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass              http://upnew.abcdocker.com;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        Host $http_host;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
         listen       80;
         server_name club.abcdocker.com;
         root   /data/webapps/club;

         location / {
             index  index.html index.htm;
         }
    }
    server {
         listen       80;
         server_name book.abcdocker.com;

         root   /data/webapps/book;
         location / {
             index  index.html index.htm;
         }
    }

    server {
         listen       80;
         server_name dvd.abcdocker.com;
         root   /data/webapps/dvd;

         location / {
             index  index.html index.htm;
         }
    }

    server {
         listen       80;
         server_name openclass.abcdocker.com;

         root   /data/webapps/openclass;
         location / {
             index  index.html index.htm;
         }
    }


    server {
         listen       80;
         server_name resource.abcdocker.com;

         root   /data/webapps/resource;
         location / {
             index  index.html index.htm;
         }
    }
}

[Nginx] – 性能優化 – 配置文件優化 [1]
[Nginx] – 安全優化 – 配置文件優化 [2]

Nginx幫助文檔
Nginx配置文檔

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