Nginx軟體優化

慘綠少年發表於2018-03-01

1.1 Nginx優化分類

安全優化(提升網站安全性配置)

效能優化(提升使用者訪問網站效率)

1.2 Nginx安全優化

1.2.1 隱藏nginx版本資訊優化

官方配置引數說明:http://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens

官方引數:

Syntax:  server_tokens on | off | build | string;
Default: server_tokens on;
Context: http, server, location

配置舉例:

[root@web01 ~]# cat /application/nginx/conf/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        off;
    keepalive_timeout  65;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    server {
        listen       80;
        server_name  www.nmtui.com;
        server_tokens off;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
        access_log  logs/access_www.log  main;
    }
}

測試結果:

[root@web01 ~]# curl -I 10.0.0.8
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 01 Nov 2017 18:32:40 GMT
Content-Type: text/html
Content-Length: 10
Last-Modified: Wed, 25 Oct 2017 01:20:56 GMT
Connection: keep-alive
ETag: "59efe6f8-a"
Accept-Ranges: bytes

1.2.2 修改nginx版本資訊

修改版本資訊需要修改程式原始檔資訊

修改核心資訊

[root@web01 nginx-1.10.2]# vim  src/core/nginx.h
# ···
 13 #define NGINX_VERSION      "1.0"
 14 #define NGINX_VER          "clsn/" NGINX_VERSION
 22 #define NGINX_VAR          "clsn"
# ···

修改頭部資訊

[root@web01 nginx-1.10.2]# vim  src/http/ngx_http_header_filter_module.c 
# ···
 49 static char ngx_http_server_string[] = "Server: clsn" CRLF;
# ···

修改錯誤頁顯示

[root@web01 nginx-1.10.2]# vim src/http/ngx_http_special_response.c 
# ···
# 此處可以不修改
 21 static u_char ngx_http_error_full_tail[] =
 22 "<hr><center>" NGINX_VER "</center>" CRLF
 23 "</body>" CRLF
 24 "</html>" CRLF
 25 ;
# ···
 28 static u_char ngx_http_error_tail[] =
 29 "<hr><center>clsn</center>" CRLF
 30 "</body>" CRLF
 31 "</html>" CRLF
 32 ;
# ···

修改完成後重新編譯

[root@web01 nginx-1.10.2]# ./configure  --prefix=/application/nginx-1.10.2 --user=www --group=www --with-http_stub_status_module --with-http_ssl_module

重啟服務

[root@web01 nginx-1.10.2]# /etc/init.d/nginx restart

訪問測試是否修改成功

[root@web01 ~]# curl -I 127.0.0.1 
HTTP/1.1 200 OK
Server: clsn
Date: Wed, 01 Nov 2017 19:05:43 GMT
Content-Type: text/html
Content-Length: 10
Last-Modified: Wed, 25 Oct 2017 01:20:56 GMT
Connection: keep-alive
ETag: "59efe6f8-a"
Accept-Ranges: bytes

1.2.3 修改worker程式的使用者

第一種方法:利用編譯安裝配置引數,設定nginx預設worker程式使用者

useradd -s /sbin/nologin -M www
./configure --user=www --group=www

第二種方式:編寫nginx服務配置檔案,設定nginx預設worker程式使用者

官方配置引數說明:http://nginx.org/en/docs/ngx_core_module.html#user

Syntax:user user [group];
Default: user nobody nobody;
Context: main

配置舉例:

[root@web02 conf]# cat nginx.conf
user  www www;          # 主區塊新增user引數
worker_processes  1;
events {
    worker_connections  1024;
}

檢視是否生效

[root@web01 nginx-1.10.2]# ps -ef|grep nginx
root      16987      1  0 15:14 ?        00:00:00 nginx: master process nginx
clsn    18484  16987  0 15:22 ?        00:00:00 nginx: worker process
root      18486   9593  0 15:22 pts/0    00:00:00 grep --color=auto nginx

1.2.4 上傳檔案大小的限制(動態應用)

預設語法說明:

syntax:client_max_body_size size;    #<==引數語法
default:client_max_body_size 1m;    #<==預設值是1m
context:http,server,location        #<==可以放置的標籤段

