Nginx Web服務優(yōu)化

《老男孩Linux運維》筆記




隱藏Nginx軟件版本號

一般來說咬像,軟件的漏洞都和版本有關。因此要盡量隱藏對訪問用戶顯示各類敏感信息泉哈,這樣惡意的用戶就很難猜到他攻擊的服務器所用的是否有特定漏洞的軟件厦取,從而加強Web服務安全桥帆。

編輯nginx.conf配置文件,增加參數(shù):

http {

? ? server_tokens off | on蜀漆;

}

server_tokens默認是開啟的谅河,且可放置于 http,server确丢,location绷耍。



更改Nginx服務的默認用戶

1,直接修改配置文件nginx.conf:

user nginx蠕嫁;

2锨天,直接在編譯Nginx軟件時指定編譯的用戶和組:

./configure --user=nginx --group-nginx



優(yōu)化Nginx進程對應的配置

修改nginx.conf配置文件:

worker_process 4;

#建議設置為CPU核數(shù)剃毒,高并發(fā)場合可以考慮設置成 核數(shù)*2

nginx

上述參數(shù)調整的是Nginx服務的worker進程數(shù)病袄,Nginx有Master進程和worker進程。Master為管理進程赘阀,真正處理用戶的是worker進程益缠。

cat /proc/cpuinfo | grep processor | wc -l ? ?#查看CPU總核數(shù);

cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l ? ?#查看CPU個數(shù)基公;

也可使用 top 命令幅慌,按 1 即可顯示所有CPU核數(shù);

top



優(yōu)化綁定不同的Nginx進程到不同的CPU上

默認情況下轰豆,Nginx的多個進程有可能跑在某一個CPU或CPU的某一核上胰伍,導致Nginx進程使用硬件的資源不均齿诞。所以,盡可能地分配不同的Nginx進程給不同的CPU處理骂租,達到充分有效利用硬件的多CPU多核資源的目的祷杈。

四核CPU配置參考:

vi /etc/nginx/nginx.conf

worker_processes 4;

worker_cpu_affinity 0001 0010 0100 1000渗饮; ? ?#CPU親和力參數(shù)



Nginx事件處理模型優(yōu)化

Nginx的連接處理機制在不同的操作系統(tǒng)會采用不同的I/O模型但汞,在Linux下,Nginx使用epoll的I/O多路復用模型互站,在FreeBSD中使用kqueue的I/O多路復用模型私蕾,在solaris中使用/dev/poll方式的I/O多路復用模型,在Windows中使用的是icop胡桃。

具體配置:

events {

? ? use epoll踩叭; ? ?#use是一個時間模塊指令,用來指定Nginx的工作模式标捺,對于Linux內核懊纳,推薦使用epoll工作模式

}

#對于使用連接進程的方法,通常不需要進行任何設置亡容,Nginx會自動選擇最有效的方法嗤疯。



調整Nginx單個進程允許的客戶端最大連接數(shù)

這個控制連接的參數(shù)為worker_connections,它的值要根據(jù)服務器性能和程序的內存使用量來制定闺兢。

events {

? ? worker_connections 1024茂缚; ? ?#定義每個進程(process)的最大連接數(shù),這個連接包括了所有連接屋谭,如代理服務器連接脚囊、客戶端的連接、實際的并發(fā)連接

}

#Nginx總并發(fā)連接 == worker * worker_connections



配置Nginx Worker進程最大打開文件數(shù)

events {

worker_rlimit_nofile ?65535桐磁; ? ?#最大打開文件數(shù)悔耘,可設置為系統(tǒng)優(yōu)化后的ulimit -HSn的結果

}



開啟高效文件傳輸模式

設置參數(shù):sendfile

sendfile()是作用與兩個文件描述符之間的數(shù)據(jù)拷貝,這個拷貝實在內核之中的我擂,被稱為零拷貝衬以。sendfile()比read和write函數(shù)要高效很多,因為write和read函數(shù)要把數(shù)據(jù)拷貝到應用層再進行操作校摩。

sendfile ?on|off

context: http看峻,server,location衙吩,if in location

設置參數(shù):tcp_nopush

激活或禁用Linux上的TCP_CORK socket選項互妓,僅當開啟sendfile生效。允許把 http response和文件的開始部分放在一個文件里發(fā)布,其積極作用是減少網(wǎng)絡報文段的數(shù)量冯勉。

tcp_nopush on澈蚌;

context: http,server珠闰,location



優(yōu)化Nginx連接參數(shù)惜浅,調整連接超時時間

連接超時參數(shù):Keepalive_timeout?

keep-alive可以使客戶端到服務器端已經(jīng)建立的連接一致工作不退出瘫辩,當服務器有持續(xù)請求時伏嗜,keep-alive會使用已經(jīng)建立的連接提供服務,從而避免服務器充縣建立新連接請求處理伐厌。

keepalive_timeout 60承绸;

context:http,server挣轨,location

#用于設置客戶端連接保持會話的超時時間為60秒军熏。超過這個時間,服務器會關閉該鏈接卷扮。

