nginx調優(一)

(1).隱藏nginx版本號php

  隱藏版本號能夠有效避免黑客根據nginx版本信息,查找對應漏洞進行攻擊。html

  下載nginx源碼包(http://nginx.org/en/download.html)並上傳,在源碼編譯以前修改相應配置文件。node

[root@youxi1 ~]# tar zxf nginx-1.16.0.tar.gz -C /usr/local/src/
[root@youxi1 ~]# cd /usr/local/src/nginx-1.16.0/
[root@youxi1 nginx-1.16.0]# vim src/core/nginx.h  //修改軟件版本號
#define NGINX_VERSION      "7.0.0"  //第13行
#define NGINX_VER          "IIS/" NGINX_VERSION  //第14行
//修改HTTP頭信息中的connection字段,防止回顯具體版本號
[root@youxi1 nginx-1.16.0]# vim src/http/ngx_http_header_filter_module.c
static u_char ngx_http_server_string[] = "Server: IIS" CRLF;  //第49行
//修改nginx報404錯誤時,不回顯版本號,這一步也可使用自定義404頁面代替。
[root@youxi1 nginx-1.16.0]# vim src/http/ngx_http_special_response.c
"<hr><center>IIS</center>" CRLF  //第36行

  再以後就能夠正常編譯安裝了。nginx

//安裝依賴包
[root@youxi1 nginx-1.16.0]# yum -y install gcc gcc-c++ autoconf automake  zlib zlib-devel openssl openssl-devel pcre pcre-devel
[root@youxi1 nginx-1.16.0]# useradd -s /sbin/nologin -M nginx  //建立一個nginx專屬用戶
[root@youxi1 nginx-1.16.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module
 --with-http_gzip_static_module --with-pcre
[root@youxi1 nginx-1.16.0]# make && make install
[root@youxi1 nginx-1.16.0]# echo $?
0

  依賴包說明:c++

    gcc是C語言編輯器,gcc-c++是C++語言編輯器。autoconf和automake是用於configure和make編譯的工具。zlib和zlib-devel是nginx提供gzip模塊的必要支持。openssl和openssl是nginx提供ssl功能的必要支持。pcre和pcre-devel支持地址重寫(rewrite)功能。正則表達式

  安裝組件說明:vim

    --user=nginx --group=nginx  設置用戶和組安全

    --with-http_ssl_module  支持https(超文本傳輸安全協議)服務器

    --with-http_realip_module  獲取客戶端真實IP地址網絡

    --with-http_gzip_static_module  容許發送帶有.gz文件擴展名的預壓縮文件,而不是普通文件。(用於網頁壓縮調優)

    --with-pcre  指定pcre庫源碼位置(源碼安裝的pcre庫須要指定詳細地址)

  更多安裝組件說明能夠參考:nginx編譯安裝指定參數

  啓動nginx,查看是否隱藏了版本號。

[root@youxi1 nginx-1.16.0]# /usr/local/nginx/sbin/nginx
[root@youxi1 nginx-1.16.0]# ps aux | grep nginx
root      10639  0.0  0.1  45960  1120 ?        Ss   15:03   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     10640  0.0  0.1  46416  1884 ?        S    15:03   0:00 nginx: worker process
root      10642  0.0  0.0 112724   992 pts/0    R+   15:03   0:00 grep --color=auto nginx
[root@youxi1 nginx-1.16.0]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
success
success
[root@youxi1 nginx-1.16.0]# curl -I 192.168.5.101
HTTP/1.1 200 OK
Server: IIS/7.0.0  //版本號
Date: Sun, 11 Aug 2019 07:04:31 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Sun, 11 Aug 2019 06:30:28 GMT
Connection: keep-alive
ETag: "5d4fb604-264"
Accept-Ranges: bytes

  再使用Windows查看錯誤時返回的是不是修改過的版本號

(2).修改nginx運行用戶

  若是編譯時已經使用--user=[username] --group=[groupname],那麼其實能夠不用指定了。若是編譯時沒有指定這兩個參數,那麼能夠修改nginx的配置文件來變動nginx的運行用戶。

[root@youxi1 nginx-1.16.0]# vim /usr/local/nginx/conf/nginx.conf
user nginx;  //第2行
[root@youxi1 nginx-1.16.0]# /usr/local/nginx/sbin/nginx -s reload

(3).設置nginx運行子進程個數

  nginx運行子進程個數通常設置爲CPU的核心數、核心數的兩倍或者auto(自動獲取),也有設置爲(核心數-1)。若是CPU核心數超過8,那麼nginx的進程個數設置8就差很少了,子進程個數超過8差距就不是很大了,固然設置auto讓程序自動獲取也行。

  查看CPU的核心數,使用top命令,而後按1能夠調出CPU核心數,我這裏是4和

  修改nginx運行子進程個數

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
worker_processes  auto;  //第3行
[root@youxi1 ~]# /usr/local/nginx/sbin/nginx -s reload
[root@youxi1 ~]# ps aux | grep nginx
root       1138  0.0  0.0  46092  1948 ?        Ss   15:21   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      1490  0.0  0.0  46532  2004 ?        S    15:30   0:00 nginx: worker process
nginx      1491  0.0  0.0  46532  2004 ?        S    15:30   0:00 nginx: worker process
nginx      1492  0.0  0.0  46532  2004 ?        S    15:30   0:00 nginx: worker process
nginx      1493  0.0  0.0  46532  2004 ?        S    15:30   0:00 nginx: worker process
root       1497  0.0  0.0 112724   992 pts/0    S+   15:30   0:00 grep --color=auto nginx

  或者使用pstree查看nginx父進程和子進程的關係

[root@youxi1 ~]# yum -y install psmisc
[root@youxi1 ~]# pstree -p | grep nginx
           |-nginx(1138)-+-nginx(1490)
           |             |-nginx(1491)
           |             |-nginx(1492)
           |             `-nginx(1493)

(4).設置nginx的CPU親和力

  CPU的親和力,就是把nginx每一個子進程綁定到固定的cpu上,從而減小cpu上下文切換致使的額外的開銷。

  例如,設置nginx運行子進程個數爲2,綁定的CPU爲0和2。

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
worker_processes 2;
worker_cpu_affinity 0001 0100;  //若是是8核CPU那麼就要8個0。這裏的0001是CPU0,0100是CPU2
[root@youxi1 ~]# /usr/local/nginx/sbin/nginx -s reload
[root@youxi1 ~]# ps aux | grep nginx
root       1138  0.0  0.0  46000  1968 ?        Ss   15:21   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      1566  0.0  0.0  46436  1920 ?        S    16:27   0:00 nginx: worker process
nginx      1567  0.0  0.0  46436  1920 ?        S    16:27   0:00 nginx: worker process
root       1569  0.0  0.0 112724   988 pts/0    S+   16:27   0:00 grep --color=auto nginx
[root@youxi1 ~]# taskset -cp 1566
pid 1566's current affinity list: 0
[root@youxi1 ~]# taskset -cp 1567
pid 1567's current affinity list: 2

  生產環境中,若是不是極致要求通常不配值CPU親和,或者配置成auto便可。由於有可能會形成資源分配不均。

(5).設置nginx每一個子進程打開的最多文件數

  理論上來講,nginx子進程最多打開文件數應該是(ulimit -n)/nginx子進程個數,可是nginx分配請求並不均勻,因此能夠將子進程最多打開文件數與ulimit -n的值保持一致。

[root@youxi1 ~]# ulimit -n
1024
[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
worker_rlimit_nofile 1024;  //添加子進程個數下方
[root@youxi1 ~]# /usr/local/nginx/sbin/nginx -s reload

  至於永久修改打開文件最大數量,請查看:Linux系統調優——磁盤I/O(三)

(6).nginx事件處理模型

 1)epoll事件處理模型

  select,poll,epoll都是nginx下的I/O多路複用機制。I/O多路複用就經過一種機制,能夠監視多個描述符,一旦某個描述符就緒(通常是讀就緒或者寫就緒),可以通知程序進行相應的讀寫操做。Epoll 在Linux2.6內核中正式引入,和select和poll類似,其實都是I/O多路複用技術。

  epoll的優點:一、Epoll沒有最大併發鏈接的限制,上限是最大能夠打開文件的數目,這個數字通常遠大於2048, 通常來講這個數目和系統內存關係很大,具體數目能夠cat /proc/sys/fs/file-max察看。二、效率提高,Epoll最大的優勢就在於它只管你「活躍」的鏈接,而跟鏈接總數無關,所以在實際的網絡環境中,Epoll的效率就會遠遠高於select和poll。三、Epoll在這點上使用了「共享內存」,更省內存,效率更高。

 2)如何修改nginx事件處理模型

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
events {  //在文件開頭部分有一個events,在內部添加事件處理模型
    use epoll;  //nginx默認就是epoll
    worker_connections  1024;  //這個是單個子進程併發數量
}
[root@youxi1 ~]# /usr/local/nginx/sbin/nginx -s reload

(7).設置nginx最大併發量

  與nginx設置事件處理模型位置同樣,裏面的worker_connections是單個子進程併發數量。想要設置nginx最大併發量,就是經過設置單個子進程併發數量和子進程個數來實現。最大併發=單個子進程併發*子進程個數。

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf 
events {
    use epoll;
    worker_connections  1024;  //修改這個參數值
}
[root@youxi1 ~]# /usr/local/nginx/sbin/nginx -s reload

  worker_connections是指單個工做進程能夠容許同時創建外部鏈接的數量。不管這個鏈接是外部主動創建的,仍是內部創建的。一個工做進程創建一個鏈接後,進程將打開一個文件副本。因此這個數量還受限於,操做系統ulimit -n設定的值和nginx的worker_rlimit_nofile的值。通常狀況下系統ulimit -n、worker_rlimit_nofile 、最大併發量三者的值是同樣的(若是三者不太一致,使用過程當中它會以最小的值應用)。

(8).server_name匹配

  server_name是http{}裏的server{}裏的一個參數,是爲虛擬服務器提供識別路徑。例如,一臺服務器上配置了兩個虛擬服務器,經過server_name匹配到特定的server塊,以後轉到對應的目錄或應用服務器。

  server_name的匹配方法:

    一、精準匹配:www.baidu.com

    二、通配符匹配:*.baidu.com或www.baidu.*

    三、正則表達式匹配:~ ^.*\.baidu\.com$  (~表示區分大小寫的正則匹配;~*表示不區分大小寫的正則匹配)

    四、default或default_server

    五、IP地址

  優先級:精確匹配>左通配符匹配(*.baidu.com)>右通配符匹配(www.baidu.*)>正則表達式匹配>default或default_server。當優先級相同時,遵循自上而下的標準匹配。

   修改server_name的localhost爲default

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
    server {
        listen       80;
        server_name  default;
        location / {
            root   html;
            index  index.html index.htm;
        }
[root@youxi1 ~]# /usr/local/nginx/sbin/nginx -t  //檢測nginx配置文件是否正確
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

(9).location{}匹配

  語法規則:location [ = | ~ | ~* | ^~ ] /uri/ {...}

  語法說明:=表示精確匹配(絕對匹配);~表示區分大小寫的正則匹配;~*表示不區分大小寫的正則匹配;^~表示URI前半部分匹配,不檢測正則(例如:因爲nginx不對url作編碼,所以請求爲/static/20%/aa,能夠被規則^~ /static/ /aa匹配到(注意空格));!~和!~*是~和~*相反的意思,表示不匹配;另外還有一個最特殊的,當只有一個/時,表示通配,任何請求都會匹配到。

  實例說明

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
        #location ~ \.php$ {  //這個就表示匹配以.php結尾。\.是轉義。
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

(10).開啓高效傳輸模式

  高效傳輸模式設置是在http{}下,通常處在開頭。

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
    include       mime.types;  //媒體類型,conf目錄下的mime.types文件
    default_type  application/octet-stream;  //默認媒體類型
    sendfile        on;  //開啓高效傳輸模式
    tcp_nopush     on;  //必須在sendfile開啓模式下才有效,防止網絡堵塞,積極的減小網絡報文段的數量

  sendfile參數指定nginx是否調用sendfile函數來輸出文件,對於普通應用設爲on,若是用來下載等應用磁盤I/O重負擔應用,可設置爲off。

(11).鏈接超時時間

  主要目的是保護服務器資源,CPU,內存,控制鏈接數,由於創建鏈接也是須要消耗資源的,TCP的三次握手四次揮手等,咱們通常斷掉的是那些創建鏈接可是不作事的,也就是從創建了連接開始,可是後續的握手過程沒有進行,那麼咱們的連接處於等待狀態的,所有斷掉。另外,php建議短鏈接。

  鏈接超時設置是在http{}下,通常處在開頭。

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
    keepalive_timeout  65;  //緊跟該行
    tcp_nodelay on;
    client_header_timeout 15;
    client_body_timeout 15;
    send_timeout 15;

  參數說明:

    keepalived_timeout客戶端鏈接保持會話超時時間,超過這個時間,服務器斷開這個連接。

    tcp_nodelay也是防止網絡阻塞,不過要包涵在keepalived參數纔有效。

    client_header_timeout客戶端請求頭讀取超時時間,若是超過設個時間沒有發送任何數據,nginx將返回request time out的錯誤。

    client_body_timeout客戶端求主體超時時間,超過這個時間沒有發送任何數據,和上面同樣的錯誤提示。

    send_timeout響應客戶端超時時間,這個超時時間僅限於兩個活動之間的時間,若是超過這個時間,客戶端沒有任何活動,nginx關閉鏈接。

(12).文件上傳限制大小

  在http{}頭部添加

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
http{
......
    client_max_body_size 10m;  //上限10M
......
}
相關文章
相關標籤/搜索