Nginx Web服務(wù)優(yōu)化

《老男孩Linux運(yùn)維》筆記




隱藏Nginx軟件版本號

一般來說,軟件的漏洞都和版本有關(guān)。因此要盡量隱藏對訪問用戶顯示各類敏感信息,這樣惡意的用戶就很難猜到他攻擊的服務(wù)器所用的是否有特定漏洞的軟件,從而加強(qiáng)Web服務(wù)安全。

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

http {

? ? server_tokens off | on;

}

server_tokens默認(rèn)是開啟的,且可放置于 http,server,location。



更改Nginx服務(wù)的默認(rèn)用戶

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

user nginx;

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

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



優(yōu)化Nginx進(jìn)程對應(yīng)的配置

修改nginx.conf配置文件:

worker_process 4;

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

nginx

上述參數(shù)調(diào)整的是Nginx服務(wù)的worker進(jìn)程數(shù),Nginx有Master進(jìn)程和worker進(jìn)程。Master為管理進(jìn)程,真正處理用戶的是worker進(jìn)程。

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進(jìn)程到不同的CPU上

默認(rèn)情況下,Nginx的多個進(jìn)程有可能跑在某一個CPU或CPU的某一核上,導(dǎo)致Nginx進(jìn)程使用硬件的資源不均。所以,盡可能地分配不同的Nginx進(jìn)程給不同的CPU處理,達(dá)到充分有效利用硬件的多CPU多核資源的目的。

四核CPU配置參考:

vi /etc/nginx/nginx.conf

worker_processes 4;

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



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

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

具體配置:

events {

? ? use epoll; ? ?#use是一個時間模塊指令,用來指定Nginx的工作模式,對于Linux內(nèi)核,推薦使用epoll工作模式

}

#對于使用連接進(jìn)程的方法,通常不需要進(jìn)行任何設(shè)置,Nginx會自動選擇最有效的方法。



調(diào)整Nginx單個進(jìn)程允許的客戶端最大連接數(shù)

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

events {

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

}

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



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

events {

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

}



開啟高效文件傳輸模式

設(shè)置參數(shù):sendfile

sendfile()是作用與兩個文件描述符之間的數(shù)據(jù)拷貝,這個拷貝實(shí)在內(nèi)核之中的,被稱為零拷貝。sendfile()比read和write函數(shù)要高效很多,因?yàn)閣rite和read函數(shù)要把數(shù)據(jù)拷貝到應(yīng)用層再進(jìn)行操作。

sendfile ?on|off

context: http,server,location,if in location

設(shè)置參數(shù):tcp_nopush

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

tcp_nopush on;

context: http,server,location



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

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

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

keepalive_timeout 60;

context:http,server,location

#用于設(shè)置客戶端連接保持會話的超時時間為60秒。超過這個時間,服務(wù)器會關(guān)閉該鏈接。

連接超時的作用:

將無用的連接設(shè)置為盡快超時,可保護(hù)系統(tǒng)資源(CPU、內(nèi)存、磁盤);

連接很多時,及時斷掉那些已經(jīng)建立好但又長時間不做事的連接,以減少其占用的服務(wù)器資源。因?yàn)榉?wù)器維護(hù)連接也是消耗資源的;

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

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

后端的FastCGI服務(wù)及MySQL服務(wù)也有對連接的超時控制。

設(shè)置參數(shù):tcp_nodelay

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

tcp_nodelay on;

context:http,server,location

設(shè)置參數(shù):client_header_timeout

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

client_header_timeout 20;

context:http,server

設(shè)置參數(shù):client_body_timeout

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

client_body_timeout 60;

context:http,server,location

設(shè)置參數(shù):send_timeout

指定響應(yīng)客戶端的超時時間,為握手后的一個超時。如果超過這個時間,客戶端沒有任何活動,Nginx將會關(guān)閉連接。

send_timeout 60;

context:http,server,location



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

參數(shù):client_max_body_size

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

client_max_body_size 8m;