連接超時的作用:

將無用的連接設置為盡快超時荡澎,可保護系統(tǒng)資源(CPU、內存晤锹、磁盤)摩幔;

連接很多時,及時斷掉那些已經(jīng)建立好但又長時間不做事的連接鞭铆,以減少其占用的服務器資源或衡。因為服務器維護連接也是消耗資源的;

黑客和惡意用戶攻擊網(wǎng)站车遂,也會不斷地和服務器建立多個連接封断,消耗連接數(shù)但啥也不干,大量消耗服務器的資源舶担,此時就應該及時斷掉這些惡意占用資源的連接坡疼;

LNMP環(huán)境中,如果用戶請求了動態(tài)服務衣陶,則Nginx就會建立連接柄瑰,請求FastCGI服務以及后端的MySQL服務,此時這個Nginx連接就要設置一個超時時間祖搓,在用戶容忍的時間內返回數(shù)據(jù)狱意,或者再多等一會后端服務返回數(shù)據(jù),具體策略根據(jù)具體業(yè)務進行具體分析拯欧;

后端的FastCGI服務及MySQL服務也有對連接的超時控制详囤。

設置參數(shù):tcp_nodelay

默認情況下當數(shù)據(jù)發(fā)送時,內核并不會馬上發(fā)送,可能會等待更多的字節(jié)組成一個數(shù)據(jù)包藏姐,這樣可以提高I/O性能隆箩。但是,在每次只發(fā)送很少字節(jié)的業(yè)務場景中羔杨,使用tcp_nodelay功能捌臊,等待時間會比較長。

tcp_nodelay on兜材;

context:http理澎,server,location

設置參數(shù):client_header_timeout

讀取客戶端請求頭數(shù)據(jù)的超時時間曙寡,如果超過這個時間糠爬,客戶端還沒有發(fā)送完整的header數(shù)據(jù),服務器端將返回“Request time out(408)”錯誤举庶。

client_header_timeout 20执隧;

context:http,server

設置參數(shù):client_body_timeout

讀取客戶端請求主體的超時時間户侥,如果在這個超時時間內镀琉,客戶端沒有發(fā)送任何數(shù)據(jù),Nginx將返回“Request time out(408)”錯誤蕊唐。

client_body_timeout 60屋摔;

context:http,server刃泌,location

設置參數(shù):send_timeout

指定響應客戶端的超時時間凡壤,為握手后的一個超時。如果超過這個時間耙替,客戶端沒有任何活動亚侠,Nginx將會關閉連接。

send_timeout 60俗扇;

context:http硝烂,server,location



上傳文件大小的限制(動態(tài)應用)

參數(shù):client_max_body_size

設置為 0 表示禁止檢查客戶端請求主體大小

client_max_body_size 8m铜幽;

context:http滞谢,server,location



FastCGI相關參數(shù)調優(yōu)(配合PHP引擎動態(tài)服務)

FastCGI參數(shù)是配合Nginx向后請求PHP動態(tài)引擎服務的相關參數(shù)除抛,這里指的是Nginx中的配置參數(shù)狮杨。

Nginx FastCGI常見參數(shù):

請參考Module ngx_http_fastcgi_module(https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html)

fastcgi_pass ? ?#給FastCGI服務器設置地址;

fastcgi_index ? ?#設置一個將在 $fastcgi_scripts_name 變量結尾的URI之后添加的文件名到忽;

fastcgi_param ? ?#設置一個應該傳遞給FastCGI服務器的參數(shù)橄教,當且僅當fastcgi_param在當前級別上沒有定義指令時清寇,這些指令將從上一級繼承;

fastcgi_next_upsteam ? ?#指定在哪種情況下將請求傳遞給下一個服務器护蝶;

fastcgi_connect_timeout ? ?#表示Nginx服務器和后端FastCGI服務器連接的超時時間华烟,默認值為60秒,這個參數(shù)通常不要超過75秒持灰;

fastcgi_send_timeout ? ?#設置Nginx允許FastCGI服務器端返回數(shù)據(jù)的超時時間盔夜,即在規(guī)定時間之內后端服務器必須傳完所有的數(shù)據(jù)。否則堤魁,Nginx將斷開這個連接喂链;

fastcgi_read_timeout ? ?#設置Nginx從FastCGI服務器端讀取響應信息的超時時間,表示連接建立成功后姨涡,Nginx等待后端服務器的響應時間衩藤,是Nginx已經(jīng)進入后端的排隊之中等候處理的時間;

fastcgi_buffer_size ? ?#這是Nginx FastCGI的緩沖區(qū)大小參數(shù)涛漂,設定用來讀取從FastCGI服務器端收到的第一部分響應信息的緩沖區(qū)大小,這里的第一部分通常會包含一個小的響應頭部检诗;

fastcgi_buffers ? ?#設定用來讀取從FastCGI服務器端收到的響應信息的緩沖區(qū)大小和緩沖區(qū)數(shù)量匈仗;