舉例配置:

http {
 sendfile        on;
 keepalive_timeout  65;
 client_max_body_size 8m;    # 設定上傳檔案最大值8M
}

1.2.5 站點 Nginx站點目錄及檔案URL訪問控制

   01. 根據目錄或副檔名,禁止使用者訪問指定資料資訊

location ~ ^/images/.*\.(php|php5|sh|pl|py|html)$ 
    { 
        deny all;
    } 
location ~ ^/static/.*\.(php|php5|sh|pl|py)$ 
    { 
        deny all;
    } 
location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$ 
    { 
        deny all;
    } 

   02. 當訪問禁止的資料資訊時,進行頁面跳轉

Nginx下配置禁止訪問*.txt*.doc檔案。

實際配置資訊如下:

location ~* \.(txt|doc)$ {
    if (-f $request_filename){
    root /data/www/www;
    #rewrite …..可以重定向到某個URL
    break;
    }
}
location ~* \.(txt|doc)${
    root /data/www/www;
    denyall;
}

   03. 根據IP地址或網路進行訪問策略控制

location / { 
    deny 192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    deny all;
}

   04. 採用if判斷方式,進行訪問控制

if ($remote_addr = 10.0.0.7 ){
        return 403;
 }

1.2.6 配置Nginx,禁止非法域名解析訪問企業網站

第一種方式:配置一個server虛擬主機區塊,放置在所有server區塊最前面

server {
   listen 80;
   server_name - ;
   return 501;
}

第二種方式:將計就計,通過你的域名訪問時候,自動跳轉到我的域名上

server {
   listen 80 default_server;
   server_name _;
   rewrite ^(.*) http://www.nmtui.com/$1 permanent;
}
if ($host !~ ^www\.nmtui\.com$)
{
    rewrite ^(.*) http://www.nmtui.com/$1 permanent;
}

1.2.7 Nginx圖片及目錄防盜鏈解決方案

   什麼是資源盜鏈 ?

   簡單地說,就是某些不法網站未經許可,通過在其自身網站程式裡非法呼叫其他網站的資源,然後在自己的網站上顯示這些呼叫的資源,達到填充自身網站的效果。

實現盜鏈過程:

01. 真正的合法網站(盜鏈的目標)  web01   www.nmtui.com www站點目錄有一個oldboy.jpg圖片

    # 配置靜態虛擬主機
   server {
     listen       80;
     server_name  www.nmtui.com;
     location / {
         root   html/www;
         index  index.html index.htm;
     }
   # 確認生成盜鏈檔案

   02. 不合法的網站(真正盜鏈網站)  www.daolian.com

   # 編寫一個html盜鏈檔案
    <html>
    <head>
       <title>慘綠少年</title>
    </head>
    <body bgcolor=green>
       慘綠少年的部落格!
    <br>我的部落格是
    <a
     href="http://www.nmtui.com" target="_blank">部落格地址
    </a>
    <img src="http://www.nmtui.com/clsn.jpg">
    </body>
    </html>

    編寫盜鏈虛擬主機

    server {
            listen       80;
            server_name  www.daolian.org;
            location / {
                root   html;
                index  index.html index.htm;
            }   
        }

         至此就實現了盜鏈。

03 常見防盜鏈解決方案的基本原理

1)     根據HTTP referer實現防盜鏈

    利用referer,並且針對副檔名rewrite重定向,下面的程式碼為利用referer且針對副檔名rewrite重定向,即實現防盜鏈的Nginx配置。

    location ~* /\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
        root  html/www;
        valid_referers none blocked *.nmtui.com nmtui.com;
    if ($invalid_referer){ 
        rewrite ^/  http://www.nmtui.com/img/nolink.jpg;
      } 
    } 

         設定expires的方法如下:

    [root@clsn www]# cat /application/nginx/conf/extra/www.conf 
        server {
            listen            80;
            server_name        www.nmtui.com;
                root        html/www;
                index        index.html index.htm;
                access_log    logs/www_access.log main;
    #Preventing hot linking of images and other file types
    location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {
        valid_referers none blocked server_names *.nmtui.com nmtui.com;
        if ($invalid_referer){
            rewrite ^/ http://www.nmtui.com/img/nolink.jpg;
        }
        access_log off;
        root html/www;
        expires 1d;
        break;
       }
    }

