[Nginx] – 性能優化 – 配置文件優化 [一]

Nginx幫助文檔 
Nginx配置文檔

[Nginx] – 性能優化 – 配置文件優化 [一]

摘要

一般來說,軟件的漏洞都和版本有關,因此我們應儘量隱藏或清除Web服務隊訪問的用戶顯示各類敏感信息(例如:Web軟件名稱及版本號等信息),這樣惡意的用戶就很難猜到他攻擊的服務器所用的是否是特定漏洞的軟件,或者是否有對應的漏洞存在

          首先在此感謝下我的老師-老男孩專家擁有16年一線實戰經驗,爲我們運維班28期所有成員的耐心講解,未經本人同意禁止轉載
博客地址:oldboy

Nginx基本安全優化

1.調整參數隱藏Nginx版本號信息
    一般來說,軟件的漏洞都和版本有關,因此我們應儘量隱藏或清除Web服務隊訪問的用戶顯示各類敏感信息(例如:Web軟件名稱及版本號等信息),這樣惡意的用戶就很難猜到他攻擊的服務器所用的是否是特定漏洞的軟件,或者是否有對應的漏洞存在。
修改Nginx版本信息

[[email protected] ~]# vim /application/nginx/conf/nginx.conf
http{
    server_tokens off;
}
#我們在http標籤端開啓即可

沒修改之前
[[email protected] ~]# curl -I blog.etiantian.org
HTTP/1.1 200 OK
Server: nginx/1.6.3
Date: Mon, 30 May 2016 11:17:14 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.5.32
Link: <http://blog.etiantian.org/?rest_route=/>; rel="https://api.w.org/"
修改後結果(需要重啓生效)
[[email protected] ~]# curl -I blog.etiantian.org
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 30 May 2016 11:21:33 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.5.32
Link: <http://blog.etiantian.org/?rest_route=/>; rel="https://api.w.org/"
修改爲後瀏覽器訪問404界面也不會出現版本信息

server_tokens參數的官方說明如下:
syntax    server_tokens on|off;   #此行爲參數語法,on爲開啓,off爲關閉
default    server_tokens on;        #此行意思是不配置該參數,軟件默認情況的結果
context    http,server,location    #此行爲server_tokens參數可以放置的位置
參數作用:激活或禁止Nginx的版本信息顯示在報錯信息裏以及server的響應首部位置
Enables or disables emitting of nginx version in error messages and in the Server response header field   #此行是參數的作用原文

2.更改源碼隱藏Nginx軟件名及版本號

    隱藏了Nginx版本號後,更進一步,可以通過一些手段把web服務軟件的名稱也給因此,或者更改爲其他Web服務軟件名迷惑黑客。Nginx模塊不支持更改軟件名,所以我們需要更改Nginx源代碼才能解決。
1.第一步是一次修改3個Nginx源碼文件
修改的第一個文件爲nginx-1.6.3/src/core/nginx.h
[[email protected] ~]# cd /home/oldboy/tools/nginx-1.6.3/src/core/
[[email protected] core]# vim nginx.
#define NGINX_VERSION      "9.9.9"
#修改爲想要的版本號
#define NGINX_VER          "ABCDOCKER/" NGINX_VERSION
#將nginx修改想要修改的軟件名稱
#define NGINX_VAR          "ABCDOCKER"
#將nginx修改爲想要修改的軟件名稱。
#define NGX_OLDPID_EXT     ".oldbin"
2.第二步修改nginx-1.6.3/src/http/ngx_http_header_filter_module.c的第49行
[[email protected] nginx-1.6.3]# vim src/http/ngx_http_header_filter_module.
static char ngx_http_server_string[] = "Server: ABCDOCKER"    CRLF;
#修改本行,此處的文件是我們Curl 出來顯示的名稱
3.第三步修改nginx-1.6.3/src/http/ngx_http_special_response.c,對外頁面報錯時,它會控制是否展示敏感信息。修改28~30行
[[email protected] nginx-1.6.3]# vim src/http/ngx_http_special_response.
 21 static u_char ngx_http_error_full_tail[] =
 22 "<hr><center>"ABC(www.abcdocker.com)"</center>" CRLF
 23 "</body>" CRLF
 24 "</html>" CRLF
 25 ;
 26 
 27 
 28 static u_char ngx_http_error_tail[] =
 29 "<hr><center>ABC(www.abcdocker.com)</center>" CRLF
 30 "</body>" CRLF
 31 "</html>" CRLF

 5.修改完成之後需要重新編譯nginx
查看原來編譯的參數
[[email protected] nginx-1.6.3]# /application/nginx/sbin/nginx -V
nginx version: nginx/1.6.3
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC) 
TLS SNI support enabled
configure arguments: --prefix=/application/nginx-1.6.3/ --user=www --group=www --with-http_ssl_module --with-http_stub_status_module
[[email protected] nginx-1.6.3]# ./configure --prefix=/application/nginx-1.6.3/ --user=www --group=www --with-http_ssl_module --with-http_stub_status_module
提示:需要停止原來的nginx,從新進行編譯。如果不想在覆蓋原來的編譯參數可以選擇指定新的目錄。
提示:最後還需要make  makeinstall 纔會生效
測試:需要開啓nginx
[[email protected] application]# curl -I blog.etiantian.org
HTTP/1.1 200 OK
Server: ABCDOCKER
Date: Mon, 30 May 2016 12:07:19 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.5.32
Link: <http://blog.etiantian.org/?rest_route=/>; rel="https://api.w.org/"
因爲我優化了,所以Server:後面除了我設置的字母不會顯示版本信息,修改配置文件server_tokens off;  修改爲on即可
     重啓nginx