context:http,server,location



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

FastCGI參數(shù)是配合Nginx向后請求PHP動態(tài)引擎服務(wù)的相關(guān)參數(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服務(wù)器設(shè)置地址;

fastcgi_index ? ?#設(shè)置一個將在 $fastcgi_scripts_name 變量結(jié)尾的URI之后添加的文件名;

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

fastcgi_next_upsteam ? ?#指定在哪種情況下將請求傳遞給下一個服務(wù)器;

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

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

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

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

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

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

fastcgi_busy_buffers_size ? ?#用于設(shè)置系統(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 ? ?#用來指定應(yīng)答代碼的緩存時間;

fastcgi_cache_min_uses ? ?#設(shè)置請求幾次之后響應(yīng)將被緩存;

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

fastcgi_cache_key ? ?#定義fastcgi_cache的key;

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



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

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

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

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

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

壓縮對象:

純文本內(nèi)容壓縮比很高,如 html, js, css, xml等;

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

圖片、媒體等文件盡量不要壓縮,因?yàn)檫@些文件大都經(jīng)過壓縮,再壓縮很可能不會減小很多,或有可能增大,同時還要消耗系統(tǒng)資源;

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

gzip on;#壓縮功能

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

gzip_buffers ?4 16K;#申請4個單位為16K的內(nèi)存作為壓縮結(jié)果流緩存

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

gzip_comp_level ?5;#指定壓縮比,1壓縮比最小,處理速度最快;9壓縮比最大,傳輸速度最快,處理最慢

gzip_types ?text/html text/css;#指定壓縮類型,對應(yīng)文件類型參考mime.types

gzip_vary on;#vary header支持

gzip效果查看:

Content-Encoding: gzip



Nginx expires緩存

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

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

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

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

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

服務(wù)器請求降低,服務(wù)器壓力就減輕了,成本也會降低;


Nginx expires配置

1,根據(jù)文件擴(kuò)展名進(jìn)行判斷:

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

{

? ? expires ?2y;#當(dāng)用戶訪問上述擴(kuò)展名文件時,緩存相應(yīng)的時間

}

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

{

expires 10d;

}


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

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

? ? expires 50d;

}


Nginx expires效果檢查:

Expires: 緩存過期時間

Cache-Control:緩存總時間


Nginx expires功能缺點(diǎn)及解決方法:

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

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

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


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

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




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

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

編寫腳本實(shí)現(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,降低服務(wù)性能。

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

access_log off;

}


訪問日志權(quán)限

不需要在日志目錄上給Nginx用戶讀或?qū)懺S可,很多人沒注意這個問題,把權(quán)限直接給了Nginx用戶,這就成了安全隱患。

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

chmod -R 700 /path/log/nginx

我以前一直也是認(rèn)為應(yīng)該 nginx:nginx ?/path/log/nginx,但今天看到這,去測試了上述方法,可以寫入日志。查看nginx運(yùn)行,原來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站點(diǎn)目錄及文件URL訪問控制

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

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

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

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

{

? deny all;

}

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

{

? deny all;

}


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

#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,否則會直接跳轉(zhuǎn)403,不在往下執(zhí)行,如果403默認(rèn)頁實(shí)在同一域名下,會造成死循環(huán)訪問;

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

3,以deny all結(jié)尾,表示除了上面允許的,其他都禁止;



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

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

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

server {

listen 80 default_server;

server_name _;

return 501;

}

#配置文件里面沒有寫的虛擬主機(jī)都調(diào)到 default_server。


或重定向:

server {

listen 80 default_server;

server_name _;

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

}


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

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

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

}


default_server舉例:

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

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)站維護(hù)中!</h1>

</html>




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

什么是資源盜鏈

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

這一舉動不僅浪費(fèi)了調(diào)用資源網(wǎng)站的網(wǎng)絡(luò)流量,還造成其他網(wǎng)站的帶寬及服務(wù)壓力吃緊。


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

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

如何處理?

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

