優化NGINX的25種手段

系統環境:Centos6javascript

理論:
1.關於NGINX
Nginx是一個高性能且輕量級的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP服務器。因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。其特色是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用NGINX做爲門戶的有百度、京東、新浪等等。php

2.關於優化
Nginx能夠做爲正反向代理服務器,也能夠做爲負載均衡使用,並且是一個輕量級且高性能的服務器,因此確定會出現高併發高流量的場景,並且安全問題一直處於被動狀態,各類安全漏洞依然存在,爲了減小被×××者影響服務器的正常運行,因此作了如下的優化。css

實戰:

1.隱藏版本信息

修改nginx配置文件
在nginx.conf 在http模塊下加入:
server_tokens off;
優化NGINX的25種手段html

2.防數據庫被盜取實戰

server下配置前端

location ~* "\.(sql|bak|zip|tgz|tar.gz)$"{
               return  404;
     }

測試:
優化NGINX的25種手段java

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

第一種方法:

 直接更改配置文件nginx.conf.default參數,將默認的#user nobody;改成user www.www;
優化NGINX的25種手段node

第二種方法:

  直接在編譯nginx的時候指定用戶和用戶組命令以下:
  ./configure --prefix=/application/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_modulelinux

4.優化nginx進程個數的策略

在高併發、高訪問量的web服務場景,須要事先啓動好更多的nginx進程,以保證快速響應並處理大量併發用戶的請求。
  worker_processes 1;通常調整到與CPU的顆數相同nginx

  (1)查看LInux可查看CPU個數及總核數

grep processor /proc/cpuinfo|wc -l
優化NGINX的25種手段web

  (2)查看CPU總顆數

grep 'physical id' /proc/cpuinfo |wc -l
優化NGINX的25種手段

  (3)經過執行top命令,而後按數字1,便可顯示全部的CPU核數 top命令按1鍵就會顯示第一個的信息

優化NGINX的25種手段

5.優化綁定不一樣的nginx進程在不一樣的CPU上

默認狀況下,nginx的進程跑在某一個CPU或CPU的某一個核上,致使nginx進程使用硬件的資源不均,本節的優化是不一樣的nginx進程給不一樣的CPU處理,充分有效的利用有效的硬件資源

  四核cpu配置

worker_processes 4; worker_cpu_affinity 1000 0100 0010 0001;

  雙核配置

worker_processes 2; worker_cpu_affinity 0101 1010;

  還有一個命令taskset 用來分配服務給CPU

優化NGINX的25種手段

6.nginx事件處理模型優化

nginx的鏈接處理機制在於不一樣的操做系統會採用不一樣的I/O模型,Linux下,nginx使用epoll的I/O多路複用模型,在freebsd使用kqueue的IO多路複用模型,在solaris使用/dev/pool方式的IO多路複用模型,在windows使用的icop等等。
  要根據系統類型不一樣選擇不一樣的事務處理模型,選擇有「use [ kqueue | rtsig |epool |dev/pool |select |pllo ];」咱們使用的是Centos6.5的linux,所以將nginx的事件處理模型調整爲epool模型。
設置nginx的配置文件
events { worker_connections 51200; use epoll; }
優化NGINX的25種手段
官方說明:在不指定事件處理模型時,nginx默認會自動的選擇最佳的事件處理模型服務

7.調整nginx單個進程容許的客戶端最大鏈接數