[[email protected] application]# curl -I blog.etiantian.org
HTTP/1.1 200 OK
Server: ABCDOCKER/9.9.9
Date: Mon, 30 May 2016 12:09:05 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.5.32
Link: <http://blog.etiantian.org/?rest_route=/>; rel="https://api.w.org/"

   關閉 server_tokens off;   可以顯示我們設置的錯誤

 說明:
1.提示網站安全,要從最簡單、最短板、最低點入手解決問題,門大開着,窗戶安裝再結實的護欄也沒有意義。
2.向有經驗的人及優秀的網站公司學習。
3.學習看官方文檔,根據一手資料去分析
4.命令輸出結果中含有需要過濾或者要保留的內容時,命令自身可能有參數直接實現。

3.更改Nginx服務的默認用戶

    爲了Web服務更安全,我們要儘可能地改掉軟件默認的所有配置,包括端口、用戶等。
查看nginx服務對應的默認用戶,查看默認配置文件
[[email protected] ~]# grep "#user" /application/nginx/conf/nginx.conf.default 
#user  nobody;
    爲了防止黑客猜到這個Web服務用戶,我們需要更改成特殊的用戶名,但這個用戶必須是系統事先存在的
(1)爲Nginx服務建立新用戶
[[email protected] ~]# useradd nginx -s /sbin/nologin -M
[[email protected] ~]# id nginx
(2)配置Nginx服務,讓其使用剛建立的nginx用戶
更改ningx服務默認使用的用戶方法有兩種:
第一種爲直接更改配置文件參數,將默認的#user nobody修改如下內容
user nginx nginx;
#在http標籤即可
如果註釋或不設置上述參數,默認即是nobody用戶,不推薦使用。最好採用一個普通用戶
第二種爲直接在編譯nginx軟件時指定編譯的用戶和組
./configure --prefix=/application/nginx-1.6.3/ --user=www --group=www --with-http_ssl_module --with-http_stub_status_module
提示:前文在編譯nginx服務時,就是這樣帶着參數,因此配置文件中加不加參數默認都是nginx用戶了。
    通過上述修改後Nginx進程,可以看到worker processes進程對應的用戶都變成了nginx

4.優化Nginx服務的worker進程個數

    在高併發、訪問量的Web服務場景,需要事先啓動好更多的nginx進程,以保證快速響應並處理大量併發用戶的請求.
優化Nginx進程對應nginx服務的配置參數如下:
worker_processes  1;
    上述參數調整的是Nginx服務的Worker進程數,Nginx有Master進程和Worker進程之分,Master爲管理進程,worker是工作進程
下面介紹Linux服務CPU總核數的方法
[[email protected] ~]$ grep "processor" /proc/cpuinfo |wc -l
1
[[email protected] ~]$ grep -c processor /proc/cpuinfo 
1
#此處的1表示1顆1核的CPU
查看cpu總顆數
[[email protected] ~]$ grep "pysical id" /proc/cpuinfo |sort|uniq|wc -l
1  #對phsical id 去重計算,表示1顆CPU
執行top命令,然後按數字1,即可顯示所有的cpu核數,如下

 單核CPU顯示如下:

 有關worker_process參數的官方說明如下:
syntax    worker_processes number:#此行爲參數語法,number爲數量
default    worker_processes 1    #此行意思是不配置該參數,軟件默認情況爲1
context    main               #此行爲worker_processes參數可以放置的位置
worker_processes爲定義worker進程數的數量,建議設置爲CPU的核數或者cpu核數*2的進程數,具體情況要根據實際業務來進行選擇。除了要和CPU核數的匹配外,和硬盤存儲的數據以及系統的負載也會有關,設置爲CPU的個數或核數是一個好的起始配置

5.優化綁定不同的Nginx進程到不同CPU上

    默認情況Nginx的多個進程有可能跑在某一個或某一核的CPU上,導致Nginx進程使用硬件的資源不均。可以分配不同的Nginx進程給不同的CPU處理,達到充分有效利用硬件的多CPU多核資源的目的。
worker_processes      main               #此行爲worker_processes參數可以放置的位置
worker_processes爲定義worker進程數的數量,建議設置爲CPU的核數或者cpu核數*2的進程數,具體情況要根據實際業務來進行選擇。除了要和CPU核數的匹配外,和硬盤存儲的數據以及系統的負載也會有關,設置爲CPU的個數或核數是一個好的起始配置

5.優化綁定不同的Nginx進程到不同CPU上

    默認情況Nginx的多個進程有可能跑在某一個或某一核的CPU上,導致Nginx進程使用硬件的資源不均。可以分配不同的Nginx進程給不同的CPU處理,達到充分有效利用硬件的多CPU多核資源的目的。
worker_processes  1;
worker_cpu_affinity 0001 0010 worker進程數的數量,建議設置爲CPU的核數或者cpu核數*2的進程數,具體情況要根據實際業務來進行選擇。除了要和CPU核數的匹配外,和硬盤存儲的數據以及系統的負載也會有關,設置爲CPU的個數或核數是一個好的起始配置

5.優化綁定不同的Nginx進程到不同CPU上

    默認情況Nginx的多個進程有可能跑在某一個或某一核的CPU上,導致Nginx進程使用硬件的資源不均。可以分配不同的Nginx進程給不同的CPU處理,達到充分有效利用硬件的多CPU多核資源的目的。
worker_processes  1;
worker_cpu_affinity 0001 0010 0100 的個數或核數是一個好的起始配置

5.優化綁定

相關文章
相關標籤/搜索