proxy_busy_buffers_size ? ?#用于設置系統(tǒng)很忙時可以使用的proxy_buffers大小,官方推薦大小為proxy_buffers * 2逢慌;

fastcgi_busy_buffers_size ? ?#用于設置系統(tǒng)很忙時可以使用的fastcgi_buffers大小悠轩,官方推薦為 fastcgi_buffers * 2;

fastcgi_temp_file_write_size ? ?#FastCGI臨時文件大泄テ谩火架;

fastcgi_cache cachename_nginx ? ?#表示開啟FastCGI緩存并為其指定一個名稱;

fastcgi_cache_path ? ?#fastcgi_cache緩存目錄忙菠;

fastcgi_cache_valid ? ?#用來指定應答代碼的緩存時間何鸡;

fastcgi_cache_min_uses ? ?#設置請求幾次之后響應將被緩存;

fastcgi_cache_use_stale ? ?#定義在哪些情況下使用過期緩存牛欢;

fastcgi_cache_key ? ?#定義fastcgi_cache的key骡男;

依據(jù)HTTP原理及FastCGI原理解釋FastCGI參數(shù)優(yōu)化



配置Nginx gzip壓縮實現(xiàn)性能優(yōu)化

Nginx gzip壓縮模塊提供了壓縮文件內容的功能,用戶請求的內容在發(fā)送到用戶客戶端之前傍睹,Nginx服務器會根據(jù)一些具體的策略實施壓縮隔盛,以節(jié)約網(wǎng)絡出口帶寬,同時加快數(shù)據(jù)傳輸效率拾稳,提升用戶體驗吮炕。

Nginx gzip壓縮的優(yōu)點:

提升網(wǎng)站用戶體驗;

節(jié)約網(wǎng)站帶寬成本访得;

壓縮對象:

純文本內容壓縮比很高龙亲,如 html, js, css, xml等;

本壓縮的純文本文件必須要大于1KB,由于壓縮算法的特殊原因俱笛,極小的文件壓縮后可能反而變大捆姜;

圖片、媒體等文件盡量不要壓縮迎膜,因為這些文件大都經(jīng)過壓縮泥技,再壓縮很可能不會減小很多,或有可能增大磕仅,同時還要消耗系統(tǒng)資源珊豹;

參數(shù)介紹及配置:

gzip on;#壓縮功能

gzip_min_length ?1K榕订;#允許壓縮的頁面最小字節(jié)數(shù)

gzip_buffers ?4 16K店茶;#申請4個單位為16K的內存作為壓縮結果流緩存

gzip_http_version ?1.1;#http協(xié)議版本

gzip_comp_level ?5劫恒;#指定壓縮比贩幻,1壓縮比最小,處理速度最快两嘴;9壓縮比最大丛楚,傳輸速度最快,處理最慢

gzip_types ?text/html text/css憔辫;#指定壓縮類型趣些,對應文件類型參考mime.types

gzip_vary on;#vary header支持

gzip效果查看:

Content-Encoding: gzip



Nginx expires緩存

expires 期限贰您,Nginx expires的功能就是為用戶訪問的網(wǎng)站內容設定一個過期時間坏平。

當用戶第一次訪問這些內容時,會把這些內容儲存在用戶瀏覽器本地锦亦,這樣用戶第二次及以后繼續(xù)訪問該網(wǎng)站時舶替,瀏覽器會檢查加載已經(jīng)緩存在用戶瀏覽器本地的內容,而不用去服務器下載孽亲,直到緩存的內容過期或被清除為止坎穿。

Nginx expires功能優(yōu)點:

expires 可以降低網(wǎng)站的帶寬,節(jié)約成本返劲;

加快用戶訪問網(wǎng)站的速度玲昧,提升用戶訪問體驗;

服務器請求降低篮绿,服務器壓力就減輕了孵延,成本也會降低;


Nginx expires配置

1亲配,根據(jù)文件擴展名進行判斷:

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

{

? ? expires ?2y尘应;#當用戶訪問上述擴展名文件時惶凝,緩存相應的時間

}

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

{

expires 10d;

}


2犬钢,根據(jù)URI中的路徑(目錄)進行判斷:

location ~ ^/(images|static|media)/ {

? ? expires 50d苍鲜;

}


Nginx expires效果檢查:

Expires: 緩存過期時間

Cache-Control:緩存總時間


Nginx expires功能缺點及解決方法:

當網(wǎng)站數(shù)據(jù)更新了,此時用戶端看到的可能還是舊的已經(jīng)緩存的內容玷犹。

對于經(jīng)常需要變動的文件混滔,可縮短對象緩存時間;如百度首頁圖片根據(jù)一些節(jié)日換成節(jié)日相對應的圖片歹颓,所以設置這些圖片緩存期為一天坯屿;

當網(wǎng)站改版或更新時,可以在服務器將緩存的對象改名巍扛;


網(wǎng)站可能不希望被緩存的內容:

