天天看點

nginx優化

1、隐藏nginx header版本号

2、更改源碼隐藏軟體名稱

3、更改nginx預設使用者及使用者組

4、配置nginx worker程序個數

5、根據CPU核數進行nginx程序優化

6、nginx事件處理模型優化

7、調整Nginx worker單個程序允許的用戶端最大連接配接數

8、配置Nginx worker程序最大打開檔案數

9、開啟高效的檔案傳輸模式

10、設定連接配接逾時時間

11、上傳檔案大小設定(動态應用)

12、fastcgi調優(配合PHP引擎動态服務)

13、配置nginx gzip壓縮功能

14、配置Nginx expires緩存功能

15、Nginx日志相關優化與安全

16、Nginx站點目錄及檔案URL通路控制(防止惡意解析)

17、防止惡意解析通路企業網站

18、Nginx圖檔及目錄防盜鍊

19、Nginx錯誤頁面的優雅顯示

20、Nginx防爬蟲優化

21 、限制HTTP請求方法

22、防DOS攻擊

23、使用CDN為網站内容加速

24、Nginx程式架構優化

25、使用普通使用者啟動Nginx(監牢模式)

檢視版本号

1

2

3

4

5

6

7

8

[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

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是否對外展示敏感資訊

9

[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

修改為如下

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

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

重新編譯安裝nginx,重新開機服務

10

[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降級運作

worker_processes  8; #最好為伺服器CPU的邏輯核心數

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

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

cpu cores         : 4

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

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

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

worker_processes  8;

worker_cpu_affinity 001 0010 0100 1000; #數字代表1、2、3、4的掩碼,平均分攤程序壓力

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

防止程序隻在一個核心上運作也可以使用 taskset 指令

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

nginx的連接配接處理機制在不同的作業系統中會采用不同的I/O模型:Linux上使用epoll、BSD上面用kqueue、Solaris中使用/dev/poll、windows中使用icop.

events {

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

worker_processes  8;

    worker_connections  1024;

#最大連接配接數Max_client = worker_processes * worker_connections

#程序的最大連接配接數收Linux系統程序的最大打開檔案數限制,在執行作業系統指令“ulimit -HSn 65535”後,才能生效

#連接配接數并不是越大越好,要在系統性能能接受的範圍内

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

    sendfile        on; #開啟檔案的高效傳輸模式

#同時将tcp_nopush和tcp_nodelay兩個指令設定為on,減少網絡傳輸包數量、防止網絡及磁盤的I/O阻塞,提升Nginx效率

    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、記憶體、磁盤)

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

fastcgi作為靜态服務和動态服務之間的傳接口,也有cache和buffer緩存和緩沖區

    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标簽中配合設定相關參數

11

12

13

14

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; #錯誤判斷

        }

    }

###(重要!!!)幾k位元組的壓縮比在大資料量的沖擊下也可以節省不少的流量,網站内容傳輸速度更快,為使用者帶來更好的浏覽體驗

Nginx gzip壓縮子產品提供了壓縮檔案内容的功能,使用者請求的内容在發送到使用者用戶端之前,Nginx伺服器會根據一些具體的政策實施壓縮,到用戶端後由浏覽器解壓

Nginx 依賴ngx_http_gzip_module子產品

Apache 使用mod_deflate壓縮功能

    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支援,讓前端的緩存伺服器繼續緩存傳輸該壓縮頁面,而不提前解壓

(重要!!!)

在網站的開發和營運過程中,視訊、圖檔、CSS、JS等網站元素的更改機會較少,我們可以将這些更改頻率較少的内容緩存在使用者本地,使用者在第二次通路網站時就不用繼續去伺服器下載下傳了,節省流量,加快通路速度

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

        {

        expires      3650d; #指定緩存時間

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

        expires      3d;

wKiom1e2xyexI6EMAADwMtXZYfg157.png

expires緩存的缺點就是在網站更新相關資料後,使用者如果不清理緩存看到的就會一直是過期的資料,為了解決這個問題,可以1、縮短緩存時間,比如百度的首頁圖檔緩存時間為一天;2、服務背景更改圖檔名稱,這樣就相當于是一個新的頁面内容,使用者會重新下載下傳 3、相關的CSS、JS推送到CDN

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

1)根據擴充名限制程式或者檔案被通路

資源檔案夾如使用者上傳的頭像,防止惡意上傳腳本病毒檔案被解析執行

15

16

17

location ~ ^/images/.*\.(php|php5|sh|pl|py)$ { #指定目錄限制通路

            deny all;

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

        location ~ ^/data/.*\.(php|php5|sh|pl|py)$ {

        location ~ .*\.(php|php5)?$ { #必須配置在解析之前

2)禁止通路目錄并傳回指定HTTP代碼

    location /admin/ { return 404; }

3)限制網站來源IP

location ~ ^/admin/ {

            allow 202.111.12.211;

           #allow 192.168.1.0/24; #也可以限制IP段

企業問題案列:Nginx做方向代理的時候可以限制用戶端IP嗎?

方法一:用if來控制

if ( $remotea_addr = 10.0.0.110 ) {

  return 403;

if ( $remotea_addr = 10.0.0.111 ) {

  set $allow_access_root 'true';

方法二:利用deny和allow

location / {

  root html/blog;

  index index.php index.html index.html;

  deny 10.0.0.7;

  allow all;

方法一

  listen 80 default_server;

  server_name _;

  return 501;

方法二

  rewrite ^(.*) http://www.lichengbing.cn$1 permanent;

方法三

 if ($host !~ ^www/.lichengbing/.com$) {

網站圖檔被盜鍊最直接的影響就是網絡帶寬占用加大了,寬帶費用變高了,網絡流量忽高忽低,Zabbix頻繁告警

由于購買了CDN加速,流量高了好幾個G,瞬間損失好幾萬...

利用referer防盜鍊

location ~.* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {

    valid_referers none blocked *.lichengbing.cn lichengbing.cn;

 if ($invalid_referer) {

    rewrite ^/ http://www.lichengbing.cn/img/nolink.jpg

   }

#或者也可以使用NginxHttpAccessKeyModule實作防盜鍊

  error_page 403   /403.html; #當出現403錯誤時,會跳轉到403.html頁面

robots.txt機器人協定

網絡爬蟲排除标準,告訴搜尋引擎哪些目錄可以抓取,哪些禁止抓取

禁止下載下傳協定代理

if ($http_user_agent ~* LWP::Simple|BBBike|wget) {

    return 403;

防止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;

禁止不同浏覽器通路

if ($http_user_agent ~* “Firefox|MSIE”)

{

rewrite ^(.*) http://blog.etiantian.org/$1 permanent

if ($request_method !~ ^(GET|HEAD|POST)$ ) {

   return 501;

隻允許GET等,允許DELETE、SEARCH等

為防止黑客通過上傳伺服器執行木馬,也可以在上傳伺服器上做限制HTTP的GET

if ($request_method ~* ^(GET)$ ) {

使用limit_conn_zone進行控制,控制單個IP或域名的通路次數,限制連續通路

limit_conn_zone $binary_remote_addr zone=perip:10m;

limit_conn_zone $server_remote_addr zone=perserver:10m;

limit_conn perip 10;

limit_conn perserver 100;

#還可以使用limit_req_zone進行控制,控制單個IP的通路速率

全國或全球的内容分布式緩存叢集,其實質通過智能DNS判斷使用者的來源地域及上網線路,為使用者選擇一個最接近使用者地域,以及和使用者上網線路相同的伺服器節點,提升使用者浏覽網站的體驗

要加速的業務資料應該存在獨立的域名,然後删除A記錄解析,使用CNAME解析

解耦,一堆程式代碼按照業務用途分開,然後提供服務,例如:注冊登入、上傳、下載下傳、浏覽清單、商品内容、訂單支付等都應該是獨立的程式服務,隻不過在用戶端看來是一個整體而已,小公司最起碼要做到的解耦是

01網頁頁面服務

02圖檔附件及下載下傳服務

03上傳圖檔服務

降級思想,Nginx的Master程序使用的是root使用者,worker程序使用的是nginx指定的普通使用者,用root跑nginx的Master程序有兩大問題:1是最小化權限配置設定遇到問題;2、網站一旦有漏洞,很容易丢掉root權限

降級執行的好處:

1、建立普通使用者inca,用inca跑Nginx服務,開發運維都使用普通帳号,隻要和inca同組,照樣可以管理nginx,還解決了root權限太大問題

2、職責分明,相關賬号負責維護程式和日志,出問題負首要責任

轉自:http://xiaofeng886.blog.51cto.com/781833/1917247

本文轉自飛奔的小GUI部落格51CTO部落格,原文連結http://blog.51cto.com/9237101/1917365如需轉載請自行聯系原作者

ziwenzhou

繼續閱讀