企業級Web Nginx 服務優化(3)
企業級Web Nginx 服務優化(3)
1.10設定連線的超時時間:
什麼是超時?
php服務希望短連結,java服務是長連線。
keepalive_timeout 60;
<-設定客戶端連線保持回話的超時時間,超過這個時間,伺服器會關閉該連結。
tcp_nodelay no;
<-開啟tcp_nodelay,在包含了keepalive引數才有效
client_header_timeout 15;
<-設定客戶端請求頭讀取超時時間。如超過這個時間,客戶端還沒有傳送任何資料,Nginx將返回“Request time out (408)”錯誤。
clinet_body_timeout 15;
<-設定客戶端請求
send_timeout 15;
<-指定響應客戶端的超時時間。這個超時僅限於兩個連線活動之間的時間,如果超過這個時間,客戶端沒有任何活動,Nginx將會關閉連線。
官方說明:
1.11上傳檔案大小的限制(動態應用)
主配置檔案加入如下引數,具體引數大小根據你自己的業務做調整。 client_max_body_size10m;
官方說明:
HTTP/1.1 403 Forbidden
Server: nginx
Date: Fri, 05 Jun 2015 12:47:45 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
1.12fastcgi(配合php引擎動態服務)
fastcgi_connect_timeout 300;
<-指定連線到後端FastCGI的超時時間
fastcgi_send_timeout 300;
<-向fastcgi傳送請求的超時時間,這個值是指已經完成兩次握手後向FastCGI傳送請求的超時時間。
fastcgi_read_timeout 300;
<-指定接收Fastcgi應答的超時時間,這個值是指定已經完成兩次握手後接收的fastcgi應答的超時時間。
fastcgi_buffer
<-指定讀取FastCGI應答的第一部分需要用多大的緩衝區,這個值白哦是將使用1個64kb的緩衝區讀取應答的第一部分(應答頭),可以設定為fastcgi_buffers選項指定的緩衝區大小。
fastcg_buffers 4 64k;
<-指定本地需要用多少和多大的緩衝區來緩衝FastCGI的應答請求。如果一個PHP指令碼所產生的頁面大小為256kb,那麼會為其分配4個64kb的緩衝區來快取;如果頁面大小大於256kb,那麼大於256kb的部分會快取到fastcgi_temp指定 的路徑中,但是並不是好的辦法,因為記憶體中的資料處理速度快於硬碟,一般這個值應該為站點中php指令碼所產生的頁面大小的中間值,如果站點大部分指令碼所產生的頁面的大小為256kb那麼可以把這個設定為“16k” “4 64k” 等
1.13配置nginx zip壓縮功能
nginx gzip壓縮模組提供了對檔案內容壓縮的功能,允許nginx伺服器將輸出內容在傳送到客戶端之前根據具體的策略進行壓縮,以節約萬佔貸款,同時提升童虎體驗。
此功能同apache的mod_deflate壓縮功能,以來ngx_http_gzip_nodule模組,預設已安裝,我們已經詳細講解過了壓縮的功能。
所有程式(js,css,html) 不要壓縮的內容(圖片,視訊 ,FLASH)
1,對應壓縮引數的說明如下:
壓縮配置
gzip On
<-開啟gizp壓縮功能
gzip_min_length 1k;
<-設定允許壓縮的頁面最小位元組數,頁面位元組數從header頭的Contet-length中獲取。預設是0,不管頁面多大進行壓縮。建議配置大於1k。如果小於1k可能會月牙越大。
gzip 4 16k;
<-壓縮緩衝區大小。白哦是申請4各單位為16k的記憶體作為壓縮結果流快取,預設值是申請與原生資料大小相同的記憶體空間來儲存gzip壓縮的結果。
gzip_http_version 1.0
<-壓縮版本(預設是1.1,前端為squid2.5使用1.0)用於設定識別HTTP協議版本,預設是1.1,目前大部分的瀏覽器都已經支援GZIP解壓。預設即可
gzip_comp_level 2;
壓縮比率,用來指定GZIP壓縮比,1壓縮比最小,處理速度最快,9壓縮比最大,傳輸速度快,但處理最慢,也比較小號cpu資源
gzip_types text/plain application/x-javascript text/css application/xml;
<-用來指定壓縮的型別,“text/html” 型別總司會被壓縮。
gzip_bary on;
<-vary header 支援。該選項可以讓前端的快取伺服器快取經過GZIP壓縮的頁面,例如使用SQUID快取經過NGINX壓縮資料
2.完整的配置如下:
修改的內容如下:
[[email protected]-01 conf]# nginx -t
nginx: the configuration file /application/nginx1.6.2/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx1.6.2/conf/nginx.conf test is successful
[[email protected]-01 conf]# cat nginx.conf
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
events {
worker_connections 1024;
use epoll;
}
http {
server_tokens off;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 9;
gzip_types text/html text/css text/xml application/javascripti;
gzip_vary on;
gzip的壓縮的情況是根據不同版本可能會不同的,上述的nginx 1.6.2的版本型別的。
檢視可以壓縮的檔案型別在哪裡?都是什麼?
上方加紅的地方寫法是按照這個來進行寫的。
[[email protected]-01 conf]# cat mime.types
types {
text/html html htm shtml;
text/css css;
text/xml xml;
p_w_picpath/gif gif;
p_w_picpath/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
p_w_picpath/png png;
p_w_picpath/tiff tif tiff;
p_w_picpath/vnd.wap.wbmp wbmp;
p_w_picpath/x-icon ico;
p_w_picpath/x-jng jng;
p_w_picpath/x-ms-bmp bmp;
p_w_picpath/svg+xml svg svgz;
p_w_picpath/webp webp;
application/font-woff woff;
application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.wap.wmlc wmlc;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx;
application/vnd.openxmlformats-officedocument.presentationml.presentation pptx;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}
進行重新啟動
[[email protected]-01 conf]# nginx -t
nginx: the configuration file /application/nginx1.6.2/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx1.6.2/conf/nginx.conf test is successful
[[email protected]-01 conf]# nginx
然後瀏覽器進行檢視如下gzip的壓縮以及expires的快取結果:
這裡面是火狐的瀏覽器需要安裝Yslow 的這個擴充套件元件才是可以的。
需要和不需要的壓縮的物件:
大於1K的純文字檔案html,,js ,css xml shtml
圖片,視訊等不要壓縮。因為不但不會減少,在壓縮時小號CPU和MEM資源。
nginx的翻向的一個優化 就是沒必要的載入的模組是什麼?
[[email protected]-01 nginx-1.6.2]# ./configure --help
--without-http_charset_module disable ngx_http_charset_module
--without-http_gzip_module disable ngx_http_gzip_module
--without-http_ssi_module disable ngx_http_ssi_module
--without-http_userid_module disable ngx_http_userid_module
--without-http_access_module disable ngx_http_access_module
--without-http_auth_basic_module disable ngx_http_auth_basic_module
--without-http_autoindex_module disable ngx_http_autoindex_module
--without-http_geo_module disable ngx_http_geo_module
--without-http_map_module disable ngx_http_map_module
--without-http_split_clients_module disable ngx_http_split_clients_module
--without-http_referer_module disable ngx_http_referer_module
--without-http_rewrite_module disable ngx_http_rewrite_module
--without-http_proxy_module disable ngx_http_proxy_module
--without-http_fastcgi_module disable ngx_http_fastcgi_module
--without-http_uwsgi_module disable ngx_http_uwsgi_module
--without-http_scgi_module disable ngx_http_scgi_module
--without-http_memcached_module disable ngx_http_memcached_module
--without-http_limit_conn_module disable ngx_http_limit_conn_module
--without-http_limit_req_module disable ngx_http_limit_req_module
--without-http_empty_gif_module disable ngx_http_empty_gif_module
--without-http_browser_module disable ngx_http_browser_module
--without-http_upstream_ip_hash_module
1.14配置nginx expires 快取功能
在網站開發和運營中,對於圖片,css,js等元素更改機會比較少,特別是圖片,這時可以將圖片設定在瀏覽器本地快取365天或者更長,CSSJS,html等待嗎快取10天,這樣使用者第一次開啟頁面後,你,會在本地的瀏覽器快取相應的上述內容,這樣的快取可以提高下次使用者開啟類似的頁面的載入速度,並節省伺服器端的大量資源的頻寬,此功能同apache的expire是,我們已經詳細講解過了,這裡通過location的,將需要快取的副檔名列出來,然後指定快取的時間。
好處:
1.第一次以後,訪問網站會很快----->體驗就好了
2.節省網站的頻寬。。。。成本變低了。
3.伺服器的壓力降低了。----->成本降低了
壞處:
1.網站如果改版,對應的使用者看到的還是舊的。(js,css,圖片)
解決壞處的:
1.過期時間短一些
2.資原始檔更新的時候,進行改名字就可以了。
圖片和附件一般不會被使用者修改,如果使用者修改了,實際上也都是更改檔名字重新傳了而已。
網站升級對於jss,css元素,一般可以改名。把css,jss,推送到CDN。
企業網站案例日期的案例:
1.51cto 1周
2.sina 15天
3.京東 25年
4.淘寶的 10年
一般不希望被快取的內容:
1)廣告圖片、
2)網站流量統計檔案
3)更新頻繁的檔案
1.根據副檔名進行判斷,新增expires功能範例:
[[email protected] conf]# vim nginx.conf
server {
location ~.*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 3650d;
root html/bbs
}
location ~.*\.(js|css)?$
{
expires 30d;
root html/bbs
}
在server裡面的標籤。
這個時間是跟伺服器的時間對應的
單個檔案新增expires功能範例:
給robots.txt設定過期時間;這裡為robots.txt 為7天並不記錄404錯誤日誌
nginx防止爬蟲的配置的是什麼?
結果如下:
1.2更改原始碼檔案來更改原始碼名稱
更改編譯的原始碼檔案:
vim src/http/ngx_http_header_filter_module.c +49
static char ngx_http_server_string[] = "Server: BWS" CRLF;
static char ngx_http_server_full_string[] = "Server: BWS" CRLF;
static ngx_str_t ngx_http_status_lines[] = {
進行檢視編譯的引數是什麼:
[[email protected]nginx-1.6.2]#nginx-Vnginxversion:nginx/1.6.2builtbygcc4.4.720120313(RedHat4.4.7-11)(GCC)TLSSNIsupportenabledconfigurearguments:--user=nginx--group=nginx--prefix=/application/nginx1.6.2--with-http_stub_status_module--with-http_ssl_module
修改錯誤資訊的返回頁面:
[[email protected]-01 nginx-1.6.2]# vim src/http/ngx_http_special_response.c
static u_char ngx_http_error_tail[] =
"<hr><center>BWS(http://www.baidu.com</center>)" CRLF
"</body>" CRLF
"</html>" CRLF
;
重新編譯安裝:
安裝完成後測試的結果如下:
本機測試:
[[email protected]-01 nginx-1.6.2]# curl -I 127.0.0.1
HTTP/1.1 403 Forbidden
Server: BWS
Date: Fri, 05 Jun 2015 13:55:03 GMT
Content-Type: text/html
Content-Length: 223
Connection: keep-alive
錯誤頁面的顯示:
1.3 Nginx 日誌相關優化與安全
1.3.1編寫指令碼實現Nginx access 日誌輪訓
Nginx沒有類似Apache的cronolog日誌分割處理的功能,但是,可以通過nginx的訊號控制功能或者reload新家在,然後利用指令碼來實現日誌的自動切割。
詳細操作過程如下:
1.配置日誌切割指令碼
[[email protected]-01 scripts]# cat nginxlog.sh
#!/bin/sh
cd /application/nginx/logs &&\
/bin/mv www_access.log www_access_$(date +%F -d -1day).log
/application/nginx/sbin/nginx -s reload
1.3.2 不記錄不需要的訪問日誌
對於健康檢查或某些圖片,jss,css的日誌,一般不需要記錄,因為在同級PV時是按照頁面計算。而且日誌寫入頻繁消耗磁碟IO,降低服務效能。
1.3.3訪問日誌的許可權設定
假如日誌目錄/app/logs,則授權方法、
chown-Rroot.root/app/logs chmod-R700/app/logs
不需要在日誌目錄上給nginx使用者讀或者寫許可,這個問題很多網友都沒在意,直接給了nginx或apache使用者。
最小化apache和nginx目錄及檔案許可權設定
安全的許可權:
為了保證apache的網站不遭受******上傳及修改檔案。
1.所有站點目錄的使用者和組都應該為root,
2.所有目錄許可權755;
3.所有檔案的許可權644;
注意網站的服務使用者不能用root;
以上的許可權設定可以做到防止***上傳***,以及修改站點檔案,但是,合理的使用者上傳的內容也被據之門外了。那麼如何解決可以讓合法的使用者傳檔案又不至於被***利用***吶?
這就是對業務進行分離,在比較好的網站業務架構中,應該把資原始檔,包括使用者上傳的圖片,附件等的服務和程式服務分離,最好把上傳程式服務也分離,這樣就可以從容按照前面安全的標準來進行授權了。
缺一個把資原始檔,包括使用者上傳圖片,包括上傳程式液分離的圖
大多數公司的不是很安全的授權如下:
1)chown -R 777 /sitedir(最不安全的)
2)chown -R apache.apache /sitedir(最不安全的)
如果按照大多數公司授權一般公司的授權,會給網站帶來非常大的安全隱患。
轉載於:https://blog.51cto.com/yanruohan/1897329