Nginx02

1、Nginx安全優化

1.1:隱藏nginx版本信息

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

官方參數:php

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

配置舉例:css

[root@node1 ~]# cat /etc/nginx/nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;
    server_tokens off;
    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

測試結果:html

[root@node1 ~]# curl -I localhost
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 09 May 2018 02:38:56 GMT
Content-Type: text/html
Content-Length: 11
Last-Modified: Wed, 09 May 2018 02:29:10 GMT
Connection: keep-alive
ETag: "5af25cf6-b"
Accept-Ranges: bytes

1.2:修改nginx版本信息

修改版本信息須要修改程序源文件信息前端

修改內核信息:java

[root@node1 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"
# ···

修改頭部信息:node

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

修改錯誤頁顯示:mysql

[root@noode1 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 ;
# ···

修改完成後從新編譯:linux

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

重啓服務:nginx

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

訪問測試是否修改爲功:

[root@node1 ~]# curl -I localhost
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.3:修改work進程的用戶

第一種方法:利用編譯安裝配置參數,設定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.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.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.6:禁止非法域名解析訪問企業網站

第一種方式:配置一個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.7:Nginx圖片及目錄防盜鏈解決方案

   什麼是資源盜鏈 ?

   簡單地說,就是某些不法網站未經許可,經過在其自身網站程序裏非法調用其餘網站的資源,而後在本身的網站上顯示這些調用的資源,達到填充自身網站的效果。

1.7.1:實現盜鏈過程:

01. 真正的合法網站(盜鏈的目標)  web01   www.nmtui.com www站點目錄有一個test.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;
            }   
        } 

         至此就實現了盜鏈。

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

01.  根據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;
       }
    }

02.  根據cookie防盜鏈;

03.  經過加密變換訪問路徑實現防盜鏈;

04.  在全部網站資源上添加網站信息,讓盜鏈人員幫你作推廣宣傳;

1.8:Nginx錯誤頁面友好顯示

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

#下面的/403.html是相對於站點根目錄html/www的
###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頁面 }

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

# 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.9:Nginx站點目錄文件及目錄權限優化

服務器角色

權限處理

安全係數

動態Web集羣

目錄權限755

文件權限644

所用的目錄,以及文件用戶和組都是root

環境爲Nginx+PHP   

文件不能被改

目錄不能被寫入

安全係數10

static圖片集羣

目錄權限755

文件權限644

所用的目錄,以及文件用戶和組都是root

環境爲Nginx   

文件不能被改

目錄不能被寫入

安全係數10

上傳upload集羣

目錄權限755

文件權限644

所用的目錄,以及文件用戶和組都是root

用戶上傳的目錄設置爲755

用戶和組使用Nginx服務配置的用戶    

文件不能被改

目錄不能被寫入

可是用戶上傳的目錄容許寫入文件且須要經過Nginx的其餘功能來禁止讀文件

安全係數8

 

1.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.11:利用Nginx限制HTTP的請求方法

#Only allow these request methods

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

#Do not accept DELETE,SEARCH and other methods

1.12 使用普通用戶啓動nginx

一、切換到普通用戶家目錄下,建立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/

二、編寫配置文件

[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;
            }
}

         注意:普通用戶不能使用知名端口,須要使用其餘端口啓動服務 

三、檢查配置文件語法,並啓動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 &

         注意:忽略一些不正確的輸出信息

2、Nginx性能優化

2.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

2.2:綁定不一樣的nginx進程到不一樣的CPU上

4個worker進程分配CPU資源方法:

worker_processes    4;
worker_cpu_affinity 0001 0010 0100 1000;

8個worker進程分配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;

4個worker進程分配CPU資源方法:

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

2.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
}

2.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;
 }

 說    此數值設置不要超過系統最大打開文件數量。

2.5:配置Nginx worker進程最大打開文件數

舉例配置:

[root@web02 conf]# cat nginx.conf
user  www www;
worker_processes  1;
worker_rlimit_nofile 2048;   # 設置worker進程打開文件數

2.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方式進行傳輸。

2.7:設置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        #<==能夠放置的標籤段

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

2.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;

說明:將服務端響應的數據信息進行壓縮,能夠有效節省帶寬,提升用戶訪問效率

3.     須要和不須要壓縮的對象

  1. 純文本內容壓縮比很高,所以,純文本的內容最好進行壓縮,例如:html、js、css、xml、shtml等格式的文件。
  2. 被壓縮的純文本文件必需要大於1KB,因爲壓縮算法的特殊緣由,極小的文件壓縮後可能反而變大。
  3. 圖片、視頻(流媒體)等文件儘可能不要壓縮,由於這些文件大多都是通過壓縮的。
  4. 若是再壓縮極可能不會減少或減少不多,或者有可能增大,同時壓縮時還會消耗大量的CPU、內存資源。

4.     壓縮配置參數說明

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壓縮的數據。

2.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),這個若是按天,緩存效果仍是顯著的。

2.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;
           }
}

3、Nginx日誌優化

3.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

3.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

PS:mysql二進制包的安裝方式,是沒法看到編譯參數的,默認爲空

④. 查看php安裝時編譯了哪些參數

/application/php/bin/php -i|grep configure
相關文章
相關標籤/搜索