2) 根據cookie防盜鏈

3) 通過加密變換訪問路徑實現防盜鏈

4) 在所有網站資源上新增網站資訊,讓盜鏈人員幫你做推廣宣傳

1.2.8 NGINX錯誤頁面友好顯示

範例1:對錯誤程式碼403實行本地頁面跳轉,命令如下:

###www
    server {
        listen       80;
        server_name  www.nmtui.com;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
        error_page  403  /403.html;    #<==當出現403錯誤時,會跳轉到403.html頁面
    }

# 上面的/403.html是相對於站點根目錄html/www的。

範例250x頁面放到本地單獨目錄下,進行優雅顯示。

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

範例3:改變狀態碼為新的狀態碼,並顯示指定的檔案內容,命令如下:

error_page 404 =200 /empty.gif;
    server {
        listen       80;
        server_name www.nmtui.com;
        location / {
            root   /data0/www/bbs;
            index  index.html index.htm;
            fastcgi_intercept_errors on;
            error_page  404 =200    /ta.jpg;
            access_log  /app/logs/bbs_access.log  commonlog;
        }
}

範例4:錯誤狀態碼URL重定向,命令如下:

server {
        listen       80;
        server_name www.nmtui.com;
        location / {
            root   html/www;
            index  index.html index.htm;
        error_page   404  https://clsn.cnblogs.com;
#<==當出現404錯誤時,會跳轉到指定的URL https://clsn.cnblogs.com頁面顯示給使用者,這個URL一般是企業另外的可用地址
            access_log  /app/logs/bbs_access.log  commonlog;
        }
}

1.2.9 Nginx站點目錄檔案及目錄許可權優化

伺服器角色

許可權處理

安全係數

動態Web叢集

目錄許可權755

檔案許可權644

所用的目錄,以及檔案使用者和組都是root

環境為Nginx+PHP   檔案不能被改,目錄不能被寫入,安全係數10

static圖片叢集

目錄許可權755

檔案許可權644

所用的目錄,以及檔案使用者和組都是root

環境為Nginx    檔案不能被改,目錄不能被寫入,安全係數10

上傳upload叢集

目錄許可權755

檔案許可權644

所用的目錄,以及檔案使用者和組都是root

特別:使用者上傳的目錄設定為755,使用者和組使用Nginx服務配置的使用者    

檔案不能被改,目錄不能被寫入,但是使用者上傳的目錄允許寫入檔案且需要通過Nginx的其他功能來禁止讀檔案,安全係數8

1.2.10 Nginx防爬蟲優化

範例1:阻止下載協議代理,命令如下:

## Block download agents ##
if ($http_user_agent ~* LWP::Simple|BBBike|wget)
 {
    return 403;
}

範例2:新增內容防止N多爬蟲代理訪問網站,命令如下:

這些爬蟲代理使用“|”分隔,具體要處理的爬蟲可以根據需求增加或減少,新增的內容如下:

if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo!Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot")
 {
return 403;
}

1.2.11 利用Nginx限制HTTP的請求方法

#Only allow these request methods

if ($request_method !~ ^(GET|HEAD|POST)$ ) {
    return 501;
}

#Do not accept DELETESEARCH and other methods

1.2.12 使用普通使用者啟動nginx

1、切換到普通使用者家目錄下,建立nginx所需檔案

[nginx@web01 ~]$ mkdir -p blog/{conf,logs,html}
[nginx@web01 ~]$ cd blog/ 
[nginx@web01 blog]$ cp /application/nginx/conf/nginx.conf.default  ./conf/
[nginx@web01 blog]$ grep -vE "^$|#" conf/nginx.conf.default  >  conf/nginx.conf
[nginx@web01 blog]$ cp /application/nginx/conf/mime.types conf/

2、編寫配置檔案

