一、nginx.conf結構分析javascript
nginx配置文件中主要包括六塊:main,events,http,server,location,upstreamphp
main 塊:(全局設置)主要控制 nginx子進程的所屬用戶/用戶組、派生子進程數、css
events塊:控制 nginx處理鏈接的方式html
http塊:是nginx處理http請求的主要配置模塊,大多數配置都在這裏面進行java
upstream塊:用於設置一系列後端服務器,nginx作反向代理、後端服務器負載均衡相關配置,能夠有多個node
server塊:用於指定虛擬主機域名、IP和端口,能夠配置多個虛擬主機linux
location塊:是server中對應的目錄級別的控制塊,URL匹配特定位置後的設置,能夠有多個nginx
他們之間的關係式:server繼承main,location繼承server;upstream既不會繼承指令也不會被繼承。它有本身的特殊指令,不須要在其餘地方的應用。web
二、nginx配置命令解釋正則表達式
nginx中每條配置命令都必需要以分號「;」結束!
user nobody; //配置nginx 子進程使用的用戶和組 worker_processes 1; //配置nginx工做進程數,建議跟指定CPU數量同樣多 error_log logs/error.log notice; //配置錯誤日誌的存放位置,錯誤日誌的級別有:debug,info,notice,warn,error,crit pid logs/nginx.pid; //指定nginx master pid的存放路徑 worker_rlimit_nofile 51200; //配置文件描述符數量,最大爲系統最多打開文件數(ulimit -n)與nginx進程數相除,可是nginx分配請求並非那麼均勻,因此最好與ulimit -n 的值保持一致 events { use epoll; //使用網絡I/O模型,linux系統推薦使用epoll,FreeBSD推薦使用kqueue worker_connections 1024; //容許併發鏈接的最大請求數,理論上每臺nginx服務器的最大鏈接數爲worker_processes*worker_connections #multi_accept on; //暫時還沒了解其做用 } http { include mime.types; //包含指定的文件(能夠含路徑) default_type application/octet-stream; //文件類型未定時,默認類型爲二進制流 #charset utf-8; //默認的字符編碼集 #include upstream.conf; //可單獨配置,include 進來 upstream ixdba.net{ //負載均衡器名字 ip_hash; //調度算法:輪詢(默認),weight(須要設置權值weight=1;),ip_hash(來自同一個 ip的訪客固定訪問一個後端服務器),fair和 url_hash(第三方) server 192.168.12.133:80; server 192.168.12.134:80 down; //暫不參加負載均衡 server 192.168.12.133:8090 max_fails=3 fail_timeout=20s; //容許請求失敗的次數,默認1,當超過期返回 proxy_next_upstream 定義錯誤; #server 192.168.12.135:8090 backup; //當算法爲 ip_hash 時不可用,預留備份機器,當非 backup 機器忙或故障時啓用, } //配置訪問日誌格式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" "$http_cookie" "$http_user_agent" ' '$request_time $logid $remote_addr $server_addr $upstream_addr $host ' '"$http_x_forwarded_for" $product $subsys $tracecode $msec'; access_log logs/host.access.log main; //啓用訪問日誌,而且指定日誌採用的格式 server_names_hash_bucket_size 128; // client_header_buffer_size 4k; //客戶端請求頭的 headerbuffer 大小;若是自定義消息頭或 cookie 大,可適當調大 large_client_header_buffers 4 32k; //客戶端請求中較大的消息頭的緩存最大數目和大小 client_max_body_size 4m; //容許客戶端請求的最大單個文件; client_body_buffer_size 513k; open_log_file_cache max=10 inactive=60s valid=1m min_uses=2; ###max : 設置緩存中描述符的最大數量;若是緩存被佔滿,最近最少使用(LRU)的描述符將被關閉。 ###inactive : 設置緩存文件描述符在多長時間內沒有被訪問就關閉; 默認爲10秒。 ###min_uses : 設置在inactive參數指定的時間裏, 最少訪問多少次才能使文件描述符保留在緩存中;默認爲1。 ###valid :設置一段用於檢查超時後文件是否仍以一樣名字存在的時間; 默認爲60秒。 sendfile on; //開啓高效文件傳輸模式,將tcp_nopush和 tcp_nodelay 開啓,用於防止網絡阻塞 tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; #長鏈接 send_timeout 10; #響應客戶端的超時時間,這個超時僅限於連個鏈接活動之間 ####FastCGI相關參數是爲了改善網站的性能:減小資源佔用,提升訪問速度。 fastcgi_connect_timeout 50; fastcgi_send_timeout 10; fastcgi_read_timeout 10; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; fastcgi_intercept_errors on; gzip on; //是否開啓gzip壓縮(還須要和其它配置項共同起做用),實時壓縮數據流 gzip_min_length 1k; // gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; policy_frame off; policy_path "<path>webserver/conf/"; policy_dtdname policy.dtd; policy_docname policy.xml; policy_logpath "<path>log/webserver"; policy_logfile policy.; policy_logsize 1600; policy_loglevel 16; proxy_connect_timeout 15s; #nginx跟後端服務器鏈接超時時間(代理鏈接超時) proxy_read_timeout 24s; #鏈接成功後,後端服務器響應時間(代理接收超時) proxy_send_timeout 10s; #後端服務器數據回傳時間(代理髮送超時) proxy_buffer_size 64k; #設置代理服務器(nginx)保存用戶頭信息的緩衝區大小 proxy_buffers 4 64k; #proxy_buffers緩衝區,網頁平均在32k如下的設置 proxy_busy_buffers_size 128k; #高負荷下緩衝大小(proxy_buffers*2) proxy_temp_file_write_size 128k; #設定緩存文件夾大小,大於這個值,將從upstream服務器傳 proxy_set_header LOGID $logid; proxy_set_header Host $http_host; uninitialized_variable_warn off; set_real_ip_from 10.0.0.0/8; real_ip_header CLIENTIP; include php.conf; #server配置單獨配置,減小主配置文件複雜度 }
server塊配置文件
server { listen 8234; //主機監聽端口(能夠是ip:port格式,默認監聽127.0.0.1) server_name 192.168.12.188 www.ixdba.net; //指定 IP 地址或域名,多個用空格分開 more_set_headers 'Server: Apache'; set $php_upstream 'unix:var/php-cgi.sock'; #set $php_upstream 'unix:var/hhvm.sock'; add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST'; ####設置 access_log日誌按小時切割### if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})") { set $year $1; set $month $2; set $day $3; set $hour $4; set $minutes $5; set $seconds $6; } access_log "/home/aaa/log/webserver/access.log.$year$month$day$hour" main; ####統一配置全局的rewrite規則,rewrite文件 include rewrite; #######location###能夠在location裏設置 proxy ,實現動靜分離 location ~* /((.*)\.(.*)\/(.*)\.php){ deny all; } #圖片緩存時間設置 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 10d; } location ~ .*\.(js|css)?$ { expires 1h; //配置全部的js,css文件緩存1小時 } location /sample/ { root /home/aaa/sample/webroot; # index index.php; fastcgi_pass $php_upstream; include fastcgi.conf; rewrite ^/sample(/[^\?]*)?((\?.*)?)$ /sample/index.php$1$2 break; } }
4.1 break指令:
語法:break;
默認值:none
使用範圍:if,server,location
做用:完成當前的規則集,再也不處理rewrite指令,須要和last加以區分
4.2 if指令:
語法:if ( condition ) { ... }
默認值:none
使用範圍:server,location
做用:用於檢測一個條件是否符合,符合則執行大括號內的語句。不支持嵌套,不支持多個條件&&或||處理
condition的範圍:
4.2.1 變量名,可是不包括空字符串「」,或者任何以0開始的字符串
4.2.2 變量能夠比較,用「=」或者「!=」
4.2.3 變量能夠匹配正則表達式,用「~*」(不區分大小寫)或者「~」(區分大小寫),能夠採用「!」來表示取反,如「!~」或者「!~*」
4.2.4 「!-f」和「-f」用來判斷文件是否存在
4.2.5 「-e」和「!-e」用來文件或者目錄是否存在
4.2.6 「-d」和「!-d」用來判斷目錄是否存在
4.2.7 「-x」和「!-x」用來判斷文件是否可執行
4.2.8 正則表達式中支持「()」分組,分組的值在後面能夠經過$1~$9來引用
4.3 return指令:
語法:return code;
默認值:none
使用範圍:server,if,location
做用:用於結束規則的執行和返回狀態碼給客戶端。狀態碼的值能夠是:204,400,402~406,408,410,411,413,416以及500~504,另外非標準狀態碼444,表示以不發送任何的Header頭來結束鏈接。
4.4 rewrite指令:
語法:rewrite regex replacement flag;
默認值:none
使用範圍:server,if,location
做用:該指令用於重定向URI或者更改字符串的內容,指令根據配置文件中的順序來執行。注意:rewrite只針對相對路徑,即匹配的是URL地址中主機名以後的內容。若是你想匹配主機名,則須要使用 if 語句。
flag標記:
last --- 至關於Apache中的[L]標記,表示該條是最後一條規則,後面的規則不繼續匹配,可是要從新發起請求
break --- 本條規則匹配完成後,終止匹配,再也不匹配後面的規則
redirect --- 返回302重定向地址,瀏覽器地址欄會顯示跳轉後的地址
premanent --- 返回301永久重定向,瀏覽器地址欄會顯示跳轉後的地址
說明:last 和 break 做用相似,可是它們之間有必定的區別。在使用 alias 指令時必需要用 last 標記,在使用 proxy_pass 指令時則要使用 break 標記。last 標記表示,在本條rewrite規則執行完成以後須要對其所在的 server 段從新發起請求,而 break 則在本條規則匹配完成以後,終止匹配,再也不對後面的的規則匹配。一般狀況下,在「根location」中,如:location / { ... } 或者在 server 中直接編寫的 rewrite 指令,推薦使用 last ,而在其它塊兒中則推薦使用 break。
4.5 set指令:
語法:set variable value;
默認值:none
使用範圍:server,location,if
做用:該指令用於定義一個變量,而且給變量進行賦值。變量的值能夠是文本、一個變量或者變量和文本的聯合,文本須要用引號引發來。
4.6 uninitalized_variable_warn指令:
語法:uninitalized_variable_warn on|off;
默認值: on
使用範圍:http,server,location,if
做用:用於開啓或者關閉記錄關於未初始化變量的警告信息
nginx中可使用的全局變量:$args,$content_lenght,$content_type,$document_root,$document_uri,$host,$http_user_agent,$http_cookie,$limit_rate,$request_body_file,$request_method,$remote_addr,$remote_port,$remote_user,$request_filename,$request_uri,$query_string,$scheme,$server_protocol,$server_addr,$server_name,$server_port,$uri。
$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 通用日誌格式下的本地時間。
使用nginx服務器若是遇到timeou狀況時能夠以下設置參數,使用fastcgi:
fastcgi_connect_timeout 5; 連接
fastcgi_read_timeout 10; 讀取
fastcgi_send_timeout 10; 發請求
這兩個選項.
fastcgi_read_timeout是指fastcgi進程向nginx進程發送response的整個過程的超時時間
fastcgi_send_timeout是指nginx進程向fastcgi進程發送request的整個過程的超時時間
爲防止鏈接超時,在 PHP中能夠調用
fastcgi_finish_request — 此函數沖刷(flush)全部響應的數據給客戶端並結束請求。 這使得客戶端結束鏈接後,須要大量時間運行的任務可以繼續運行。
測試中,若是是php-fpm中的超時
將顯示 502 Bad Gateway
<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx</center>
</body>
</html>
keepalive_timeout 600; 鏈接超時時間,1分鐘;0表示關閉長鏈接;若有文件下載時必須開啓,並根據文件下載時長設定,下載時超過此值會下載失敗。
proxy_connect_timeout 600; 1分鐘,該指令設置與upstream server的鏈接超時時間
proxy_read_timeout 600; 1分鐘
max_execution_time設置容許腳本運行的時間,單位爲秒。若是超過了此設置,腳本返回一個致命的錯誤。
PHP 中set_time_limit()最大的執行時間,單位爲秒。若是設置爲0(零),沒有時間方面的限制。會從零開始從新啓動超時計數器。
max_input_time = 60 ; Maximum amount of time each script may spend parsing request data
memory_limit = 128M ; Maximum amount of memory a script may consume (128MB)