廣告圖片领跛,用于廣告服務,都緩存了就不好控制展示了撤奸;
網(wǎng)站流量統(tǒng)計工具(js代碼)吠昭,緩存了統(tǒng)計就不準了;




Nginx日志相關優(yōu)化與安全

現(xiàn)在Nginx 日志已經(jīng)自動輪詢了寂呛。

編寫腳本實現(xiàn)Nginx access日志輪詢

配置日志切割腳本:

vim cut_nginx_log.sh

cd /path/log/nginx && mv access.log access_$(date +%F -d -1days).log

tar -czf access_xx.gz access.xx.log

nginx -s reload

crontab -e

00 00 * * * /bin/sh /path/cut_nginx_log.sh


不記錄不需要的訪問日志

日志寫入太頻繁會消耗大量磁盤I/O怎诫,降低服務性能。

location ~ .*\.(js|jpg|css|png|gif)$ {

access_log off贷痪;

}


訪問日志權限

不需要在日志目錄上給Nginx用戶讀或寫許可,很多人沒注意這個問題蹦误,把權限直接給了Nginx用戶劫拢,這就成了安全隱患。

chown -R root:root ?/path/log/nginx

chmod -R 700 /path/log/nginx

我以前一直也是認為應該 nginx:nginx ?/path/log/nginx强胰,但今天看到這舱沧,去測試了上述方法,可以寫入日志偶洋。查看nginx運行熟吏,原來nginx master process的UID是root,難怪難怪玄窝!

root? ? ? 68300? ? ? 1? 0 16:15 ? ? ? ?00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf



Nginx站點目錄及文件URL訪問控制

根據(jù)擴展名限制程序或文件訪問

利用Nginx配置禁止訪問上傳資源目錄下的PHP牵寺、Shell孵淘、Perl枉侧、Python程序文件,這樣用戶即使上傳了木馬文件也沒法執(zhí)行绣夺,從而加強了網(wǎng)站的安全俩块。

范例1黎休,配置Nginx浓领,禁止解析指定目錄下的指定程序:

location ~ ^/images/.*\.(php|py|sh|pl)$?

{

? deny all;

}

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

{

? deny all势腮;

}


對上述目錄的限制必須放在Nginx處理PHP服務配置的前面:

#location ~ \.php$ {

#? ? root? ? ? ? ? html;

#? ? fastcgi_pass? 127.0.0.1:9000;

#? ? fastcgi_index? index.php;

#? ? fastcgi_param? SCRIPT_FILENAME? /scripts$fastcgi_script_name;

#? ? include? ? ? ? fastcgi_params;

#}


范例2联贩,Nginx下配置禁止訪問 *.txt 和 *.doc文件:

location ~* \.(txt|doc)$

{

? ?if (-f ?$request_filename) {

? ? ? root /var/www;

? ? ? #rewrite... ?也可以重定向到某個URL

? ? ? break捎拯;

? ? }

}

location ~* \.(txt|doc)$

? root /var/www泪幌;

? deny all;

}



禁止訪問指定目錄下的所有文件和目錄

范例1玄渗,配置禁止訪問指定的單個或多個目錄:

location ~ ?^/(static)/ {

deny all座菠;

}

location ~ ^/static ?{

deny all;

}


禁止訪問多個目錄:

location ~ ^/(static | js ) {

? ?deny all藤树;

}


范例2浴滴,禁止訪問目錄并返回指定HTTP狀態(tài)碼:

location ?/admin/ {

return 404;

}

location /templates/ {

return 403岁钓;

}



限制網(wǎng)站來源IP訪問

范例1升略,禁止某目錄讓外界訪問,但允許某IP訪問該目錄屡限,并支持PHP解析:

location ~ ^/secret/ {

allow 222.222.222.222品嚣;

deny all;

}

location ~ .*\.php$ {

?fastcgi_pass? 127.0.0.1:9000;

fastcgi_index? index.php;

fastcgi_param? SCRIPT_FILENAME? /scripts$fastcgi_script_name;

include? ? ? ? fastcgi_params;

}


范例2钧大,限制指定IP或IP段訪問:

location / {

deny 192.168.10.10翰撑;

allow 192.168.1.0/24;

allow 10.1.1.0/16啊央;

deny all;

}


Nginx做反向代理的時候可以限制客戶端IP

1眶诈,使用 if 來控制:

if ($remote_addr = 10.0.0.7) {

return 403;

}

if ( $remote_addr = 11.11.11.11 ) {

set $allow_access_root 'true';

}


2瓜饥,利用deny和allow只允許IP訪問:

location / {

root /var/www逝撬;

index index.php index.html;

allow 22.22.22.22;

deny all乓土;

}


方法3宪潮,只拒絕某些IP訪問:

location ?/ {

root /var/www;

index index.html;

deny 11.11.11.11;

allow all;

}


注意:

1,deny一定要加一個IP趣苏,否則會直接跳轉403狡相,不在往下執(zhí)行,如果403默認頁實在同一域名下拦键,會造成死循環(huán)訪問谣光;