2,經(jīng)常查看網(wǎng)站流量,關(guān)注流量變化,關(guān)注異常流量;

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



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

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

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

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

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

根據(jù)cookie防盜鏈

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



Nginx Web服務(wù)實(shí)現(xiàn)防盜鏈

利用 referer,針對指定擴(kuò)展名進(jìn)行 rewrite或其他操作

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

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

if ($invalid_referer) {

? ? rewrite xxxx;

? }

}

要根據(jù)實(shí)際情況進(jìn)行域名防盜鏈設(shè)置!


利用referer,針對站點(diǎn)目錄過濾并返回錯誤碼

location /images {

? root ?/var/www;

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

? if ($invalid_referer) {

? ? return 403;

? }

}


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

如果download目錄下有一個file.rar文件,那對應(yīng)的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相關(guān),這樣可以避免被盜連。


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

可以為圖片等增加水印。

通過查看Nginx日志格式中的 $http_referer 變量,查看被盜鏈情況。在對應(yīng)的日志文件中查看該變量的值,可以知曉 http_referer的信息。




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

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


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

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

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

location / {

xxxxxxx;

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

error_page 500 503 504 /50x.html;

location = /50x.html {

? ? root /xxx/xxx/50x.html; ? ?#將50x頁面放到本地單獨(dú)目錄下進(jìn)行顯示

? ? }

error_page 404 =200 /404200.jpg; ? ?#改變狀態(tài)碼并指定顯示內(nè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站點(diǎn)目錄文件及目錄權(quán)限優(yōu)化

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

為了保證網(wǎng)站不受木馬入侵,所有站點(diǎn)的目錄的用戶和組都為root,所有的目錄權(quán)限是是755,所有文件權(quán)限是644。

雖然這樣的權(quán)限可以防止黑客上傳修改站點(diǎn)文件,但這樣合法用戶便也沒有了上傳權(quán)限。

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

嚴(yán)格控制Nginx目錄的訪問才能降低網(wǎng)站被入侵的風(fēng)險!


Nginx反爬蟲優(yōu)化

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

Robots協(xié)議(也稱為爬蟲協(xié)議、機(jī)器人協(xié)議),全稱是“網(wǎng)絡(luò)爬蟲排除標(biāo)準(zhǔn)”(Robots Exclusion Protocol),網(wǎng)站通過Robots協(xié)議告訴搜索引擎那些頁面可以抓取,那些頁面不能抓取。

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

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

robots.txt語法

User-Agent:*

Allow:

Disallow:

來看一下簡書的robots.txt:

www.itdecent.cn/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,則跳轉(zhuǎn)

}



利用Nginx限制HTTP的請求方法

可以通過Nginx限制HTTP請求的方法來達(dá)到提升服務(wù)器安全的目的。

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

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

return 501;

}

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



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

什么是CDN?

CDN的全稱是 Content Delivery Network,中文意思是內(nèi)容分發(fā)網(wǎng)絡(luò)。

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

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

CDN是一套全國或全球的風(fēng)不是緩存集群,其實(shí)質(zhì)是通過職能DNS判斷用戶的來源地域及上網(wǎng)線路,為用戶選擇一個最接近用戶地域,以及和用戶上網(wǎng)線路相同的服務(wù)器節(jié)點(diǎn)。因?yàn)榈陀诮€路相同,所以可以大幅度提升用戶瀏覽網(wǎng)站的體驗(yàn)。


CDN的價值:

省錢;

提升網(wǎng)站的用戶體驗(yàn);

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



CDN的特點(diǎn)

CDN就是一個具備根據(jù)用戶區(qū)域和線路智能調(diào)度的風(fēng)不是內(nèi)存緩存集群。特點(diǎn)如下:

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

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

加快了訪問速度,減少了原站點(diǎn)的帶寬;

用戶訪問時從服務(wù)器的內(nèi)存中讀取數(shù)據(jù),分擔(dān)了網(wǎng)絡(luò)流量,同時減輕了原站點(diǎn)負(fù)載壓力;

