Nginx配置參數說明

1、主配置段
一、正常運行必備的配置
#運行用戶和組,組身份能夠省略
user nginx nginx;

#指定nginx守護進程的pid文件
pid path/to/nginx.pid;

#指定全部worker進程所能打開的最大文件句柄數
worker_rlimit_nofile 100000;

二、性能優化相關的配置
#worker進程的個數,一般應該略少於CPU物理核心數,也可使用auto自動獲取
worker_processes auto;

#CPU的親緣性綁定(一樣是沒法避免CPU的上下文的切換的)
#優勢:提高緩存的命中率
#context switch:會產生CPU沒必要要的消耗
work_cpu_affinity  00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

#計時器解析度(請求到達nginx,nginx相應用戶請求後,要獲取系統時間並記錄日誌,高併發的時候可能每秒鐘獲取不少不少次)
#下降此值,能夠減小gettimeofday()系統調用的次數
timer_resolution 100ms;

#指明worker進程的nice值:數字越小,優先級越高
#nice值範圍:-20,19
#對應的優先級:100,139
worker_priority number;

2、事件相關的配置
events {
    #master調度用戶請求至個worker進程時使用的負載均衡鎖:on表示能讓多個worker輪流地、序列化的響應新請求
    accept_mutex {off|on}
    
    #延遲等待時間,默認爲500ms
    accept_mutex_delay time;
    
    #accept_mutex用到的鎖文件路徑
    lock_file file;
    
    #指明使用的時間模型:建議讓Nginx自行選擇
    use [epoll|rtsig|select|poll];
    
    #單個worker進程打開的最大併發鏈接數,worker_processes*worker_connections
    worker_connections 2048;
    
    #告訴nginx收到一個新連接通知後接受盡量多的連接
    multi_accept on;    
}

3、用於調試、定位問題
#是否以守護進程方式運行nginx;調試時應該設置爲off
daemon {on|off}

#是否以master/worker模型來運行;調試時能夠設置爲off
master_process {on|off}

#error_log 位置 級別,若要使用debug,須要在編譯nginx時使用--with-debug選項
error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug|info|notice|warn|error|crit|alert|emerg];

總結:常須要調整的參數:worker_processes, worker_connections,work_cpu_affinity,worker_priority
新改動配置生效方式:
nginx -s reload其餘參數stop,quit,reopen也可使用nginx -h查看到

4、nginx做爲web服務器使用的配置
http {}:由ngx_http_core_module模塊所引入
配置框架:
http {
    upstream {
        ...
    }
    server {
        location URL {
            root "/path/to/somedir"
            ...
        }#相似於httpd中的<Location>,用於定義URL與本地文件系統的映射關係
        location URL {
            if ... {
                ...
            }
        }
    }#每一個server相似於httpd中的一個<VirtualHost>
    server {
        ...
    }
}
注意:與http相關的額指令僅可以防止與http、server、location、upstream、if上下文,但有些指令僅應用於這5種上下文的某些種。

