企業級Nginx服務基礎到架構優化詳解--(1-15條)

轉自:http://lilongzi.blog.51cto.com/5519072/1839751javascript

一、隱藏nginx header版本號php

二、更改源碼隱藏軟件名稱css

三、更改nginx默認用戶及用戶組html

四、配置nginx worker進程個數前端

五、根據CPU核數進行nginx進程優化java

六、nginx事件處理模型優化node

七、調整Nginx worker單個進程容許的客戶端最大鏈接數nginx

八、配置Nginx worker進程最大打開文件數web

九、開啓高效的文件傳輸模式數據庫

十、設置鏈接超時時間

十一、上傳文件大小設置(動態應用)

十二、fastcgi調優(配合PHP引擎動態服務)

1三、配置nginx gzip壓縮功能

1四、配置Nginx expires緩存功能

1五、Nginx日誌相關優化與安全

1六、Nginx站點目錄及文件URL訪問控制(防止惡意解析)

1七、防止惡意解析訪問企業網站

1八、Nginx圖片及目錄防盜鏈

1九、Nginx錯誤頁面的優雅顯示

20、Nginx防爬蟲優化

21 、限制HTTP請求方法

2二、防DOS***

2三、使用CDN爲網站內容加速

2四、Nginx程序架構優化

2五、使用普通用戶啓動Nginx(監牢模式)


一、隱藏nginx header版本號

查看版本號

[root@db02 ~]# curl -I http://www.lichengbing.cn 

HTTP/1.1 200 OK

Server: nginx/1.6.3

Date: Tue, 16 Aug 2016 14:39:48 GMT

Content-Type: text/html; charset=UTF-8

Connection: keep-alive

X-Powered-By: PHP/5.5.32

Link: <http://www.lichengbing.cn/wp-json/>; rel="https://api.w.org/"


編譯nginx.conf配置文件,添加server_tokens off參數

http {

   ...

    server_tokens off; #控制http response header內的服務版本信息的顯示,以及錯誤信息中web服務版本信息

   ...

}

[root@db02 ~]# curl -I http://www.lichengbing.cn

HTTP/1.1 200 OK

Server: nginx #版本隱藏



二、更改源碼隱藏軟件名稱

修改3個nginx源碼文件

第一個nginx-1.6.3/src/core/nginx.h文件

[root@lichengbing nginx-1.6.3]# cd ~/tools/nginx-1.6.3

[root@lichengbing nginx-1.6.3]# sed -n '13,17p' src/core/nginx.h 

#define NGINX_VERSION      "1.6.3" #改爲你想要的版本號,如2.2.5

#define NGINX_VER          "Nginx/" NGINX_VERSION #你想改爲的軟件名稱,如Apache

#define NGINX_VAR          "NGINX" #能夠改爲OWS等

#define NGX_OLDPID_EXT     ".oldbin"


第二個

[root@lichengbing nginx-1.6.3]# sed -i 's#Server: nginx#Server: OWS#g' src/http/ngx_http_header_filter_module.c

第三個ngx_http_special_response.c是否對外展現敏感信息

[root@lichengbing nginx-1.6.3]# sed -n '21,30p' src/http/ngx_http_special_response.c 

static u_char ngx_http_error_full_tail[] =

"<hr><center>" NGINX_VER "</center>" CRLF

"</body>" CRLF

"</html>" CRLF

;

static u_char ngx_http_error_tail[] =

"<hr><center>nginx</center>" CRLF

"</body>" CRLF


修改成以下

[root@lichengbing nginx-1.6.3]# sed -n '21,30p' src/http/ngx_http_special_response.c 

static u_char ngx_http_error_full_tail[] =

"<hr><center>" NGINX_VER " (http://www.lichengbing.cn)</center>" CRLF

"</body>" CRLF

"</html>" CRLF

;

static u_char ngx_http_error_tail[] =

"<hr><center>OWS</center>" CRLF

"</body>" CRLF


從新編譯安裝nginx,重啓服務


三、更改nginx默認用戶及用戶組

[root@lichengbing ~]# grep '#user' /application/nginx/conf/nginx.conf.default 

#user  nobody; #系統默認的用戶爲nobody

[root@lichengbing ~]# useradd www -s /sbin/nologin -M #創建用戶www

user  www www; #nginx.conf 中配置用戶

也能夠在編譯時加入用戶和用戶組,如