[nginx@web01 ~]$ cat blog/conf/nginx.conf
worker_processes  4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_rlimit_nofile 65535;
error_log  /home/nginx/blog/logs/error.log;
user inca inca;
pid       /home/nginx/blog/logs/nginx.pid;
events {
    use epoll;
    worker_connections  1024;
}
http {
    include      mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    server {
        listen       8080;
        server_name  www.etiantian.org;
        root   /home/nginx/blog/html;
        location / {
            index  index.html index.htm;
                }
        access_log  /home/nginx/blog/logs/web_blog_access.log  main;
            }
}

         注意:普通使用者不能使用知名埠,需要使用其他埠啟動服務

3、檢查配置檔案語法,並啟動nginx服務

/application/nginx/sbin/nginx -t -c /home/nginx/blog/conf/nginx.conf
或
/application/nginx/sbin/nginx -c /home/nginx/blog/conf/nginx.conf &>/dev/null &

         注意:忽略一些不正確的輸出資訊

1.3 Nginx效能優化

1.3.1 優化nginx worker進行個數

nginx服務主要有兩個重要程式:

 01) master程式:可以控制nginx服務的啟動 停止 或重啟

 02) worker程式:處理使用者請求資訊,幫助使用者向後端服務進行請求(php mysql) 

  新增worker程式方法

 vim nginx.conf
 worker_processes  1; #  修改nginx配置檔案中worker_processes指令後面的數值

  建議:worker程式數量=等於CPU的核數   worker程式數量=等於CPU的核數*2

如何在一個系統中獲悉CPU核心是多少?

 ①. 利用top命令--按數字1,獲取到CPU核數資訊
 ②. grep processor /proc/cpuinfo|wc -l
 ③. lscpu

檢視cpu核心數命令示例

示例一

[root@web01 ~]# top  # 按數字1
top - 03:22:48 up 9 days, 26 min,  4 users,  load average: 1.06, 0.99, 0.92
Tasks: 107 total,   1 running, 106 sleeping,   0 stopped,   0 zombie
Cpu0  :  0.2%us,  0.6%sy,  0.0%ni, 99.0%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.1%us,  0.1%sy,  0.0%ni, 99.1%id,  0.7%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    485984k total,   452536k used,    33448k free,    24984k buffers
Swap:   786428k total,     5912k used,   780516k free,   242048k cached

示例二

[root@web01 ~]# lscpu |grep CPU 
CPU op-mode(s):        32-bit, 64-bit
CPU(s):                2

示例三

[root@web01 ~]# grep processor /proc/cpuinfo 
processor    : 0
processor    : 1

1.3.2 繫結不同的nginx程式到不同的CPU

4worker程式分配CPU資源方法:

worker_processes    4;
worker_cpu_affinity 0001 0010 0100 1000;

8worker程式分配CPU資源方法;

worker_processes    8;
worker_cpu_affinity 0001 0010 0100 1000 0001 0010 0100 1000; # 分配8程式方法
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

4worker程式分配CPU資源方法:

worker_processes    4;
worker_cpu_affinity 0101 1010;  # 將程式分配到兩顆CPU上

1.3.3 優化nginx事件處理模型

官方配置引數說明:http://nginx.org/en/docs/ngx_core_module.html#use

Syntax:    use method;
Default:    —
Context:    events

關於事件處理模型可以參考:https://clsn.cnblogs.com/p/7750615.html#auto_id_10

舉例配置:

user  www www;
worker_processes  1;
events {
    worker_connections  1024;
    use epoll;         --- 指定使用的模型為epoll
}

1.3.4 調整nginx單個程式允許的客戶端最大連線數

檢視nginx當前的開啟檔案數

[root@clsn ~]# lsof -i:80
COMMAND   PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
nginx   10422 root    6u  IPv4 11868856      0t0  TCP *:http (LISTEN)
nginx   10424  www    6u  IPv4 11868856      0t0  TCP *:http (LISTEN)
nginx   10425  www    6u  IPv4 11868856      0t0  TCP *:http 

修改最大連線數方法

vim nginx.conf
 events        #<==events指令是設定Nginx的工作模式及連線數上限
 {
   worker_connections 1024;
 }

     :此數值設定不要超過系統最大開啟檔案數量。

1.3.5 配置Nginx worker程式最大開啟檔案數