2,對于allow的IP段芬为,從允許訪問的段位從小到大排列萄金,如 127.0.0.0/24后面才是10.10.0.0/16蟀悦;

3,以deny all結尾氧敢,表示除了上面允許的日戈,其他都禁止;



配置Nginx孙乖,禁止非法域名解析訪問網(wǎng)站

Nginx如何防止用戶IP訪問網(wǎng)站浙炼,或惡意域名解析?

方法1唯袄,讓使用IP訪問網(wǎng)站的用戶弯屈,或惡意解析域名的用戶,收到501錯誤:

server {

listen 80 default_server恋拷;

server_name _资厉;

return 501;

}

#配置文件里面沒有寫的虛擬主機都調到 default_server蔬顾。


或重定向:

server {

listen 80 default_server宴偿;

server_name _;

rewrite ^(.*) ?http://www.baidu.com permanent诀豁;

}


發(fā)現(xiàn)域名惡意解析到服務器IP窄刘,在server標簽下添加以下代碼即可:

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

rewrite ^(.*) http://www.baidu.com permanet;

}


default_server舉例:

利用default_server,將網(wǎng)站所有請求定向到維護頁面舷胜。

server {

? ? listen 80 default_server;

? ? server_name _;

? ? root /var/www;


? ? location / {

? ? ? ? rewrite ^(.*) /errot.html break;

? ? }


vim /var/www/errot.html

<html>

<style type="type/css">

h1{

? ? text-align: center;

? ? color: red;

}

</style>

<h1>網(wǎng)站維護中娩践!</h1>

</html>




Nginx圖片及目錄防盜鏈解決方案

什么是資源盜鏈

簡單地說,就是某些不法網(wǎng)站未經(jīng)許可烹骨,通過在其自身網(wǎng)站程序里非法調用其他網(wǎng)站的資源欺矫,然后在自己的網(wǎng)站上顯示這些調用的資源,達到填充自身網(wǎng)站的效果展氓。

這一舉動不僅浪費了調用資源網(wǎng)站的網(wǎng)絡流量,還造成其他網(wǎng)站的帶寬及服務壓力吃緊脸爱。


網(wǎng)站資源被盜鏈遇汞,出現(xiàn)嚴重問題

某公司CDN源站流量沒有變化,但CDN加速那邊流量超了很多簿废。這么大異常流量空入,全都是錢呀!

如何處理族檬?

1歪赢,對IDC及CDN帶寬做監(jiān)控報警;

2单料,經(jīng)常查看網(wǎng)站流量埋凯,關注流量變化点楼,關注異常流量;

3白对,對訪問日志作分析掠廓,迅速定位異常流量



常見防盜鏈解決方案的基本原理

根據(jù)HTTP referer 實現(xiàn)防盜鏈

在HTTP 協(xié)議中,有一個表頭字段叫 referer甩恼,使用URL格式來表示是哪里的鏈接用了當前網(wǎng)頁的資源蟀瞧。

通過referer 可以檢測訪問的來源網(wǎng)頁,如果是資源文件条摸,可以跟蹤到顯示它的網(wǎng)頁地址悦污,一旦檢測出來不是本站,馬上進行阻止钉蒲。

HTTP referer 是header的一部分切端,當瀏覽器向web服務器發(fā)送請求時,一般會帶上 referer子巾,高速服務器我是從哪個頁面過來的帆赢,服務器借此獲得一些信息用于處理。

根據(jù)cookie防盜鏈

通過加密技術變換訪問路徑實現(xiàn)盜鏈



Nginx Web服務實現(xiàn)防盜鏈

利用 referer线梗,針對指定擴展名進行 rewrite或其他操作

location ~* ?\. (.jpg|gif|png|wma|wmv|mp3|zip|rar) {

valid_referers none blocked *.zhang21.com zhang21.com椰于;

if ($invalid_referer) {

? ? rewrite xxxx;

? }

}

要根據(jù)實際情況進行域名防盜鏈設置仪搔!


利用referer瘾婿,針對站點目錄過濾并返回錯誤碼

location /images {

? root ?/var/www;

? valid_referers none blocked *.zhang21.com zhang21.com烤咧;

? if ($invalid_referer) {

? ? return 403偏陪;

? }

}


NginxHttpAccessKeyModule實現(xiàn)防盜鏈介紹

如果download目錄下有一個file.rar文件,那對應的URI就是http://www.abc.com/download/file.rar煮嫌,而使用了ngx_http_accesskey_module模塊后就變成了http://www.abc.com/download/file.rar?key=xxxxxxxxxxx笛谦。只有正確地給定了key的值,才能下載download目錄下的file.rar文件昌阿,而且key的值與用戶的IP相關饥脑,這樣可以避免被盜連。


在產(chǎn)品設計上解決盜鏈方案

可以為圖片等增加水印懦冰。

通過查看Nginx日志格式中的 $http_referer 變量灶轰,查看被盜鏈情況。在對應的日志文件中查看該變量的值刷钢,可以知曉 http_referer的信息笋颤。




Nginx錯誤頁面的優(yōu)雅顯示

常見HTTP狀態(tài)碼此處略過!


為什么要配置錯誤頁面優(yōu)雅顯示内地?

我們可以將404伴澄、403等錯誤信息重定向到網(wǎng)站首頁或其他指定的頁面赋除,提升網(wǎng)站的用戶訪問體驗!

自定義的錯誤碼優(yōu)雅頁面:

location / {

xxxxxxx秉版;

error_page 403 /403.html贤重; ? ?#當出現(xiàn)403錯誤時跳轉到優(yōu)化后的頁面

error_page 500 503 504 /50x.html;

location = /50x.html {

? ? root /xxx/xxx/50x.html清焕; ? ?#將50x頁面放到本地單獨目錄下進行顯示

? ? }

error_page 404 =200 /404200.jpg并蝗; ? ?#改變狀態(tài)碼并指定顯示內容

error_page 502 http://www.baidu.com; ? ?#錯誤碼重定向秸妥;

}


將錯誤狀態(tài)碼重定向到一個location:

location / {

? error_page 404 = @zhang滚停;

}

location @zhang {

proxy_pass http://www.baidu.com;

}




Nginx站點目錄文件及目錄權限優(yōu)化

單機LNMP環(huán)境目錄權限嚴格控制措施

為了保證網(wǎng)站不受木馬入侵粥惧,所有站點的目錄的用戶和組都為root键畴,所有的目錄權限是是755,所有文件權限是644突雪。

雖然這樣的權限可以防止黑客上傳修改站點文件起惕,但這樣合法用戶便也沒有了上傳權限。

比較好的解決方法是將用戶上傳的文件等服務分離咏删,這樣就可以進行安全授權了惹想。不同的服務所在目錄的權限依據(jù)業(yè)務功能而不同!

嚴格控制Nginx目錄的訪問才能降低網(wǎng)站被入侵的風險督函!


Nginx反爬蟲優(yōu)化

robots.txt機器人協(xié)議介紹

Robots協(xié)議(也稱為爬蟲協(xié)議嘀粱、機器人協(xié)議),全稱是“網(wǎng)絡爬蟲排除標準”(Robots Exclusion Protocol)辰狡,網(wǎng)站通過Robots協(xié)議告訴搜索引擎那些頁面可以抓取锋叨,那些頁面不能抓取。

robots.txt(統(tǒng)一小寫)是一種存放于網(wǎng)站根目錄下的ASCII編碼的文本文件宛篇,它通常告訴網(wǎng)絡搜索引擎的漫游器(又稱網(wǎng)絡蜘蛛)娃磺,此網(wǎng)站中的哪些內容是不應被搜索引擎的漫游器獲取的,哪些是可以被漫游器獲取的叫倍。

robots.txt協(xié)議并不是一個規(guī)范豌鸡,而只是約定俗成的,所以并不能保證網(wǎng)站的隱私段标。

robots.txt語法

User-Agent:*

Allow:

Disallow:

來看一下簡書的robots.txt:

www.reibang.com/robots.txt


Nginx反爬蟲優(yōu)化配置

阻止下載協(xié)議代理:

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

return 403;

}