參數語法:worker_connections number
默認配置:worker_connections 51200
放置位置:events 標籤  
events { worker_connections 1024; #一個worker進程的併發 }
總併發= worker_processes* worker_connections
以下:
優化NGINX的25種手段

8.配置nginx worker進程最大打開文件數

參數語法:worker_rlimit_nofile number
放置位置:主標籤段
說明:做用是改變worker processes能打開的最大文件數
worker_rlimit_nofile 65535;
優化NGINX的25種手段
這各參數受系統文件的最大打開數限制,解決方法:
[root@leo conf]# cat /proc/sys/fs/file-max
優化NGINX的25種手段
文件系統最大可打開文件數
ulimit參數
優化NGINX的25種手段
-n指定最大打開文件數量
查看當前最大打開文件數量:
[root@leo conf]# ulimit -l
優化NGINX的25種手段
程序限制只能打開1024個文件
使用# ulimit -n 8192調整一下

9開啓高效文件傳輸模式

設置參數 sendfile on;
sendfile參數用於開啓文件的高效傳輸模式。同時將tcp_nopush和tcp_nodelay兩個指令設置爲on,可防止網絡及磁盤i/o阻塞,提高nginx工做效率。
http {   sendfile on; #放在http,server,location均可以 }
設置參數tcp_nopush;
激活tcp_nopush參數能夠容許把httpresponse header和文件的開始放在一個文件裏發佈,積極的做用是減小網絡報文段的數量(只有sendfile on開啓才生效)
例:
也能夠設置如下參數

sendfile on; 
tcp_nopush on; 
tcp_nodelay on; 
server_tokens off; 
server_names_hash_bucket_size 128; 
server_names_hash_max_size 512; 
keepalive_timeout 65; 
client_header_timeout 15s; 
client_body_timeout 15s; 
send_timeout 60s;

優化NGINX的25種手段

10.fastcgi相關參數調優

fastcgi參數是配合nginx向後請求PHP動態引擎服務的相關參數。

fastcgi_connect_timeout 300; 
fastcgi_send_timeout 300; 
fastcgi_read_timeout 300; 
fastcgi_buffer_size 64k; 
fastcgi_buffers 4 64k; 
fastcgi_busy_buffers_size 128k; 
fastcgi_temp_file_write_size 256k;

優化NGINX的25種手段

11.配置nginx gzip壓縮實現性能優化

提高網站用戶體驗:因爲發給用戶的內容小了,因此用戶訪問單位大小的頁面就快了,用戶體驗就提高了
  節約網站帶寬成本:因爲數據時壓縮傳輸的,所以,會消耗一些cpu資源
壓縮的對象:
  純文本內容壓縮比很高,所以,純文本的內容最好要壓縮
  被壓縮的純文本文件必需要大於1KB,因爲壓縮算法的特殊緣由,極小的文件壓縮反而變大
  圖片、視頻(流媒體)等文件儘可能不要壓縮,由於這些文件大多都是通過壓縮的,若是再壓縮極可能不會減少或減少不多,或者有可能增大,而在壓縮時還會消耗大量的CPU、內存資源

參數介紹及配置說明:
gzip on;                    #表示開啓壓縮功能
gzip_min_length 1k;                #表示容許壓縮的頁面最小字節數,頁面字節數從header頭的Content-Length中獲取。默認值是0,表示無論頁面多大都進行壓縮,建議設置成大於1K。若是小於1K可能會越壓越大
gzip_buffers 4 16k;                #壓縮緩存區大小
gzip_http_version 1.1;                #壓縮版本
gzip_comp_level 2;                #壓縮比率
gzip_types text/css text/xml application/javascript;  #指定壓縮的類型
gzip_vary on;  #vary header支持
完美配置:
nginx.conf http模塊

gzip on;
gzip_min_length  1k;
gzip_buffers     4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
gzip_vary on;
gzip_proxied   expired no-cache no-store private auth;
gzip_disable   "MSIE [1-6]\.";

優化NGINX的25種手段

12.nginx expires功能

爲用戶訪問網站的內容設定一個過時時間,當用戶第一次訪問到這些內容時,會把這些內容存儲在用戶瀏覽器本地,這樣用戶第二次及以後繼續訪問該網站,瀏覽器就會檢查已經緩存在用戶瀏覽器本地的內容,就不會去瀏覽器下載了,直到緩存的內容過時或者被清除爲止。

expires做用和優勢:

   expires能夠下降網站的帶寬,節約成本,加快用戶訪問網站的速度,提高了用戶訪問體驗,將內存存儲到用戶瀏覽器本地。服務器訪問量下降,服務器壓力就減輕了,服務器的成本也會下降,甚至能夠節約人力成本,幾乎對於全部web服務來講,這是很是重要的功能之一。
nginx expires 配置詳解:

location ~ ^/(images|javascript|js|css|flash|media|static)/ {
 expires 360d;
 }

expire缺點及解決辦法:

  當網站被緩存的頁面或數據更新了,此時用戶端看到的可能仍是舊的已經緩存的內容,這樣就會影響用戶體驗,那麼如何解決這個問題呢?
  第一:對於常常須要的變更圖片等文件,能夠縮短對象緩存時間,例如,百度、谷歌等網站的首頁圖片常常會換成一些節日的圖,這裏能夠將緩存期修改成1天
  第二:當網站改版或更新內容時,能夠在服務器將緩存的對象更名(網站代碼程序)
  對於網站的圖片、附件,通常不會被用戶直接修改,用戶層面上的修改圖片,其實是從新傳到服務器,雖然內容同樣可是一個新的圖片名了
  網站改版升級會修改JS、CSS元素,若改版的時候對這些元素改了名,會使得前端的CDN以及用戶端須要從新緩存內容
優化NGINX的25種手段

13.nginx日誌優化

不記錄不須要的日誌
 在實際工做中,對於負載均衡器健康檢查節點或某些特定的文件(圖片、JS、CSS)的日誌,通常不須要記錄下來,由於在統計PV時是按照頁面計算的,並且日誌寫入的太頻繁會消耗磁盤i/o,下降服務的性能
具體配製方法: 在server裏配置

location ~ .*.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
access_log off;
}
優化NGINX的25種手段

訪問日誌的權限設置
  假如日誌目錄爲/app/logs,則受權方法爲:
chown -R root.root /app/logs
chmod -R 600 /app/logs
  不須要在日誌目錄上給nginx用戶讀寫或者讀寫許可,不少人都沒有注意這個問題,這就稱爲了安全隱患。
優化NGINX的25種手段

14.nginx站點目錄及URL訪問控制

根據擴展名限制程序和文件訪問

  web2.0時代,絕大多數網站都是以用戶爲中心的,這些產品有一些共同點,就是不容許用戶發佈內容到服務器,還容許用戶發圖片甚至附件上傳到服務器上,給用戶開啓了上傳的功能。帶來了很大的安全隱患。
  下面將利用nginx配置禁止訪問上傳資源目錄下的PHP,SHELL,PERL,PYTHON程序文件,這樣就算是用戶上傳了×××文件也沒辦法執行

location ~ ^/manage/.*\.(php|php5|.sh|.pl|.py)$ {
                            deny all;
            }

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

            location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$ {                deny all;
            }

  對於上述目錄的限制必須寫在nginx處理PHP服務配置的前面
優化NGINX的25種手段

禁止訪問指定目錄下的全部文件和目錄
配置禁止訪問指定的單個或多個目錄
在server下進行配置:

location ~ ^/(static)/ {
                deny all;
        }

        location ~ ^/static {
                deny all;
        }

優化NGINX的25種手段

禁止訪問目錄而且返回代碼404
location /manage/ { return 404; }
優化NGINX的25種手段

訪問網頁測試
優化NGINX的25種手段

限制網站來源的IP訪問(實驗)

使用ngx_http_access_module限制網站來源IP訪問。
範例1:禁止外界訪問,但容許某個IP訪問該目錄
location ~ ^/oldboy/ { allow 公網IP; deny all; }
範例2:限制及指定IP或IP段訪問。
location / { deny 公網IP; allow 10.0.0.0/8; deny all; }
查看本身公網IP
http://www.ip138.com

作實驗配置:
範例1:
優化NGINX的25種手段

訪問網頁:
優化NGINX的25種手段

範例2:
配置:
優化NGINX的25種手段

訪問網頁:
優化NGINX的25種手段

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

問題:nginx如何防止用戶IP訪問網站(惡意域名解析,至關於直接使用IP訪問網站)
方法1:直接報錯,用戶體驗很差
server { listen 80 default_server; server_name _; return 501; }

方法2:經過301跳轉到主頁
server { listen 80 default_server; server_name _; rewrite ^(.*) http://www.xxx.com/$1 permanent; }

方法一實戰:
配置:這是在站點配置文件上再增長一個server
優化NGINX的25種手段

訪問網頁:
優化NGINX的25種手段

方法二實戰:
配置:定向到站點首頁
優化NGINX的25種手段

訪問網頁:
優化NGINX的25種手段

15.nginx圖片防盜鏈解決方案

簡單的說,沒有通過你的容許在本身網站嵌入你的圖片。
常見的防盜鏈解決方案的基本原理
根據HTTP referer實現防盜鏈
根據cookie防盜鏈
防盜鏈實戰
被盜鏈的網站配置

location ~* ^.+\.(jpg|png|swf|flv|rar|zip)$ {
valid_referers none blocked *.leoops.vip ;
if ($invalid_referer) {
rewrite ^/ http://azt.leoops.vip/img/attack.png;
}
root html/www;
}

當出現被盜連的時候,會自動跳轉到一下頁面
優化NGINX的25種手段

16.nginx錯誤頁面的優雅顯示

範例:當出現404錯誤會跳轉到404.html頁面
error_page 404 404/404.html;
優化NGINX的25種手段

17.部署網站程序權限設置

(1)網站的站點目錄權限設置
方案1:推薦方案
目錄:755
文件:644
全部者:root
圖片及上傳目錄設置全部者爲www

18.nginx防爬蟲優化

文件配置
set $block_user_agent 0;
if ( $http_user_agent ~ "Wget|AgentBench|BBBIKE"){
set $block_user_agent 1;
}
if ($block_user_agent = 1) {
return 404 ; rewrite ^(.*) http://azt.leoops.vip/$1 permanent;
}

檢查收錄和蜘蛛:
https://tools.aizhan.com/rb/
優化NGINX的25種手段

19.利用nginx限制HTTP的請求方法

配置:

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

配置上傳服務器限制HTTP的GET的配置

if ($request_method ~*(GET)$ ) { return 501; }

20.使用CDN作網站內容加速

cdn特色:
  本地Cache加速 提升了企業站點(尤爲含有大量圖片和靜態頁面站點)的訪問速度,並大大提升以上性質站點的穩定性
  鏡像服務 消除了不一樣運營商之間互聯的瓶頸形成的影響,實現了跨運營商的網絡加速,保證不一樣網絡中的用戶都能獲得良好的訪問質量。
  遠程加速 遠程訪問用戶根據DNS負載均衡技術智能自動選擇Cache服務器,選擇最快的Cache服務器,加快遠程訪問的速度
  帶寬優化 自動生成服務器的遠程Mirror(鏡像)cache服務器,遠程用戶訪問時從cache服務器上讀取數據,減小遠程訪問的帶寬、分擔網絡流量、減輕原站點WEB服務器負載等功能。
  集羣抗××× 普遍分佈的CDN節點加上節點之間的智能冗餘機制,能夠有效地預防×××***以及下降各類D.D.o.S×××對網站的影響,同時保證較好的服務質量 。

21.防止網站惡意×××

在http下配置
###用戶的 IP 地址 $binary_remote_addr 做爲 Key,每一個 IP 地址最多有 50 個併發鏈接
limit_conn_zone $binary_remote_addr zone=TotalConnLimitZone:10m ;
limit_conn TotalConnLimitZone 50;
limit_conn_log_level notice;

網站性能測試:
測試地址:https://loadimpact.com
優化NGINX的25種手段

併發鏈接測試

[root@leo server]# ab -c 500 -t 30 http://azt.leoops.vip/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking azt.leoops.vip (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Finished 15897 requests

Server Software:        nginx
Server Hostname:        azt.leoops.vip
Server Port:            80

Document Path:          /
Document Length:        6478 bytes

Concurrency Level:      500
Time taken for tests:   33.823 seconds
Complete requests:      15897
Failed requests:        15697
   (Connect: 0, Receive: 0, Length: 15697, Exceptions: 0)
Write errors:           0
Non-2xx responses:      15697
Total transferred:      7209787 bytes
HTML transferred:       4529182 bytes
Requests per second:    470.00 [#/sec] (mean)
Time per request:       1063.820 [ms] (mean)
Time per request:       2.128 [ms] (mean, across all concurrent requests)
Transfer rate:          208.17 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   48  97.4     41    1055
Processing:     1   67 121.6     50    1487
Waiting:        1   59 121.2     45    1486
Total:         21  115 158.8     89    1707

Percentage of the requests served within a certain time (ms)
  50%     89
  66%     97
  75%    104
  80%    111
  90%    119
  95%    128
  98%    761
  99%   1120
100%   1707 (longest request)
[root@leo server]#

22.控制nginx併發鏈接數量

ngx_http_limit_conn_module這個模塊用於限制每一個定義key值得鏈接數,特別是單個TP的鏈接數。
  不是全部的鏈接數都會被計算。一個符合計數要求的鏈接是整個請求頭已經被讀取的鏈接。
  控制Nginx併發鏈接數量參數的說明
  1)limit_conn_zone參數:
    語法:limit_conn_zone key zone=name:size;
    上下文:http
    用於設置共享內存區域,key能夠是字符串、Nginx自帶變量或前兩個組合。name爲內存區域的名稱,size爲內存區域的大小。
  2)limit_conn參數
    語法:limit_conn zone number;
    上下文:http、server、location
    用於指定key設置最大鏈接數。當超時最大鏈接數時,服務器會返回503報錯。
例:
優化NGINX的25種手段

23.控制客戶端請求nginx的速率

ngx_http_limit_req_module模塊用於限制每一個IP訪問每一個定義key的請求速率。
  limit_req_zone參數說明以下。
    語法:limit_req_zone key zone=name:size rate=rate;
    上下文:http
    用於設置共享內存區域,key能夠是字符串,Nginx自帶變量或前兩個組合。name爲內存區域的名稱,size爲內存區域的大小,rate爲速率,單位爲r/s,每秒一個請求。
  limit_req參數說明以下:
    語法:limit_req zone=name [burst-number] [nobelay]
    上下文:http、server、location
    這裏運用了令牌桶原理,burst=num,一個有num快令牌,令牌發完後,多出來的那些請求就會返回503。
  nodelay默認在不超過burst值得前提下會排隊等待處理,若是使用此參數,就會處理完num+1次請求,剩餘的請求爲超時,返回503。

24.nginx防CC×××

http配置:
優化NGINX的25種手段

每一個×××都會產生日誌
優化NGINX的25種手段

25.設置防CC×××腳本

腳本配置,自動防護

[root@leo work]# vim cc.sh      #編輯主動防護腳本
#!/bin/sh
status=`netstat -na|awk '$5 ~ /[0-9]+:[0-9]+/ {print $5}' |awk -F ":" -- '{print $1}' |sort -n|uniq -c |sort -n|tail -n 1`
NUM=`echo $status|awk '{print $1}'`
IP=`echo $status|awk '{print $2}'`
result=`echo "$NUM > 150" | bc`
if [ $result = 1 ]
then
echo IP:$IP is over $NUM, BAN IT!
/sbin/iptables -I INPUT -s $IP -j DROP
fi

[root@leo work]# crontab -e           #建立自動啓動檢測
* * * * * /server/work/cc.sh
相關文章
相關標籤/搜索