舉例配置:

[root@web02 conf]# cat nginx.conf
user  www www;
worker_processes  1;
worker_rlimit_nofile 2048;   # 設定worker程式開啟檔案數

1.3.6 優化nginx高效檔案傳輸模式

sendfile引數的官方說明如下:

syntax:sendfile on | off;                              #<==引數語法
default:sendfile off;                                  #<==引數預設大小
context:http,server,location,if in location         #<==可以放置的標籤段

說明:在系統核心中,利用零拷貝方式實現資料傳輸

實現高效資料傳輸的兩種方式

第一種方式:tcp_nopush

syntax: tcp_nopush on | off;        #<==引數語法
default: tcp_nopush off;            #<==引數預設大小
context: http,server,location        #<==可以放置的標籤段

說明:將資料包積攢到一定量時再進行傳輸

引數作用:

   啟用或禁用Linux上的TCP_NODELAY選項。這個引數啟用只在連線傳輸進入到 keep-alive狀態。TCP_NODELAY和TCP_CORK基本上控制了包的"Nagle化",Nagle化在這裡 的含義是採用Nagle演算法把較小的包組裝為更大的幀。John Nagle是Nagle演算法的發明人,後者就是用他的名字來命名的。

   此演算法解決的問題就是所謂的silly window syndrome,中文稱"愚蠢視窗症候群",具體含義是,因為普遍終端應用程式每產生一次擊鍵操作就會傳送一個包,很輕易地就能令網路發生擁塞,Nagle化後來成了一種標準並且立即在因特網上得以實現。它現在已經成為預設配置了,但在我們看來,有些場合下希望傳送小塊資料,把這一選項關掉也是合乎需要的。

 

第二種方式:tcp_nodelay

Syntax:         tcp_nodelay on | off;
Default:     tcp_nodelay on;
Context:     http, server, location

說明:只要有資料包產生,不管大小多少,就儘快傳輸 

引數作用:

  啟用或禁用Linux上的TCP_CORK socket選項,tcp_cork是linux下tcp/ip傳輸的一個標準了,這個標準的大概的意思是,一般情況下,在tcp互動的過程中,當應用程式接收到資料包後馬上傳送出去,不等待,而tcp_cork選項是資料包不會馬上傳送出去,等到資料包最大時,一次性的傳輸出去,這樣有助於解決網路堵塞,已經是預設了。

  此選項僅僅當開啟sendfile時才生效, 啟用這個.tcp_nopush引數可以允許把http response header和響應資料檔案的開始部分放在一個檔案裡釋出,其積極的作用是減少網路報文段的數量。

強調:兩個指令是相悖的,請選擇其一開啟,不要同時開啟;

預設採用tcp_nodelay方式進行傳輸。

1.3.7 設定nginx服務超時引數

Nginx連線超時的引數設定

1) 設定引數: keepalive_timeout 60; # 長連線才有意義 

keepalive_timeout引數的官方說明如下:

syntax:keepalive_timeout timeout [header_timeout];#<==引數語法
default:keepalive_timeout 75s;#<==引數預設大小
context:http,server,location                 #<==可以放置的標籤段

說明:客戶端和服務端都沒有資料傳輸時,進行超時時間倒數計時,一旦超時時間讀取完畢還沒有資料傳輸,就斷開連線

2) 設定引數:client_header_timeout 55;

syntax:client_header_timeout time;        #<==引數語法
default:client_header_timeout 60s;        #<==引數預設大小
context:http,server                     #<==可以放置的標籤段

說明:表示定義客戶端請求報文傳送的間隔超時時間,客戶端傳送的請求報文中請求頭資訊的間隔時間

3)設定引數:client_body_timeout 55;

syntax:client_body_timeout time;        #<==引數語法
default:client_body_timeout 60s;        #<==預設值是60秒
context:http,server,location            #<==可以放置的標籤段

說明:表示定義服務端響應報文傳送的間隔超時時間,客戶端傳送的請求報文中請求主體資訊的間隔時間

4)設定引數:send_timeout 60s

syntax:send_timeout time;            #<==引數語法
default:send_timeout 60s;            #<==預設值是60秒
context:http,server,location        #<==可以放置的標籤段