--user=www --group=www --with-http_ssl_module --with-http_stub_status_module --prefix=/application/nginx-1.6.3/

[root@lichengbing ~]# ps -ef|grep nginx|grep -v grep

root      1386     1  0 Jul21 ?        00:00:00 nginx: master process /application/nginx/sbin/nginx

www      24732  1386  0 23:19 ?        00:00:00 nginx: worker process


#此時worker process進程就是使用的www用戶權限,固然也可使master降權運行


四、配置nginx worker進程個數

worker_processes  8; #最好爲服務器CPU的邏輯核心數

[root@netmonitor ~]# grep "physical id" /proc/cpuinfo|sort|uniq|wc -l #物理核數

2

[root@netmonitor ~]# grep "cpu cores" /proc/cpuinfo|uniq #單核心數

cpu cores         : 4

[root@netmonitor ~]# grep "processor" /proc/cpuinfo|wc -l #邏輯核心數

8



五、根據cpu核數進行nginx進程優化

親和力參數(Nginx服務可能會發生只在同一顆CPU上起做用的狀況)

worker_processes  8;

worker_cpu_affinity 001 0010 0100 1000; #數字表明一、二、三、4的掩碼,平均分攤進程壓力

worker_cpu_affinity 00000001 00000010...#8核心寫法


防止進程只在一個核心上運行也可使用 taskset 命令

taskset -c 1,2,3 /application/nginx/sbin/nginx start


六、nginx事件處理模型優化

nginx的鏈接處理機制在不一樣的操做系統中會採用不一樣的I/O模型:Linux上使用epoll、BSD上面用kqueue、Solaris中使用/dev/poll、windows中使用icop.

events {

    use epoll; #nginx官方建議,能夠不指定事件處理模型,Nginx會自動選擇最佳的事件處理模型

}



七、調整Nginx worker單個進程容許的客戶端最大鏈接數

worker_processes  8;

events {

    worker_connections  1024;

}

#最大鏈接數Max_client = worker_processes * worker_connections

#進程的最大鏈接數收Linux系統進程的最大打開文件數限制,在執行操做系統命令「ulimit -HSn 65535」後,才能生效

#鏈接數並非越大越好,要在系統性能能接受的範圍內



八、配置Nginx worker進程最大打開文件數

events {

    worker_rlimit_nofile 65535; #該值可設置爲系統優化後的ulimit -HSn的結果

}



九、開啓高效的文件傳輸模式

http {

    sendfile        on; #開啓文件的高效傳輸模式

}


#同時將tcp_nopush和tcp_nodelay兩個指令設置爲on,減小網絡傳輸包數量、防止網絡及磁盤的I/O阻塞,提高Nginx效率


十、設置鏈接超時時間

http {

    keepalive_timeout  65; #設置客戶端鏈接保持會話的超時時間

    tcp_nodelay on; #激活tcp_nodelay,提升I/O性能,在包含keepalive參數時纔有效

    client_header_timeout 15; #讀取客戶端請求頭數據超時時間,超時則返回「Request time out(408)」

    clietn_body_timeout 15; #讀取客戶端請求主體超時時間

    send_timeout 15; #指定客戶端響應時間

}


#將無用的鏈接儘快設置爲超時,能夠保護服務器的系統資源(CPU、內存、磁盤)


十一、上傳文件大小設置(動態應用)

http {

 client_max_body_size 10m; #具體數字要根據業務需求決定

}



十二、fastcgi調優(配合PHP引擎動態服務)

fastcgi做爲靜態服務和動態服務之間的傳接口,也有cache和buffer緩存和緩衝區

http {

    fastcgi_connect_timeout 240; #鏈接到後端fastcgi的超時時間

    fastcgi_send_timeout 240; #已經和fastcgi創建鏈接後多久不傳送數據,就會被斷開

    fastcgi_read_timeout 240; #接收fastcgi應答的超時時間

    fastcgi_buffer_size 64k; #指定讀取fastcgi應答第一部分須要多大的緩衝區,能夠設置爲gastcgi_buffers選項指定的緩衝區大小

    fastcgi_busy_buffers_size 128k; #繁忙時的buffer,能夠是fastcgi_buffer的兩倍

    fastcgi_temp_path /data/ngx_fcgi_tmp; 在寫入fastcgi_temp_path時將用多大的數據庫,默認是fastcgi_buffer的兩倍,若是過小,可能會報502 Bad GateWay

    fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_s

ize=40g; #指定相關參數配比

}


