深度优化LNMP之Nginx [2]
生活随笔
收集整理的這篇文章主要介紹了
深度优化LNMP之Nginx [2]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
配置Nginx gzip 壓縮實現性能優化
1.Nginx gzip壓縮功能介紹? ?
Nginx gzuo壓縮模塊提供了壓縮文件內容的功能,用戶請求的內容在發送出用客戶端之前,Nginx服務器會根據一些具體的策略實施壓縮,以節約網站出口帶寬,同時加快了數據傳輸效率,提升了用戶訪問體驗。
2.Nginx gzip 壓縮的優點
1.提升網站用戶體驗:由于發給用戶的內容小了,所以用戶訪問單位大小的頁面就快了,用戶體驗提升了,網站口碑就好了。
2.節約網站帶寬成本,由于數據是壓縮傳輸的,因此,此舉節省了網站的帶寬流量成本,不過壓縮會稍微消耗一些CPU資源,這個一般可以忽略。此功能既能讓用戶體驗增強,公司也少花錢。對于幾乎所有的Web服務來說,這是一個非常重要的功能,Apache服務也由此功能。
3.需要和不需要壓縮的對象
1、純文本內容壓縮比很高,因此純文本內容是最好壓縮,例如:html、js、css、xml、shtml等格式的文件
2、被壓縮的純文本文件必須要大于1KB,由于壓縮算法的特殊原因,極小的文件壓縮可能反而變大。
3、圖片、視頻(流媒體)等文件盡量不要壓縮,因為這些文件大多數都是經歷壓縮的,如果再壓縮很坑不會減小或減少很少,或者可能增加。而在壓縮時還會消耗大量的CPU、內存資源
4、參數介紹及配置說明
此壓縮功能很類似早起的Apache服務的mod_defalate壓縮功能,Nginx的gzip壓縮功能依賴于ngx_http_gzip_module模塊,默認已安裝。
參數說明如下:
gzip on; #開啟gzip壓縮功能gzip_min_length 1k;
#設置允許壓縮的頁面最小字節數,頁面字節數從header頭的Content-Length中獲取,默認值是0,表示不管頁面多大都進行壓縮,建議設置成大于1K,如果小于1K可能會越壓越大
gzip_buffers 4 16k;
#壓縮緩沖區大小,表示申請4個單位為16K的內存作為壓縮結果流緩存,默認是申請與原始是數據大小相同的內存空間來存儲gzip壓縮結果;
gzip_http_version 1.1
#壓縮版本(默認1.1 前端為squid2.5時使用1.0)用于設置識別HTTP協議版本,默認是1.1,目前大部分瀏覽器已經支持GZIP壓縮,使用默認即可。
gzip_comp_level 2;
#壓縮比率,用來指定GZIP壓縮比,1壓縮比最小,處理速度最快;9壓縮比最大,傳輸速度快,但處理最慢,也消耗CPU資源
gzip_types??text/css?text/xml?application/javascript;?
#用來指定壓縮的類型,“text/html”類型總是會被壓縮,這個就是HTTP原理部分講的媒體類型。
gzip_vary on;
#vary hear支持,該選項可以讓前端的緩存服務器緩存經過GZIP壓縮的頁面,例如用緩存經過Nginx壓縮的數據。
配置在http標簽端 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;
}
設置完成之后重啟Nginx服務器。 并在360|火狐|谷歌 ?等瀏覽器中安裝插件Firebug和YSlow 進行查看頁面壓縮率 例如:沒有制作壓縮圖片 制作后
配置Nginx expires 緩存實現性能優化
1.Nginx expires 功能介紹 簡單地說,Nginx expires的功能就是為用戶訪問的網站內容設定一個國企時間,當用戶第一次訪問到這些內容時,會把這樣內容存儲在用戶瀏覽器本地,這樣用戶第二次及此后繼續訪問網站,瀏覽器會檢查加載緩存在用戶瀏覽器本地的內容,就不會去服務器下載了。直到緩存的內容過期或被清除為止。 深入理解,expires的功能就是允許通過Nginx 配置文件控制HTTP的“Expires”和“Cache-Contorl”響應頭部內容,告訴客戶端劉琦是否緩存和緩存多久以內訪問的內容。這個expires模塊控制Nginx 服務器應答時Expires頭內容和Cache-Control頭的max-age指定。 這些HTTP頭向客戶端表名了內容的有效性和持久性。如果客戶端本地有內容緩存,則內容就可以從緩存(除非已經過期)而不是從服務器讀取,然后客戶端會檢查緩存中的副本。 2.Nginx expires作用介紹 在網站的開發和運營中,對于圖片、視頻、css、js等網站元素的更改機會較少,特別是圖片,這時可以將圖片設置在客戶端瀏覽器本地緩存365天或3650天,而降css、js、html等代碼緩存10~30天,這樣用戶第一次打開頁面后,會在本地的瀏覽器按照過期日期緩存響應的內容,下次用戶再打開類似頁面,重復的元素就無需下載了,從而加快了用戶訪問速度,由于用戶的訪問請求和數據減少了,因此節省了服務器端大量的帶寬。此功能和apache的expire相似。 3.Nginx expires 功能優點 1.Expires可以降低網站的帶寬,節約成本。 2.加快用戶訪問網站的速度,提升了用戶訪問體驗。 3.服務器訪問量降低了,服務器壓力就減輕了,服務器成本也會降低,甚至可以解決人力成本。 對于幾乎所有Web來說,這是非常重要的功能之一,Apache服務也由此功能。 4. Nginx expires 配置詳解 1)根據文件擴展名進行判斷,添加expires功能范例。 ? ? location ~.*\.(gif|jpg|jpeg|png|bmp|swf)$? ? ? ?{
? ? ? ? ? expires 3650d;
? ? ? }
該范例的意思是當前用戶訪問網站URL結尾的文件擴展名為上述指定的各種類型的圖片時,設置緩存3650天,即10年。 提示:配置可以放在server標簽,也可以放在http標簽下配置 例如: [root@web02 /]# curl -I www.jd.com
HTTP/1.1 200 OK
Server: jdws
Date: Mon, 25 Jul 2016 15:15:47 GMT
Content-Type: text/html; charset=gbk
Content-Length: 197220
Connection: keep-alive
Vary: Accept-Encoding
Expires: Mon, 25 Jul 2016 15:15:38 GMT #告訴用戶什么時候過期
Cache-Control: max-age=20
ser: 6.158
Via: BJ-M-YZ-NX-74(HIT), http/1.1 BJ-UNI-1-JCS-117 ( [cRs f ])
Age: 16
2)根據URI中的路徑(目錄)進行判斷,添加expires功能范例。 location ~^/(images|javascript|js|css|flash|media|static)/ {
? expires 360d;
}
意思是當用戶訪問URI中包含上述路徑(例:images、js、css,這些在服務端是程序目錄)時,把訪問的內容設置緩存360天,即1年。如果要想緩存30天,設置30d即可。 HTTP/1.1 200 OK
Server: JDWS
Date: Mon, 25 Jul 2016 16:00:32 GMT
Content-Type: text/html; charset=gbk
Vary: Accept-Encoding
Expires: Mon, 25 Jul 2016 16:00:48 GMT ? ?#<==緩存的過期時間
Cache-Control: max-age=20 ? ? ?? ??? ??? ??? ? #<==緩存的總時間按秒,單位
ser: 130.29
Via: BJ-Y-NX-104(HIT), http/1.1 HK-1-JCS-70 ( [cRs f ])
Age: 14
Content-Length: 197220
5.Nginx expires功能缺點及解決方法 當網站被緩存的頁面或數據更新了,此時用戶看到的可能還是舊的已經緩存的內容,這樣會影響用戶體驗。 對經常需要變動的圖片等文件,可以縮短對象緩存時間,例如:谷歌和百度的首頁圖片經常根據不同的日期換成一些節日的圖,所以這里可以將圖片設置為緩存期為1天。 當網站改版或更新內容時,可以在服務器將緩存的對象改名(網站代碼程序)。 1. 對于網站的圖片、軟件,一般不會被用戶直接修改,用戶層面上的修改圖片,實際上是重新傳到服務器,雖然內容一樣但是是一個新的圖片名了 2.網站改版升級會修改JS、CSS元素,若改版的時候對這些元素該了名,會使得前端的CDN以及用戶需要重新緩存內容。 6.企業網站緩存日期曾經的案例參考 若企業的業務和訪問量不同,那么網站的緩存期時間設置也是不同的,比如: a、51CTP:1周 b、sina:15天 c、京東:25年 d、淘寶:10年 7.企業網站有可能不希望被緩存的內容 1.廣告圖片,用于廣告服務,都緩存了就不好控制展示了。 2.網站流量統計工具(js代碼)都緩存了流量統計就不準了 3.更新很頻繁的文件(google的logo),如果按天,緩存效果還是顯著的。
Nginx日志相關優化與安裝
1.編寫腳本腳本實現Nginx access日志輪詢 Nginx目前沒有類似Apache的通過cronlog或者rotatelog對日志分割處理的能力,但是,運維人員可以通過利用腳本開發、Nginx的信號控制功能或reload重新加載,來實現日志自動切割,輪詢。 (1)配置日志切割腳本 [root@web02 /]# mkdir /server/scripts/ -p[root@web02 /]# cd /server/scripts/
[root@web02 scripts]# cat cut_nginx_log.sh
cd /application/nginx/logs && \
/bin/mv www_access.log www_access_$(data +%F -d -1dy).log ?#將日志按日志改成前一天的名稱
/application/nginx/sbin/nginx -s reload ? ??? ? #重新加載nginx使得重新生成訪問日志文件
提示:實際上腳本的功能很簡單,就是改名日志,然后加載nginx,重新生成文件記錄日志。 (2)將這段腳本保存后加入到定時任務,設置每天凌晨0點進行切割日志 [root@web02 scripts]# crontab -e
###cut nginx access log
00 00 * * * /bin/sh /server/scripts/cut_nginx.log.sh >/dev/null 2>&1
解釋:每天0點執行cut_nginx_log.sh腳本,將腳本的輸出重定向到空。 2.不記錄不需要的訪問日志 對于負載均衡器健康檢查節點或某些特定文件(比如圖片、js、css)的日志,一般不需要記錄下來,因為在統計PV時是按照頁面計算的。而且日志寫入頻繁會大量消耗磁盤I/O,降低服務的性能。 具體配置如下: ? ? ?location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)?$ {
? ??? ? access_log off;?
}
這里用location標簽匹配不記錄日志的元素擴展名,然后關掉了日志。 3.訪問日志的權限設置 加入日志目錄為/app/logs,則授權方法為: chown -R root.root /app/logs/
chmod -R 700 /app/logs
不需要在日志目錄上給nginx用戶讀或寫的許可。
Nginx站點目錄及文件URL訪問控制
1.根據擴展名限制程序和文件訪問 Web2.0時代,絕大多數網站都是以用戶為中心,例如:BBS、blog、sns產品,這幾個產品共同特點就是不但允許用戶發布內容到服務器,還允許用戶發圖片甚至附件到服務器,由于為用戶打開了上傳的功能,因為給服務器帶來了很大的安全風險。 下面將利用Nginx配置禁止訪問上傳資源目錄下的PHP、shell、perl、Python程序文件,這樣用戶即使上傳了木馬文件也沒法去執行,從而加強了網站的安全。 配置Nginx,限制禁止解析指定目錄下的制定程序。 ?location?~?^/images/.*\.(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下配置禁止訪問*.txt文件 location ~*\.(txt|doc)${
? ? if (-f $request_filename) {
? ? root /data/www/www;
? ? #rewrite ....可以重定向某個URL
? ? break;
? }
}
location ~*\.(txt|doc)${
? ? root /data/www/www;
? ? deny all;
}
對上述限制需要卸載php 匹配的前面 ?對目錄訪問進行設置 單目錄 ?location?~?^/(static)/?{
????????deny?all;
}
location?~?^/static?{
????????deny?all;
} 多目錄 ?location?~?^/(static)/?{
????????deny?all;
}
范例:禁止訪問目錄并返回指定的http狀態碼 location /admin/ { return 404; }
總結
以上是生活随笔為你收集整理的深度优化LNMP之Nginx [2]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cgroup 研究报告
- 下一篇: Linux Container 研究报告