web應用中配置文件

NGINX配置文件 nginx.conf

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

nginx 配置文件語法

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配置超時

使用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分鐘

php.ini配置

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)

相關文章
相關標籤/搜索