測試禁止不同的瀏覽器軟件訪問:

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

rewrite ^(.*) http://www.baidu.com;#如果瀏覽器為Firefox或IE炉奴,則跳轉

}



利用Nginx限制HTTP的請求方法

可以通過Nginx限制HTTP請求的方法來達到提升服務器安全的目的逼庞。

如,讓HTTP只能使用GET瞻赶、HEAD和POST方法的配置:

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

return 501派任;

}

還可以加一層 location,更具體地限制文件名璧南。



使用CDN做網(wǎng)站內容加速

什么是CDN掌逛?

CDN的全稱是 Content Delivery Network,中文意思是內容分發(fā)網(wǎng)絡司倚。

簡單地講豆混,通過現(xiàn)有的Internet中增加一層新的網(wǎng)絡架構,將網(wǎng)站的內容發(fā)布到最接近用戶的Cache服務器內动知,通過智能DNS負載均衡技術皿伺,判斷用戶的來源,讓用戶就近使用與服務器相同線路的帶寬訪問Cache服務器盒粮,取得所需的內容鸵鸥。

例如,北京電信用戶訪問北京電信Cache服務器上的內容丹皱,四川網(wǎng)通用戶訪問成都網(wǎng)通Cache服務器上的內容妒穴。這樣可以有效減少數(shù)據(jù)在網(wǎng)絡上傳輸?shù)臅r間,提高訪問速度摊崭。

CDN是一套全國或全球的風不是緩存集群讼油,其實質是通過職能DNS判斷用戶的來源地域及上網(wǎng)線路,為用戶選擇一個最接近用戶地域爽室,以及和用戶上網(wǎng)線路相同的服務器節(jié)點汁讼。因為低于近,線路相同阔墩,所以可以大幅度提升用戶瀏覽網(wǎng)站的體驗嘿架。


CDN的價值:

