nginx的優化
1. gzip壓縮優化 2. expires緩存有還 3. 網絡IO事件模型優化 4. 隱藏軟件名稱和版本號 5. 防盜鏈優化 6. 禁止惡意域名解析 7. 禁止經過IP地址訪問網站 8. HTTP請求方法優化 9. 防DOS攻擊單IP併發鏈接的控制,與鏈接速率控制 10. 嚴格設置web站點目錄的權限 11. 將nginx進程以及站點運行於監牢模式 12. 經過robot協議以及HTTP_USER_AGENT防爬蟲優化 13. 配置錯誤頁面根據錯誤碼指定網頁反饋給用戶 14. nginx日誌相關優化訪問日誌切割輪詢,不記錄指定元素日誌、最小化日誌目錄權限 15. 限制上傳到資源目錄的程序被訪問,防止木馬入侵系統破壞文件 16. FastCGI參數buffer和cache配置文件的優化 17. php.ini和php-fpm.conf配置文件的優化 18. 有關web服務的Linux內核方面深度優化(網絡鏈接、IO、內存等) 19. nginx加密傳輸優化(SSL) 20. web服務器磁盤掛載及網絡文件系統的優化 21. 使用nginx cache
一、基本安全優化
1.1 隱藏版本信息
通常來講,軟件的漏洞都和版本相關,因此咱們要隱藏或消除web服務對訪問用戶顯示的各類敏感信息。javascript
1 [root@db01 rpm]# curl -I 10.0.0.8 2 HTTP/1.1 401 Unauthorized 3 Server: nginx #隱藏版本號 4 Date: Thu, 21 Jul 2016 03:23:38 GMT 5 Content-Type: text/html 6 Content-Length: 188 7 Connection: keep-alive 8 WWW-Authenticate: Basic realm="oldboy training" 9 過程: 10 vim /application/nginx/conf/nginx.conf 11 在http模塊下加入: 12 server_tokens off; 13 /application/nginx/sbin/nginx -t 14 /application/nginx/sbin/nginx -s reload
1.2 隱藏nginx要修改源代碼
要修改內容的路徑:php
第一路徑:css
1 /home/oldboy/tools/nginx-1.6.3/src/core/nginx.h 第14,16行 2 #define NGINX_VERSION "1.6.2" 修改成想要的版本號如2.4.3 3 #define NGINX_VER "nginx/" NGINX_VERSION 將nginx修改成想要修改的軟件名稱,如Apache。
第二路徑html
1 /home/oldboy/tools/nginx-1.6.3/src/http/ngx_http_header_filter_module.c第49行 2 grep 'Server:nginx' ngx_http_header_filter_module.cstatic 3 sed -i 's#Server:nginx#Server:Apache#g' ngx_http_header_filter_module.c
第三路徑前端
/home/oldboy/tools/nginx-1.6.3/src/http/ngx_http_special_response.c第21,30行 "<hr><center>"NGINX_VER "(http://oldboy.blog.51cto.com)</center>" CRLF "<hr><center>OWS</center>" CRLF
而後從新編譯java
1.3 更改nginx服務的默認用戶
第一種方法:node
直接更改配置文件nginx.conf.default參數,將默認的#user nobody;改成user nginx.nginx;linux
第二種方法:nginx
直接在編譯nginx的時候指定用戶和用戶組命令以下:web
./configure --prefix=/application/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module
1.4 降權啓動nginx
1 useradd inca 2 cd /home/inca/ 3 mkdir conf logs www 4 echo inca >www/index.html 5 chown -R inca.inca * 6 ln -s /application/nginx/conf/mime.types conf/mime.types #mime.types媒體類型文件
egrep -v "#|^$" /application/nginx/conf/nginx.conf.default >conf/nginx.conf
nginx.conf配置文件
worker_processes 1; error_log /home/inca/logs/error.log; pid /home/inca/logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 8080; server_name localhost; location / { root /home/inca/www; index index.html index.htm; } access_log /home/inca/logs/access.log main; } }
su - inca -c "/application/nginx/sbin/nginx -c /home/inca/conf/nginx.conf" #啓動nginx服務
重點強調:
1.nginx.conf裏面的相關路徑都要更改
2.普通用戶的端口問題
二、 根據參數優化nginx服務性能
2.1 優化nginx進程個數的策略
在高併發、高訪問量的web服務場景,須要事先啓動好更多的nginx進程,以保證快速響應並處理大量併發用戶的請求。
worker_processes 1;通常調整到與CPU的顆數相同
(1)查看LInux可查看CPU個數及總核數
grep processor /proc/cpuinfo|wc -l
(2)查看CPU總顆數
grep 'physical id' /proc/cpuinfo|sort|uniq|wc -l
(3)經過執行top命令,而後按數字1,便可顯示全部的CPU核數
top 按1鍵就會顯示第一個的信息 Cpu0 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0
2.2 優化綁定不一樣的nginx進程到不一樣的CPU上
默認狀況下,nginx的進程跑在某一個CPU或CPU的某一個核上,致使nginx進程使用硬件的資源不均,本節的優化是不一樣的nginx進程給不一樣的CPU處理,充分有效的利用有效的硬件資源
四核cpu配置
worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000;
雙核配置
worker_processes 2; worker_cpu_affinity 0101 1010;
還有一個命令taskset -c用來分配服務給CPU
2.3 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模型。
events { worker_connections 1024; use epoll; }
官方說明:在不指定事件處理模型時,nginx默認會自動的選擇最佳的事件處理模型服務
2.4 調整nginx單個進程容許的客戶端最大鏈接數
參數語法:worker_connections number
默認配置:worker_connections 512
放置位置:events 標籤
events { worker_connections 1024; #一個worker進程的併發 }
總併發= worker_processes* worker_connections
2.5 配置nginx worker進程最大打開文件數
參數語法:worker_rlimit_nofile number
放置位置:主標籤段
說明:做用是改變worker processes能打開的最大文件數
worker_rlimit_nofile 65535;
這各參數受系統文件的最大打開數限制,解決方法:
[root@admin nginx]# cat /proc/sys/fs/file-max 8192
文件系統最大可打開文件數
[root@admin nginx]# ulimit -n 1024
程序限制只能打開1024個文件
使用# ulimit -n 8192調整一下
或者永久調整打開文件數 可在啓動文件/etc/rc.d/rc.local末尾添加(在/etc/sysctl.conf末尾添加fs.file-max=xxx無效)
2.6 開啓高效文件傳輸模式
設置參數 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;
2.7 FastCGI相關參數調優
fastcgi參數是配合nginx向後請求PHP動態引擎服務的相關參數。
fastcgi_connect_timeout 240; fastcgi_send_timeout 240; fastcgi_read_timeout 240; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; #fastcgi_temp_path /data/ngx_fcgi_tmp; fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
2.8 配置nginx gzip壓縮實現性能優化
nginx壓縮功能的介紹:
nginx gzip壓縮模塊提供了壓縮文件內容的功能,用戶請求的內容在發送給客戶端以前,nginx服務器會根據一些具體的策略實施壓縮,以節省網站出口帶寬,同時加快了數據傳輸效率,提高了用戶的訪問體驗。
2.8.1 壓縮的優勢:
提高網站用戶體驗:因爲發給用戶的內容小了,因此用戶訪問單位大小的頁面就快了,用戶體驗就提高了
節約網站帶寬成本:因爲數據時壓縮傳輸的,所以,會消耗一些cpu資源
2.8.2 壓縮的對象:
純文本內容壓縮比很高,所以,純文本的內容最好要壓縮
被壓縮的純文本文件必需要大於1KB,因爲壓縮算法的特殊緣由,極小的文件壓縮反而變大
圖片、視頻(流媒體)等文件儘可能不要壓縮,由於這些文件大多都是通過壓縮的,若是再壓縮極可能不會減少或減少不多,或者有可能增大,而在壓縮時還會消耗大量的CPU、內存資源
2.8.3 參數介紹及配置說明:
gzip on; #表示開啓壓縮功能
gzip_min_length 1k; #表示容許壓縮的頁面最小字節數,頁面字節數從header頭的Content-Length中獲取。默認值是0,表示無論頁面多大都進行壓縮,建議設置成大於1K。若是小於1K可能會越壓越大
gzip_buffers 4 32k; #壓縮緩存區大小
gzip_http_version 1.1; #壓縮版本
gzip_comp_level 9; #壓縮比率
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 32k; gzip_http_version 1.1; gzip_comp_level 9; gzip_types text/css text/xml application/javascript; gzip_vary on;
2.9 nginx expires功能
爲用戶訪問網站的內容設定一個過時時間,當用戶第一次訪問到這些內容時,會把這些內容存儲在用戶瀏覽器本地,這樣用戶第二次及以後繼續訪問該網站,瀏覽器就會檢查已經緩存在用戶瀏覽器本地的內容,就不會去瀏覽器下載了,直到緩存的內容過時或者被清除爲止。
2.9.1 expires做用和優勢:
expires能夠下降網站的帶寬,節約成本
加快用戶訪問網站的速度,提高了用戶訪問體驗
服務器訪問量下降,服務器壓力就減輕了,服務器的成本也會下降,甚至能夠節約人力成本
幾乎對於全部web服務來講,這是很是重要的功能之一,apache服務也有此功能。
2.9.2 nginx expires 配置詳解:
## Add expires header according to URI(path or dir). location ~ ^/(images|javascript|js|css|flash|media|static)/ { expires 360d; }
2.9.3 expire缺點及解決辦法:
當網站被緩存的頁面或數據更新了,此時用戶端看到的可能仍是舊的已經緩存的內容,這樣就會影響用戶體驗,那麼如何解決這個問題呢?
第一:對於常常須要的變更圖片等文件,能夠縮短對象緩存時間,例如,百度、谷歌等網站的首頁圖片常常會換成一些節日的圖,這裏能夠將緩存期修改成1天
第二:當網站改版或更新內容時,能夠在服務器將緩存的對象更名(網站代碼程序)
對於網站的圖片、附件,通常不會被用戶直接修改,用戶層面上的修改圖片,其實是從新傳到服務器,雖然內容同樣可是一個新的圖片名了
網站改版升級會修改JS、CSS元素,若改版的時候對這些元素改了名,會使得前端的CDN以及用戶端須要從新緩存內容
3. nginx日誌的優化
3.1 編寫腳本實現日誌輪詢
編寫腳本實現nginx access日誌輪詢
用戶咋請求一個軟件時,絕大多數軟件都會記錄用戶的訪問狀況,nginx軟件目前沒有相似apache經過cronolog或者rotatelog對日誌分隔處理的功能,可是,運維人員能夠經過利用腳本開發、nginx的信號控制功能或reload從新加載,來實現日誌的自動切割、輪詢。
操做步驟:
寫一個定時任務
mv www_access.log www_access_$(date +F -d -1day).log /applocation/nginx/sbin/nginx -s reload
3.2 不記錄不須要的日誌
在實際工做中,對於負載均衡器健康檢查節點或某些特定的文件(圖片、JS、CSS)的日誌,通常不須要記錄下來,由於在統計PV時是按照頁面計算的,並且日誌寫入的太頻繁會消耗磁盤i/o,下降服務的性能
具體配製方法: location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ { access_log off; }
3.3訪問日誌的權限設置
假如日誌目錄爲/app/logs,則受權方法爲:
chown -R root.root /app/logs chmod -R 600 /app/logs
不須要在日誌目錄上給nginx用戶讀寫或者讀寫許可,不少人都沒有注意這個問題,這就稱爲了安全隱患。
4. nginx站點目錄及文件URL訪問控制
4.1 根據擴展名限制程序和文件訪問
web2.0時代,絕大多數網站都是以用戶爲中心的,這些產品有一些共同點,就是不容許用戶發佈內容到服務器,還容許用戶發圖片甚至附件上傳到服務器上,給用戶開啓了上傳的功能。帶來了很大的安全隱患。
下面將利用nginx配置禁止訪問上傳資源目錄下的PHP,SHELL,PERL,PYTHON程序文件,這樣就算是用戶上傳了木馬文件也沒辦法執行
1 location ~ ^/images/.*\.(php|php5|.sh|.pl|.py)$ 2 { 3 deny all; 4 } 5 location ~ ^/static/.*\.(php|php5|.sh|.pl|.py)$ 6 { 7 deny all; 8 } 9 location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$ 10 { 11 deny all; 12 }
對於上述目錄的限制必須寫在nginx處理PHP服務配置的前面
4.2 禁止訪問指定目錄下的全部文件和目錄
配置禁止訪問指定的單個或多個目錄
location ~ ^/(static)/ { deny all; } location ~ ^/static { deny all; }
禁止訪問目錄而且返回代碼404
server { listen 80; server_name www.etiantian.org etiantian.org; root /data0/www/www; index index.html index.htm; access_log /app/logs/www_access.log commonlog; location /admin/ { return 404; } location /templates/ { return 403; } }
4.3 限制網站來源的IP訪問
使用ngx_http_access_module限制網站來源IP訪問。
範例1:禁止外界訪問,但容許某個IP訪問該目錄
location ~ ^/oldboy/ { allow 202.111.12.211; deny all; }
範例2:限制及指定IP或IP段訪問。
location / { deny 192.168.1.1; allow 192.168.1.0/24; allow 10.1.1.0/16; deny all; }
4.4 配置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//:blog.etiantian.org/$1 permanent; }
5. nginx圖片防盜鏈解決方案。
簡單的說,沒有通過你的容許在本身網站嵌入你的圖片。
5.1 常見的防盜鏈解決方案的基本原理
- 根據HTTP referer實現防盜鏈
- 根據cookie防盜鏈
5.2 防盜鏈實戰
被盜鏈的網站配置
1 #Preventing hot linking of images and other file types 2 3 location ~* ^.+\.(jpg|png|swf|flv|rar|zip)$ { 4 5 valid_referers none blocked *.etiantian.org etiantian.org; 6 7 if ($invalid_referer) { 8 9 rewrite ^/ http://bbs.etiantian.org/img/nolink.gif; 10 11 } 12 13 root html/www; 14 15 }
6. nginx錯誤頁面的優雅顯示
範例:當出現403錯誤會跳轉到403.html頁面
error_page 403 /403.html;
7. nginx站點目錄文件及目錄權限優化
8. 部署網站程序權限設置
(1)wordpress站點目錄權限設置
方案1:推薦方案
目錄:755
文件:644
全部者:root
圖片及上傳目錄設置全部者爲www
cd /application/apache/html/ chown -R root.root blog find ./blog/ -type f|xargs chmod 644 find ./blog/ -type d|xargs chmod 755
9. nginx防爬蟲優化
配置
if ($http_user_agent ~* LWP:Simple|BBBike|wget) { return 403 ; rewrite ^(.*) http://blog.etiantian.org/$1 permanent; }
10. 利用nginx限制HTTP的請求方法
配置:
if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 501; }
配置上傳服務器限制HTTP的GET的配置
#Only allow these request methods ## if ($request_method ~*(GET)$ ) { return 501; }
11. 使用CDN作網站內容加速
cdn特色
本地Cache加速 提升了企業站點(尤爲含有大量圖片和靜態頁面站點)的訪問速度,並大大提升以上性質站點的穩定性
鏡像服務 消除了不一樣運營商之間互聯的瓶頸形成的影響,實現了跨運營商的網絡加速,保證不一樣網絡中的用戶都能獲得良好的訪問質量。
遠程加速 遠程訪問用戶根據DNS負載均衡技術智能自動選擇Cache服務器,選擇最快的Cache服務器,加快遠程訪問的速度
帶寬優化 自動生成服務器的遠程Mirror(鏡像)cache服務器,遠程用戶訪問時從cache服務器上讀取數據,減小遠程訪問的帶寬、分擔網絡流量、減輕原站點WEB服務器負載等功能。
集羣抗攻擊 普遍分佈的CDN節點加上節點之間的智能冗餘機制,能夠有效地預防黑客入侵以及下降各類D.D.o.S攻擊對網站的影響,同時保證較好的服務質量 。
12. 使用普通用戶啓動Nginx(監牢模式)
解決方案
給Nginx服務降權,用普通用戶跑Nginx服務,給開發及運維設置普通帳號
開發人員使用普通帳號便可管理nginx服務及站點下的程序和日誌
責任劃分:網絡問題:運維責任,網站打不開開發責任。(共同承擔)
實戰配置:
useradd inca cd /home/inca mkdir conf www log echo inca >www/index.html
修改配置文件
error_log /home/inca/log/error.log pid /home/inca/log/nginx.pid
13. 控制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報錯。
14. 控制客戶端請求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。