《老男孩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
上述參數(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ù);
優(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骡男;
配置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:
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ā)連接及請求速率控制室梅;