省錢;

提升網(wǎng)站的用戶體驗啸箫;

可以阻擋大部分流量攻擊耸彪,如DDOS;



CDN的特點

CDN就是一個具備根據(jù)用戶區(qū)域和線路智能調度的風不是內存緩存集群忘苛。特點如下:

通過服務器內存緩存網(wǎng)站數(shù)據(jù)蝉娜,提高了企業(yè)站點(尤其是含有大量圖片、視頻等的站點)的訪問速度扎唾,并大大提高企業(yè)站點的穩(wěn)定性召川;

用戶根據(jù)智能DNS技術自動選擇最適合的Cache服務器,降低不同運營商之間互聯(lián)瓶頸造成的影響胸遇,實現(xiàn)了跨運營商的網(wǎng)絡加速荧呐,保證不同網(wǎng)絡中的用戶都能得到良好的訪問速度;

加快了訪問速度,減少了原站點的帶寬倍阐;

用戶訪問時從服務器的內存中讀取數(shù)據(jù)概疆,分擔了網(wǎng)絡流量,同時減輕了原站點負載壓力峰搪;

使用CDN可以分擔源站的網(wǎng)絡流量岔冀,同時減輕源站的負載壓力,并降低黑客入侵及各種DDOS攻擊對網(wǎng)站的影響概耻,保證網(wǎng)站有較好的服務質量使套;



使用CDN的基本要求

首先要說的是,不是所有的網(wǎng)站都可以一上來就能用CDN的咐蚯。要加速的業(yè)務數(shù)據(jù)應該存在獨立的域名童漩。如 pub.zhang21.com,業(yè)務內容圖片春锋、附件矫膨、JS、CSS等靜態(tài)元素期奔,這樣的靜態(tài)網(wǎng)站域名才能使用CDN侧馅。

將域名做CNAME(別名)

這個 pub.zhang21.com地址必須事先由CDN公司配置好的CDN公司的域名。



Nginx程序架構優(yōu)化

“解耦” 是開發(fā)人員中流行的一個名詞呐萌,簡單地說就是把一堆程序代碼按照業(yè)務用途分開馁痴,然后提供服務。

例如肺孤,注冊登錄罗晕、上傳、下載赠堵、瀏覽小渊、商品頁信息等都應該是獨立的程序服務,只不過在客戶端看來是一個整體而已茫叭。

分離的最佳方式是分別使用獨立的服務器酬屉,可以選擇改動程序或者在負載均衡器上配置(如Nginx),過濾請求揍愁,然后拋給后面對應的服務器呐萨。

如,根據(jù)擴展名分發(fā)莽囤。請求圖片就拋給圖片服務器谬擦;

根據(jù)URL路徑轉發(fā),請求下載就交給下載服務器朽缎;

請求動態(tài)PHP處理的就交給動態(tài)處理器怯屉;

不符合以上要求的就交給默認服務器蔚舀;



使用普通用戶啟動Nginx

為什么要讓Nginx服務使用普通用戶?

默認情況下锨络,Nginx的Master進程使用的是root用戶,worker進程使用的是Nginx指定的普通用戶狼牺。

使用root用戶跑Nginx的Master進程有兩個最大問題:

管理權限必須是root羡儿,這就使得最小化分配權限原則遇到困難;

使用root跑Nginx服務是钥,一旦網(wǎng)站出現(xiàn)漏洞掠归,用戶就可以很容易地獲取服務器的root權限


給Nginx服務降權的解決方案

利用普通用戶user跑Nginx服務,給開發(fā)及運維設置普通賬號悄泥,只要與user同組即可管理Nginx虏冻,該方案解決了Nginx管理問題,放置root分配權限過大弹囚;

開發(fā)人員使用普通賬戶即可管理Nginx服務及站點下的程序和日志厨相;

采取項目負責制度,誰處理誰負責鸥鹉;


給Nginx降權

通過Nginx -c 制定配置文件啟動Nginx

Nginx -c /home/user/nginx.conf

放置于user主目錄蛮穿,然后新建 www,logs等文件夾毁渗,更改所屬組權限践磅。

error_log /home/user/logs/error.log;

pid /home/user/logs/nginx.pid灸异;

access_log /home/user/logs/access.log;


優(yōu)點如下:

給Nginx服務降權府适,讓網(wǎng)站更安全;

·按用戶設置站點權限肺樟,使站點更獨立(無需虛擬化隔離)檐春;

開發(fā)不需要用root即可完整管理服務及站點;

可實現(xiàn)責任劃分儡嘶;



控制Nginx并發(fā)連接數(shù)量

ngx_http_limit_conn_module這個模塊用于限制每個定義的Key值的連接數(shù)喇聊,特別是單IP的連接數(shù)。

The ngx_http_limit_conn_module module is used to limit the number of connections per the defined key, in particular, the number of connections from a single IP address.

Not all connections are counted. A connection is counted only if it has a request processed by the server and the whole request header has already been read.