使用CDN可以分擔(dān)源站的網(wǎng)絡(luò)流量,同時減輕源站的負(fù)載壓力,并降低黑客入侵及各種DDOS攻擊對網(wǎng)站的影響,保證網(wǎng)站有較好的服務(wù)質(zhì)量;



使用CDN的基本要求

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

將域名做CNAME(別名)

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



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

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

例如,注冊登錄、上傳、下載、瀏覽、商品頁信息等都應(yīng)該是獨(dú)立的程序服務(wù),只不過在客戶端看來是一個整體而已。

分離的最佳方式是分別使用獨(dú)立的服務(wù)器,可以選擇改動程序或者在負(fù)載均衡器上配置(如Nginx),過濾請求,然后拋給后面對應(yīng)的服務(wù)器。

如,根據(jù)擴(kuò)展名分發(fā)。請求圖片就拋給圖片服務(wù)器;

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

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

不符合以上要求的就交給默認(rèn)服務(wù)器;



使用普通用戶啟動Nginx

為什么要讓Nginx服務(wù)使用普通用戶?

默認(rèn)情況下,Nginx的Master進(jìn)程使用的是root用戶,worker進(jìn)程使用的是Nginx指定的普通用戶。

使用root用戶跑Nginx的Master進(jìn)程有兩個最大問題:

管理權(quán)限必須是root,這就使得最小化分配權(quán)限原則遇到困難;

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


給Nginx服務(wù)降權(quán)的解決方案

利用普通用戶user跑Nginx服務(wù),給開發(fā)及運(yùn)維設(shè)置普通賬號,只要與user同組即可管理Nginx,該方案解決了Nginx管理問題,放置root分配權(quán)限過大;

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

采取項(xiàng)目負(fù)責(zé)制度,誰處理誰負(fù)責(zé);


給Nginx降權(quán)

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

Nginx -c /home/user/nginx.conf

放置于user主目錄,然后新建 www,logs等文件夾,更改所屬組權(quán)限。

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

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

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


優(yōu)點(diǎn)如下:

給Nginx服務(wù)降權(quán),讓網(wǎng)站更安全;

·按用戶設(shè)置站點(diǎn)權(quán)限,使站點(diǎn)更獨(dú)立(無需虛擬化隔離);

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

可實(shí)現(xiàn)責(zé)任劃分;



控制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;

}



重點(diǎn)

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

性能加安全優(yōu)化:連接超時參數(shù)及FastCGI相關(guān)參數(shù)調(diào)優(yōu);

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

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

安全優(yōu)化:集群中各角色服務(wù)站點(diǎn)目錄權(quán)限控制策略;

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

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

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

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

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

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx?那么一定聽過它的“同行”Apache吧!Ngi...
    JokerW閱讀 33,007評論 24 1,002
  • Nginx簡介 解決基于進(jìn)程模型產(chǎn)生的C10K問題,請求時即使無狀態(tài)連接如web服務(wù)都無法達(dá)到并發(fā)響應(yīng)量級一萬的現(xiàn)...
    魏鎮(zhèn)坪閱讀 2,199評論 0 9
  • 上一篇《WEB請求處理一:瀏覽器請求發(fā)起處理》,我們講述了瀏覽器端請求發(fā)起過程,通過DNS域名解析服務(wù)器IP,并建...
    七寸知架構(gòu)閱讀 81,715評論 21 356
  • 1.ngnix介紹 ngnix www服務(wù)軟件 俄羅斯人開發(fā) 開源 性能很高 本身是一款靜態(tài)WWW軟件 靜態(tài)小文件...
    逗比punk閱讀 2,231評論 1 6
  • 永恒是種美麗,短暫也是種美麗,后者最美麗。 在一起美麗,分離也美麗,懂得分合者最美麗。 得到自己想要的你會因此美麗...
    唐朝的電梯閱讀 536評論 2 5

友情鏈接更多精彩內(nèi)容