說明:表示定義客戶端讀取服務端響應報文的間隔超時時間,服務端傳送的響應報文間隔時間

1.3.8 配置Nginx gzip壓縮實現效能優化

1.     Nginx gzip壓縮功能介紹

Nginx gzip壓縮模組提供了壓縮檔案內容的功能,使用者請求的內容在傳送到使用者客戶端之前, Nginx伺服器會根據一些具體的策略實施壓縮,以節約網站出口頻寬,同時加快資料傳輸效率,來提升使用者訪問體驗。

2.     Nginx gzip壓縮的優點

提升網站使用者體驗:

  傳送給使用者的內容小了,使用者訪問單位大小的頁面就加快了,使用者體驗提升了,網站口碑就好了。

 節約網站頻寬成本:

   資料是壓縮傳輸的,因此節省了網站的頻寬流量成本,不過壓縮時會稍 微消耗一些CPU資源,這個一般可以忽略。

此功能既能提升使用者體驗,又能使公司少花錢,一舉多得。對於幾乎所有的Web服務來說,這 是一個非常重要的功能,Apache服務也有此功能。

官方用法參考連結:http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip

gzip on;
gzip_min_length        1k;
gzip_buffers        4 16k;
gzip_http_version    1.1;
gzip_comp_level     4;
gzip_types             text/css text/xml application/javascript;
gzip_vary             on;

說明:將服務端響應的資料資訊進行壓縮,可以有效節省頻寬,提高使用者訪問效率

需要和不需要壓縮的物件

  1. 純文字內容壓縮比很高,因此,純文字的內容最好進行壓縮,例如:html、js、css、xml、shtml等格式的檔案。
  2. 被壓縮的純文字檔案必須要大於1KB,由於壓縮演算法的特殊原因,極小的檔案壓縮後可能反而變大。
  3. 圖片、視訊(流媒體)等檔案儘量不要壓縮,因為這些檔案大多都是經過壓縮的。
  4. 如果再壓縮很可能不會減小或減小很少,或者有可能增大,同時壓縮時還會消耗大量的CPU、記憶體資源。

壓縮配置引數說明

gzip on ;
#<==開啟gzip壓縮功能。 

gzip_min_length lk;
#<==設定允許壓縮的頁面最小宇節數,頁面宇節數從header頭的Content-Length中獲取。預設值是0,表示不管頁面多大都進行壓縮。建議設定成大於1K,如果小於1K可能會越壓越大。 

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 2 ;
#<==壓縮比率。用來指定gzip壓縮比,1壓縮比最小,處理速度最快;9壓縮比最大,傳輸速度快,但處理最慢,也比較消耗CPU資源。

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

gzip_vary on ;
#<==vary header支援。該選項可以讓前端的快取伺服器快取經過gzip壓縮的頁面,例如用Squid快取 經過Nginx壓縮的資料。

1.3.9 配置Nginx expires快取實現效能優化

簡單地說,Nginx expires的功能就是為使用者訪問的網站內容設定一個過期時間,當使用者第一次訪問這些內容時,會把這些內容儲存在使用者瀏覽器本地,這樣使用者第二次及以後繼續訪問該網站時,瀏覽器會檢查載入已經快取在使用者瀏覽器本地的內容,就不會去伺服器下載了,直到快取的內容過期或被清除為止。

Nginx expires功能優點

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

實踐配置