http {
    #打開或關閉錯誤頁面中的nginx版本號
    server_tokens on;
    #!server_tag on;
    #!server_info on;
    
    #優化磁盤IO設置,指定nginx是否調用sendfile函數來輸出文件,普通應用設爲on,下載等磁盤IO高的應用,可設爲off
    sendfile on;
    #設置nginx在一個數據包裏發送全部頭文件,而不是一個接一個的發送
    tcp_nopush on;
    #設置nginx不要緩存數據,而是一段一段的發送,
    
    #長鏈接的超時時長,默認爲75s
    keepalive_timeout 30;
    #在一個長鏈接所可以容許請求的最大資源數
    keepalive_requests 20;
    #爲制定類型的User Agent禁用長鏈接
    keepalive_disable [msie6|safari|none];
    #是否對長鏈接使用TCP_NODELAY選項,不將多個小文件合併傳輸
    tcp_nodelay on;
    #讀取http請求報文首部的超時時長
    client_header_timeout #;
    #讀取http請求報文body部分的超時時長
    client_body_timeout #;
    #發送響應報文的超時時長
    send_timeout #;
    
    #設置用戶保存各類key的共享內存的參數,5m指的是5兆
    limit_conn_zone $binary_remote_addr zone=addr:5m;
    #爲給定的key設置最大的鏈接數,這裏的key是addr,設定的值是100,就是說容許每個IP地址最多同時打開100個鏈接
    limit_conn addr 100;

    #include指在當前文件中包含另外一個文件內容
    include mime.types;
    #設置文件使用默認的mine-type
    default_type text/html;
    #設置默認字符集
    charset UTF-8;

    #設置nginx採用gzip壓縮的形式發送數據,減小發送數據量,但會增長請求處理時間及CPU處理時間,須要權衡
    gzip on;
    #加vary給代理服務器使用,針對有的瀏覽器支持壓縮,有個不支持,根據客戶端的HTTP頭來判斷是否須要壓縮
    gzip_vary on;
    #nginx在壓縮資源以前,先查找是否有預先gzip處理過的資源
    #!gzip_static on;
    #爲指定的客戶端禁用gzip功能
    gzip_disable "MSIE[1-6]\.";
    #容許或禁止壓縮基於請求和相應的響應流,any表明壓縮全部請求
    gzip_proxied any;
    #設置對數據啓用壓縮的最少字節數,若是請求小於10240字節則不壓縮,會影響請求速度
    gzip_min_length 10240;
    #設置數據壓縮等級,1-9之間,9最慢壓縮比最大
    gzip_comp_level 2;
    #設置須要壓縮的數據格式
    gzip_types text/plain text/css text/xml text/javascript  application/json application/x-javascript application/xml application/xml+rss;

    #開發緩存的同時也指定了緩存文件的最大數量,20s若是文件沒有請求則刪除緩存
    open_file_cache max=100000 inactive=20s;
    
    #指多長時間檢查一次緩存的有效信息
    open_file_cache_valid 60s;
    
    #文件緩存最小的訪問次數,只有訪問超過5次的纔會被緩存
    open_file_cache_min_uses 5;
    
    #當搜索一個文件時是否緩存錯誤信息
    open_file_cache_errors on;

    #容許客戶端請求的最大單文件字節數
    client_max_body_size 8m;
    
    #衝區代理緩衝用戶端請求的最大字節數
    client_header_buffer_size 32k;
    
    #引用/etc/nginx/vhosts下的全部配置文件,若是主機名衆多的狀況下能夠每一個主機名創建一個文件,以方便管理
    include /etc/nginx/vhosts/*;
}

5、虛擬主機設定模塊
#負載均衡服務器列表(本人一般把負載均衡類別配置在相應的虛擬主機的配置文件中)
upstream fansik {
    #後端服務器訪問規則
    ip_hash;
    #weight參數表示權重值,權值越高被分配到的概率越大
    server 192.168.1.101:8081 weight=5;
    server 192.168.1.102:8081 max_fails=3 fail_timeout=10s;
}
server {
    #監聽80端口
    listen 80;
    #定義主機名,主機名能夠有多個,名稱還可使用正則表達式(~)或通配符
    #(1)先作精確匹配檢查
    #(2)左側通配符匹配檢查:*.fansik.com
    #(3)右側通配符匹配檢查:mail.*
    #(4)正則表達式匹配檢查:如~^.*\.fansik\.com$
    #(5)detault_server
    server_name fansik.fansik.com;
    #設定本虛擬主機的訪問日誌
    access_log logs/fansik.fansik.com.access.log;

    location [=|~|~*|^~] uri {...}
    功能:容許根據用戶請求的URI來匹配定義的個location,匹配到時,此請求將被相應的location配置塊中的配置所處理
    =:表示精確匹配檢查
    ~:正則表達式模式匹配檢查,區分字符大小寫
    ~*:正則表達式模式匹配檢查,不區分字符大小寫
    ^~:URI的前半部分匹配,不支持正則表達式
    !~:開頭表示區分大小寫的不匹配的正則
    !~*:開頭表示不區分大小寫的不匹配的正則
    /:通用匹配,任何請求都會被匹配到
    location / {
        #定義服務器的默認網站根目錄位置
        root html;
        #定義首頁索引文件的名稱
        index index.html index.htm;
        #引用反向代理的配置,配置文件目錄根據編譯參數而定
        #若是編譯時加入了--conf-path=/etc/nginx/nginx.conf指定了配置文件的路徑那麼就把proxy.conf放在/etc/nginx/目錄下
        #若是沒有制定配置文件路徑那麼就把proxy.conf配置放到nginx的conf目錄下
        include proxy.conf;    
        #定義後端負載服務器組
        proxy_pass http://fansik;
    }
    alias path和root path的區別;
    location /images/ {
        root "/data/images"
    }
    http://fansik.fansik.com/images/a.jpg <-- /data/images/images/a.jpg
    location /images/ {
        alias "/data/images/"
    }
    http://fansik.fansik.com/images/a.jpg <-- /data/images/a.jpg
    

    #定義錯誤提示頁面
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root html;
    }

    #設定查看Nginx狀態的地址
    #只能定義在location中
    #htpasswd -c -m /etc/nginx/.htpasswd fansik(-c 參數第一次建立時使用)
    location /Status {
        stub_status on;
        allow all;
        #access_log off;
        #allow 192.168.1.0/24;
        #deny all;
        #auth_basic "Status";
        #auth_basic_user_file /etc/nginx/.htpasswd;
    }
    status結果實例說明:
    Active connections: 1 (當前全部處於打開狀態的鏈接數)
    server accepts handled requests
    174(已經接受進來的鏈接) 174(已經處理過的鏈接) 492(處理的請求,在保持鏈接模式下,請求數可能會多於鏈接數量)
    Reading: 0 Writing: 1 Waiting: 0
    Reading:正處於接受請求狀態的鏈接數
    Writing:請求接受完成,正處於處理請求或發送相應的過程當中的鏈接數
    Waiting:保持鏈接模式,且處於活動狀態的鏈接數
    
    #基於IP的訪問控制
    allow IP/Netmask
    deny IP/Netmask
    location ~ /\.ht {
        deny all;
    }
}


6、反向代理的配置(反向代理的配置一般放在單獨的配置文件中proxy.conf,經過include引用)
proxy_redirect off;
#後端的Web服務器能夠經過X-Forwarded-For獲取用戶真實IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#nginx跟後端服務器鏈接超時時間(代理鏈接超時)
proxy_connect_timeout 60;
#鏈接成功後,後端服務器響應時間(代理接收超時)
proxy_read_timeout 120;
#後端服務器數據回傳時間(代理髮送超時)
proxy_send_timeout 20;
#設置代理服務器(nginx)保存用戶頭信息的緩衝區大小
proxy_buffer_size 32k;
#proxy_buffers緩衝區,網頁平均在32k如下的設置
proxy_buffers 4 128k;
#高負荷下緩衝大小(proxy_buffers*2)
proxy_busy_buffers_size 256k;
#設定緩存文件夾大小,大於這個值,將從upstream服務器傳
proxy_temp_file_write_size 256k;
#1G內存緩衝空間,3天不用刪除,最大磁盤緩衝空間2G
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=cache_one:1024m inactive=3d max_size=2g;

7、https服務的配置
server {
        listen       443 ssl;
        server_name  test.fansik.cn;
        ssl_certificate      100doc.cn.crt;
        ssl_certificate_key  100doc.cn.key;     
        ssl_session_cache    shared:SSL:1m;
        ssl_protocols SSLv2 SSLv3 TLSv1;
        ssl_session_timeout  5m;        
        ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
        ssl_prefer_server_ciphers  on;       
        location / {
                root /data/app
                index  index.html index.htm;
        }
}

8、url地址重寫
rewrite regex replacment flag
例如:rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;#$1是前面括號中的內容哦
http://fansik.fansik.com/images/a/1.jpg --> http://fansik.fansik.com/imgs/a/1.jpg
flag:
    last:一旦此rewrite規則重寫完成後,再也不被後面其餘的rewrite規則進行處理,
    而是由User Agent從新對重寫後的URL再一次發起請求,並從頭開始執行相似的過程。
    break:一旦此rewrite規則重寫完成以後,由User Agent對新的URL從新發起請求,
    且不會被當前location內的任何rewrite規則過檢查
    redirect:以302響應碼(臨時重定向)返回新的URL
    permanent:以301響應碼(永久重定向)返回新的URL

9、if判斷
語法:if (condition) {...}
應用環境:server,location
condition:
(1)變量名:
變量值爲空串,或者以"0"開始,則爲false,其餘的均爲true
(2)以變量爲操做數構成的比較表達式
可使用=,!=相似的比較操做符進行測試
(3)正則表達式的模式匹配操做
~:區分大小寫的模式匹配檢查
~*:不區分大小寫的模式匹配檢查
!~和!~*:對上面兩種測試取反
(4)測試路徑爲文件可能性:-f ,~-f
(5)測試製定路徑爲目錄的可能性:-d,!-d
(6)測試文件存在性:-e,!-e
(7)檢查文件是否有執行權限:-x,!-x
例如:
if($http_user_agent ~* MSIE){
    rewrite ^(.*)$ /msie/$1 break;
}

10、防盜鏈
location ~* \.(jpg|gif|jpeg|png)$ {
    valid_referer none blocked www.fansik.com;
    if ($invalid_referer) {
        rewrite ^/ http://www.fansik.com/403.html;
    }
}javascript

相關文章
相關標籤/搜索