在server標籤中配合設置相關參數

server {

    location ~ .*\.(php|php5)?$ {

            root html/www;

            fastcgi_pass        127.0.0.1:9000;

            fastcgi_index       index.php;

            include fastcgi.conf;

            fastcgi_cache ngx_fcgi_cache;#表示開啓緩存併爲其指定一個名稱,開啓緩存很是有用,能夠有效下降cpu的負載,而且防止502的發生,可是也可能會帶來其餘問題

            fastcgi_cache_valid 200 302 1h; #將對應的應答碼緩存時間

            fastcgi_cache_valid 301 1d; #將301緩存1天

            fastcgi_cache_valid any 1m; #將其餘應答緩存1分鐘

            fastcgi_cache_min_uses 1; #請求數量

            fastcgi_cache_use_stale error timeout invalid_header http_500; #錯誤判斷

        }

    }



1三、配置nginx gzip壓縮功能

###(重要!!!)幾k字節的壓縮比在大數據量的衝擊下也能夠節省很多的流量,網站內容傳輸速度更快,爲用戶帶來更好的瀏覽體驗

Nginx gzip壓縮模塊提供了壓縮文件內容的功能,用戶請求的內容在發送到用戶客戶端以前,Nginx服務器會根據一些具體的策略實施壓縮,到客戶端後由瀏覽器解壓

Nginx 依賴ngx_http_gzip_module模塊

Apache 使用mod_deflate壓縮功能

http {

    gzip on; #開啓壓縮功能

    gzip_min_length 1k; #容許壓縮的最小頁面字節數,從header頭的Content-Length中獲取,無論頁面多大都進行壓縮,建議設置成大於1K,若是小於1K可能會越壓縮越大

    gzip_http_version 1.1; #壓縮版本,默認爲1.1,目前大部分瀏覽器都支持壓縮

     gzip_buffers  4 32k; #壓縮緩衝大小,容許申請4個單位爲32K的內存做爲流緩存

    gzip_comp_level 9; #壓縮比例,1最小,9最大,傳輸速度最快,可是比較消耗資源

    gzip_types text/css text/xml application/javascript; #指定壓縮的內容類型

    gzip_vary on; #vary header支持,讓前端的緩存服務器繼續緩存傳輸該壓縮頁面,而不提早解壓

}



1四、配置Nginx expires緩存功能

(重要!!!)

在網站的開發和運營過程當中,視頻、圖片、CSS、JS等網站元素的更改機會較少,咱們能夠將這些更改頻率較少的內容緩存在用戶本地,用戶在第二次訪問網站時就不用繼續去服務器下載了,節省流量,加快訪問速度

server {

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ #指定緩存文件的類型

        {

        expires      3650d; #指定緩存時間

        }

        location ~ .*\.(js|css)?$

        {

        expires      3d;

        }

}


wKioL1kmhMGzgU-LAADwNA1yag4112.png-wh_50


expires緩存的缺點就是在網站更新相關數據後,用戶若是不清理緩存看到的就會一直是過時的數據,爲了解決這個問題,能夠一、縮短緩存時間,好比百度的首頁圖片緩存時間爲一天;二、服務後臺更改圖片名稱,這樣就至關因而一個新的頁面內容,用戶會從新下載 三、相關的CSS、JS推送到CDN


1五、Nginx日誌相關優化與安全

1)天天進行日誌切割,備份

#!/bin/sh

cd /application/nginx/logs/

mv www_access.log www.access_$(date +%F -d -1day).log

mv blog_access.log blog.access_$(date +%F -d -1day).log

/application/nginx/sbin/nginx -s reload


cat >>/var/spool/cron/root<<EOF

00 00 * * * /bin/sh /server/scripts/cut_nginx_log.sh >/dev/null 2>&1

EOF


2)不記錄不須要的訪問日誌

對於健康檢查或者某些圖片、JS、CSS日誌,通常不須要記錄日誌,由於在統計PV時是按照頁面計算的,並且寫入頻繁會消耗IO,下降服務器性能

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

        access_log off;

        }


3)訪問日誌的權限設置

chown -R root.root /application/nginx/logs

chmod -R 700 /application/logs

相關文章
相關標籤/搜索