不是所有的連接數(shù)都會被計數(shù)蹦狂,一個符合要求的連接是整個請求頭已經(jīng)被讀取的連接誓篱。

limit_conn_zone參數(shù)

limit_conn_zone key zone=name:size;

http

limit_conn參數(shù):指定key最大連接數(shù)

limit_conn zone number凯楔;

http窜骄,server,location

配置文件:

http {

limit_conn_zone $binary_remote_addr zone=addr:10m;

...

server {

...

location /download/ {

limit_conn addr 1; ? ?#限制單IP的并發(fā)連接為1

}



控制客戶端請求Nginx的速率

The ngx_http_limit_req_module module (0.7.21) is used to limit the request processing rate per a defined key, in particular, the processing rate of requests coming from a single IP address. The limitation is done using the “l(fā)eaky bucket” method.

用于限制每個IP訪問每個定義Key的請求速率摆屯。

limit_req_zone key zone=name:size rate=rate邻遏;

http

limit_req zone=name

http糠亩,server,location

舉例:

http {

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

...

server {

...

location /search/ {

limit_req zone=one burst=5;

}



重點

安全優(yōu)化:隱藏Nginx軟件名及版本號准验;

性能加安全優(yōu)化:連接超時參數(shù)及FastCGI相關參數(shù)調優(yōu)赎线;

性能優(yōu)化:gzip壓縮功能即調試查看方法;

性能優(yōu)化:expires緩存功能及調試查看方法糊饱;

安全優(yōu)化:集群中各角色服務站點目錄權限控制策略垂寥;

安全優(yōu)化:站點目錄下所有的文件和目錄訪問控制;

性能加安全優(yōu)化:robots.txt協(xié)議及防怕從優(yōu)化解決方案另锋;

性能加安全優(yōu)化:靜態(tài)資源防盜鏈解決方案滞项;

用戶體驗優(yōu)化:錯誤頁面優(yōu)雅顯示方法;

安全優(yōu)化:限制http請求方法夭坪;

性能加安全優(yōu)化:CDN加速知識文判;

安全優(yōu)化:普通用戶運行Nginx方案策略;

性能加安全優(yōu)化:Nginx并發(fā)連接及請求速率控制室梅;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末戏仓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子竞惋,更是在濱河造成了極大的恐慌柜去,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拆宛,死亡現(xiàn)場離奇詭異嗓奢,居然都是意外死亡,警方通過查閱死者的電腦和手機浑厚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門股耽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钳幅,你說我怎么就攤上這事物蝙。” “怎么了敢艰?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵诬乞,是天一觀的道長。 經(jīng)常有香客問我钠导,道長震嫉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任牡属,我火速辦了婚禮票堵,結果婚禮上,老公的妹妹穿的比我還像新娘逮栅。我一直安慰自己悴势,他們只是感情好窗宇,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著特纤,像睡著了一般军俊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捧存,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天蝇完,我揣著相機與錄音,去河邊找鬼矗蕊。 笑死,一個胖子當著我的面吹牛氢架,可吹牛的內容都是我干的傻咖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼岖研,長吁一口氣:“原來是場噩夢啊……” “哼卿操!你這毒婦竟也來了?” 一聲冷哼從身側響起孙援,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤害淤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拓售,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窥摄,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年础淤,在試婚紗的時候發(fā)現(xiàn)自己被綠了崭放。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸽凶,死狀恐怖币砂,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情玻侥,我是刑警寧澤决摧,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站凑兰,受9級特大地震影響掌桩,放射性物質發(fā)生泄漏。R本人自食惡果不足惜票摇,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一拘鞋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧矢门,春花似錦盆色、人聲如沸灰蛙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摩梧。三九已至,卻和暖如春宣旱,著一層夾襖步出監(jiān)牢的瞬間仅父,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工浑吟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笙纤,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓组力,卻偏偏與公主長得像省容,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子燎字,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內容

  • 1. Nginx的模塊與工作原理 Nginx由內核和模塊組成懈叹,其中念逞,內核的設計非常微小和簡潔接谨,完成的工作也非常簡單...
    rosekissyou閱讀 10,197評論 5 124
  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx窝爪?那么一定聽過它的“同行”Apache吧!Ngi...
    JokerW閱讀 32,642評論 24 1,002
  • Nginx簡介 解決基于進程模型產(chǎn)生的C10K問題,請求時即使無狀態(tài)連接如web服務都無法達到并發(fā)響應量級一萬的現(xiàn)...
    魏鎮(zhèn)坪閱讀 1,991評論 0 9
  • 上一篇《WEB請求處理一:瀏覽器請求發(fā)起處理》蛉鹿,我們講述了瀏覽器端請求發(fā)起過程滨砍,通過DNS域名解析服務器IP,并建...
    七寸知架構閱讀 80,925評論 21 356
  • 1.ngnix介紹 ngnix www服務軟件 俄羅斯人開發(fā) 開源 性能很高 本身是一款靜態(tài)WWW軟件 靜態(tài)小文件...
    逗比punk閱讀 2,081評論 1 6