[root@web02 extra]# cat blog.conf 
server {
        listen       80;
        server_name  blog.etiantian.org;
        server_tokens off;
        # 靜態請求處理的location
        location / {
            root   html/blog;
            index  index.php index.html index.htm;
        }
        # 動態請求處理的location
        location ~* .*\.(php|php5)?$ {
            root html/blog;
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
       location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
       {
          expires      10y;
          root   html/blog;
       }
        location ~ .*\.(js|css)$
        {
           expires      30d;
           root    html/blog;
        } 
    }
   
   location / {
        expires 3650d;
 }

企業網站有可能不希望被快取的內容

  1. 廣告圖片,用於廣告服務,都快取了就不好控制展示了。
  2. 網站流量統計工具(JS程式碼),都快取了流量統計就不準了。
  3. 更新很頻繁的檔案(google的logo),這個如果按天,快取效果還是顯著的。

1.3.10 配置FastCGI優化

FastCGI Cache資料見:

http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache

FastCGI常見引數的Nginx配置示例如下:

[root@nginx conf]# cat nginx.conf
worker_processes  4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_rlimit_nofile 65535;
user nginx;
events {
    use epoll;
    worker_connections  10240;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    tcp_nopush on;
    keepalive_timeout  65;
    tcp_nodelay on;
    client_header_timeout 15;
    client_body_timeout 15;
    send_timeout 15;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    server_tokens off;
    fastcgi_connect_timeout 240;
    fastcgi_send_timeout 240;
    fastcgi_read_timeout 240;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    #fastcgi_temp_path /data/ngx_fcgi_tmp;
    fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
    #web...............
    server {
        listen       80;
        server_name  blog.nmtui.com;
        root   html/blog;
        location / {
            root   html/blog;
            index  index.php index.html index.htm;
                }
        location ~ .*\.(php|php5)${      
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
            fastcgi_cache ngx_fcgi_cache;
            fastcgi_cache_valid 200 302 1h;
            fastcgi_cache_valid 301 1d;
            fastcgi_cache_valid any 1m;
            fastcgi_cache_min_uses 1;
            fastcgi_cache_use_stale error timeout invalid_header http_500;
            fastcgi_cache_key http://$host$request_uri;
                }
        access_log  logs/web_blog_access.log  main;
           }
    upstream blog_etiantian{
        server 10.0.0.8:8000 weight=1;
}
    server {
        listen       8000;
        server_name  blog.nmtui.com;
        location / {
            proxy_pass http://blog_etiantian;
            proxy_set_header Host  $host;
            proxy_set_header X-Forwarded-For  $remote_addr;
              }
        access_log  logs/proxy_blog_access.log  main;
           }
}

FastCGI常見引數列表說明:

Nginx FastCGI 相關引數

說明

fastcgi_connect_timeout

表示nginx伺服器和後端FastCGI伺服器連線的超時時間,預設值為60秒,這個引數值通常不要超過75秒,因為建立的連線越多,消耗的資源就越多

fastcgi_send_timeout

設定nginx傳輸請求到FastCGI伺服器的超時時間,這個超時時間不是整個請求的超時時間,而是兩個成功請求的之間間隔時間為超時時間,如果這個時間內,FastCGI服務沒有收到任何資訊,連線將關閉

fastcgi_read_timeout

設定nginxFastCGI伺服器讀取響應資訊的超時時間苯示連捿建立成功後, nginx等待後端伺服器的響應時間,是nginx進入後端的排隊之中的等候處理的時間,實際上是讀取FastCGI響應成功資訊的間隔時間,

fastcgi_buffer_size

這是Nginx FastCGI的緩衝區大小引數,設定用來讀取從FastCGI伺服器端收到的第一部分響應資訊的緩衝區大小,這裡的第一部分通常會包含一個小的響應頭部s預設情況下,這個引數的大小等價於_個記憶體頁。不是4k就是8k 根據相應系統平臺來決定,也可以更小。

fastcgi_buffers

設定用來讀取從FastCGI伺服器端收到的響應資訊的緩衝區大小和緩衝區數是,預設值為fastcgi_buffer 8 4k|8k;

指定本地需要用多少和多大的緩衝區來緩衝FastCGI的應答請求,如果一個 PHP指令碼產生的頁面大小為256KB ,那麼會為其分配464KB的緩衝區來緩存;如果頁面大小大於256KB ,那麼大於256KB的部分會快取到fastcgi_temp 指定的路徑中,但是這並不是好方法,因為記憶體中的資料處理速度要快於硬碟。一般這個值應該為站點中PHP指令碼產生的頁面大小的中間值,如果站點大部分指令碼所產生的頁面大小為256KB ,那麼可以把這個值設定為"16 16k" , "4 64k"

fastcgi_busy_buffers_size

用於設定系統很忙時可以使用的fastcgi_buffers大小,言方推薦的大小為fastcgi_buffers*2 ;預設值為 fastcgi_busy_buffers_size 8k|16k

fastcgi_temp_file_write_size

FastCGI臨時檔案的大小,可以設定為128~256KB ; 預設fastcgi_temp_file_write_size 8k|16k;

fastcgi_cache oldboy_nginx

表示開後FastCGI快取併為其指定一個名稱。開後快取非常有用,可以有效降CPU的負載,並且防止502錯誤的發生,但是開後快取也可能引起其它問題,要根據具體情況來選擇

fastcgi_cache_path

例項:fastcgi_cache_path /data/nginx/cache levels = 2:2 keys_zone = ngx_fcgi_cache:512m inactive = ld max_size=40g; fastcgi_cache快取目錄,可以設定目錄前列層級,比如2:2會生成256*256 個子目錄,keys_zone是這個快取空間的名字,cache是用多少記憶體(這樣熱門的內容,nginx會直接放入記憶體,提高訪問速度)。inactive表示預設失效時間,max_size表示最多用多少硬碟空間,雲要注意的是fastcgi_cache快取是先寫在fastcgi_temp_path在移到fastcgi_cache_path中去的,所以這個兩個目錄最好在同一個分割槽,從0.8.9之後可以在不同的分割槽,不過還是建議放在_分割槽。

fastcgi_cache_valid

示例:fastcgi_cache_valid 200 302 lh; 

用來指定應答程式碼的快取時間,例項中的值表示將200302應答快取1個小時; 

示例:fastcgi_cache_valid 301 Id; 

301應答快取1天;

fastcgi_cache_min_uses

示例:fastcgi_cache_min_uses 1;  設定清求幾次之後晌應將被快取,1表示一次即被快取

fastcgi_cache_use_stale

示例:fastcgi_cache_use_stale error timeout invalid_header http_500 定義在哪些情況下使用過期快取

fastcgi_cache_key

示例:fastcgi_cache_key $request_method://$host$request_uri; fastcgi.cache.key http://$host$request_uri;

定義fastcgi_cachekey ,示例中以請求的URI作為快取的keynginx會取這個keymd5作為快取檔案,如果設定了快取雜湊目錄,nginx會從後往前取梠應的位數作為目錄。注意一定要加作為cache key,否則如果先請求的為head 型別,後面的GET清求返回為空。

1.4 日誌方面優化

1.4.1 配置Nginx服務相關日誌操作

01. 進行日誌的切割

[root@clsn ~]# mkdir /server/scripts/ -p
[root@clsn ~]# cd /server/scripts/
[root@clsn scripts]# vim cut_nginx_log.sh 
#!/bin/bash
cd /application/nginx/logs &&\
/bin/mv www_access.log www_access_$(date +%F -d -1day).log   #<==將日誌按日期改成前一天的名稱
/application/nginx/sbin/nginx -s reload  #<==重新載入nginx使得觸發重新生成訪問日誌檔案

提示:實際上指令碼的功能很簡單,就是改名日誌,然後載入nginx,重新生成檔案記錄日誌

說明:也可以編輯使用logrotate日誌切割服務,進行日誌切割

02. 進行日誌的選擇記錄

location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
  access_log off;
}

03. 進行日誌檔案授權

假如日誌目錄為/app/logs,則授權方法如下:

chown -R root.root /app/logs
chmod -R 700 /app/logs

04. 日誌資訊儘量彙總備份

[root@clsn ~]# zgrep 456 clsn.tar.gz

1.4.2 檢視軟體編譯時的引數

. 檢視nginx安裝時編譯了哪些引數

/application/nginx/sbin/nginx -V

. 檢視apache安裝時編譯了哪些引數

cat /application/apache/build/config.nice         
/application/apache/bin/apachectl -V     #<--也可檢視安裝時編譯資訊,但顯示的不全

. 檢視mysql安裝時編譯了哪些引數

grep CONFIGURE_LINE /application/mysql/bin/mysqlbug

PSmysql二進位制包的安裝方式,是無法看到編譯引數的,預設為空

. 檢視php安裝時編譯了哪些引數

/application/php/bin/php -i|grep configure

  

 

相關文章