面试题 nginx优化
nginx的優(yōu)化
1. gzip壓縮優(yōu)化 2. expires緩存有還 3. 網(wǎng)絡IO事件模型優(yōu)化 4. 隱藏軟件名稱和版本號 5. 防盜鏈優(yōu)化 6. 禁止惡意域名解析 7. 禁止通過IP地址訪問網(wǎng)站 8. HTTP請求方法優(yōu)化 9. 防DOS攻擊單IP并發(fā)連接的控制,與連接速率控制 10. 嚴格設(shè)置web站點目錄的權(quán)限 11. 將nginx進程以及站點運行于監(jiān)牢模式 12. 通過robot協(xié)議以及HTTP_USER_AGENT防爬蟲優(yōu)化 13. 配置錯誤頁面根據(jù)錯誤碼指定網(wǎng)頁反饋給用戶 14. nginx日志相關(guān)優(yōu)化訪問日志切割輪詢,不記錄指定元素日志、最小化日志目錄權(quán)限 15. 限制上傳到資源目錄的程序被訪問,防止木馬入侵系統(tǒng)破壞文件 16. FastCGI參數(shù)buffer和cache配置文件的優(yōu)化 17. php.ini和php-fpm.conf配置文件的優(yōu)化 18. 有關(guān)web服務的Linux內(nèi)核方面深度優(yōu)化(網(wǎng)絡連接、IO、內(nèi)存等) 19. nginx加密傳輸優(yōu)化(SSL) 20. web服務器磁盤掛載及網(wǎng)絡文件系統(tǒng)的優(yōu)化 21. 使用nginx cache1、基本安全優(yōu)化
1.1 隱藏版本信息
??? 一般來說,軟件的漏洞都和版本相關(guān),所以我們要隱藏或消除web服務對訪問用戶顯示的各種敏感信息。
1 [root@db01 rpm]# curl -I 10.0.0.82 HTTP/1.1 401 Unauthorized3 Server: nginx #隱藏版本號4 Date: Thu, 21 Jul 2016 03:23:38 GMT5 Content-Type: text/html6 Content-Length: 1887 Connection: keep-alive8 WWW-Authenticate: Basic realm="oldboy training"9 過程: 10 vim /application/nginx/conf/nginx.conf 11 在http模塊下加入: 12 server_tokens off; 13 /application/nginx/sbin/nginx -t 14 /application/nginx/sbin/nginx -s reload1.2 隱藏nginx要修改源代碼
要修改內(nèi)容的路徑:
第一路徑:
1 /home/oldboy/tools/nginx-1.6.3/src/core/nginx.h 第14,16行 2 #define NGINX_VERSION "1.6.2" 修改為想要的版本號如2.4.3 3 #define NGINX_VER "nginx/" NGINX_VERSION 將nginx修改為想要修改的軟件名稱,如Apache。第二路徑
1 /home/oldboy/tools/nginx-1.6.3/src/http/ngx_http_header_filter_module.c第49行 2 grep 'Server:nginx' ngx_http_header_filter_module.cstatic 3 sed -i 's#Server:nginx#Server:Apache#g' ngx_http_header_filter_module.c第三路徑
/home/oldboy/tools/nginx-1.6.3/src/http/ngx_http_special_response.c第21,30行 "<hr><center>"NGINX_VER "(http://oldboy.blog.51cto.com)</center>" CRLF "<hr><center>OWS</center>" CRLF然后重新編譯
1.3 更改nginx服務的默認用戶
第一種方法:
? ? 直接更改配置文件nginx.conf.default參數(shù),將默認的#user nobody;改為user nginx.nginx;
第二種方法:
直接在編譯nginx的時候指定用戶和用戶組命令如下:
./configure --prefix=/application/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module
1.4 降權(quán)啟動nginx
1 useradd inca 2 cd /home/inca/ 3 mkdir conf logs www 4 echo inca >www/index.html 5 chown -R inca.inca * 6 ln -s /application/nginx/conf/mime.types conf/mime.types #mime.types媒體類型文件egrep -v "#|^$" /application/nginx/conf/nginx.conf.default >conf/nginx.conf
nginx.conf配置文件
worker_processes 1; error_log /home/inca/logs/error.log; pid /home/inca/logs/nginx.pid; events {worker_connections 1024; } http {include mime.types;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {listen 8080;server_name localhost;location / {root /home/inca/www;index index.html index.htm;}access_log /home/inca/logs/access.log main; } }su - inca -c "/application/nginx/sbin/nginx -c /home/inca/conf/nginx.conf" ? #啟動nginx服務
重點強調(diào):
1.nginx.conf里面的相關(guān)路徑都要更改
2.普通用戶的端口問題
2、 根據(jù)參數(shù)優(yōu)化nginx服務性能
2.1 優(yōu)化nginx進程個數(shù)的策略
在高并發(fā)、高訪問量的web服務場景,需要事先啟動好更多的nginx進程,以保證快速響應并處理大量并發(fā)用戶的請求。
worker_processes? 1;一般調(diào)整到與CPU的顆數(shù)相同
(1)查看LInux可查看CPU個數(shù)及總核數(shù)
grep processor /proc/cpuinfo|wc -l(2)查看CPU總顆數(shù)
grep 'physical id' /proc/cpuinfo|sort|uniq|wc -l(3)通過執(zhí)行top命令,然后按數(shù)字1,即可顯示所有的CPU核數(shù)
top 按1鍵就會顯示第一個的信息Cpu0 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.02.2 優(yōu)化綁定不同的nginx進程到不同的CPU上
??? 默認情況下,nginx的進程跑在某一個CPU或CPU的某一個核上,導致nginx進程使用硬件的資源不均,本節(jié)的優(yōu)化是不同的nginx進程給不同的CPU處理,充分有效的利用有效的硬件資源
四核cpu配置
worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000;雙核配置
worker_processes 2; worker_cpu_affinity 0101 1010;還有一個命令taskset -c用來分配服務給CPU
2.3 nginx事件處理模型優(yōu)化
nginx的連接處理機制在于不同的操作系統(tǒng)會采用不同的I/O模型,Linux下,nginx使用epoll的I/O多路復用模型,在freebsd使用kqueue的IO多路復用模型,在solaris使用/dev/pool方式的IO多路復用模型,在windows使用的icop等等。?
要根據(jù)系統(tǒng)類型不同選擇不同的事務處理模型,選擇有“use [ kqueue | rtsig |epool |dev/pool |select |pllo ];”我們使用的是Centos6.5的linux,因此將nginx的事件處理模型調(diào)整為epool模型。
官方說明:在不指定事件處理模型時,nginx默認會自動的選擇最佳的事件處理模型服務
2.4 調(diào)整nginx單個進程允許的客戶端最大連接數(shù)
參數(shù)語法:worker_connections number?
默認配置:worker_connections 512?
放置位置:events 標簽
總并發(fā)= worker_processes* worker_connections
2.5 配置nginx worker進程最大打開文件數(shù)
參數(shù)語法:worker_rlimit_nofile number?
放置位置:主標簽段?
說明:作用是改變worker processes能打開的最大文件數(shù)
這各參數(shù)受系統(tǒng)文件的最大打開數(shù)限制,解決方法:
[root@admin nginx]# cat /proc/sys/fs/file-max 8192文件系統(tǒng)最大可打開文件數(shù)
[root@admin nginx]# ulimit -n 1024程序限制只能打開1024個文件
使用#?ulimit -n 8192調(diào)整一下
或者永久調(diào)整打開文件數(shù) 可在啟動文件/etc/rc.d/rc.local末尾添加(在/etc/sysctl.conf末尾添加fs.file-max=xxx無效)
2.6 開啟高效文件傳輸模式
設(shè)置參數(shù)?sendfile on;
sendfile參數(shù)用于開啟文件的高效傳輸模式。同時將tcp_nopush和tcp_nodelay兩個指令設(shè)置為on,可防止網(wǎng)絡及磁盤i/o阻塞,提升nginx工作效率。
http {sendfile on; #放在http,server,location都可以 }設(shè)置參數(shù)tcp_nopush;
激活tcp_nopush參數(shù)可以允許把httpresponse header和文件的開始放在一個文件里發(fā)布,積極的作用是減少網(wǎng)絡報文段的數(shù)量(只有sendfile on開啟才生效)
例:sendfile on;tcp_nopush on;tcp_nodelay on;server_tokens off;server_names_hash_bucket_size 128;server_names_hash_max_size 512;keepalive_timeout 65;client_header_timeout 15s;client_body_timeout 15s;send_timeout 60s;2.7 FastCGI相關(guān)參數(shù)調(diào)優(yōu)
??? fastcgi參數(shù)是配合nginx向后請求PHP動態(tài)引擎服務的相關(guān)參數(shù)。
?
?
?
fastcgi_connect_timeout 240; fastcgi_send_timeout 240; fastcgi_read_timeout 240; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; #fastcgi_temp_path /data/ngx_fcgi_tmp; fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;?
?
?
2.8 配置nginx gzip壓縮實現(xiàn)性能優(yōu)化
nginx壓縮功能的介紹:
nginx gzip壓縮模塊提供了壓縮文件內(nèi)容的功能,用戶請求的內(nèi)容在發(fā)送給客戶端之前,nginx服務器會根據(jù)一些具體的策略實施壓縮,以節(jié)省網(wǎng)站出口帶寬,同時加快了數(shù)據(jù)傳輸效率,提升了用戶的訪問體驗。
2.8.1 壓縮的優(yōu)點:
提升網(wǎng)站用戶體驗:由于發(fā)給用戶的內(nèi)容小了,所以用戶訪問單位大小的頁面就快了,用戶體驗就提升了
節(jié)約網(wǎng)站帶寬成本:由于數(shù)據(jù)時壓縮傳輸?shù)?#xff0c;因此,會消耗一些cpu資源
2.8.2 壓縮的對象:
純文本內(nèi)容壓縮比很高,因此,純文本的內(nèi)容最好要壓縮
被壓縮的純文本文件必須要大于1KB,由于壓縮算法的特殊原因,極小的文件壓縮反而變大
圖片、視頻(流媒體)等文件盡量不要壓縮,因為這些文件大多都是經(jīng)過壓縮的,如果再壓縮很可能不會減小或減小很少,或者有可能增大,而在壓縮時還會消耗大量的CPU、內(nèi)存資源
2.8.3 參數(shù)介紹及配置說明:
gzip on; ? ? ? ? ??#表示開啟壓縮功能
gzip_min_length? 1k; ??#表示允許壓縮的頁面最小字節(jié)數(shù),頁面字節(jié)數(shù)從header頭的Content-Length中獲取。默認值是0,表示不管頁面多大都進行壓縮,建議設(shè)置成大于1K。如果小于1K可能會越壓越大
gzip_buffers???? 4 32k; ? ?#壓縮緩存區(qū)大小
gzip_http_version 1.1;? ?#壓縮版本
gzip_comp_level 9; ??#壓縮比率
gzip_types? text/css text/xml application/javascript; #指定壓縮的類型
gzip_vary on; #vary header支持
完美配置:
nginx.conf 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;2.9 nginx expires功能
為用戶訪問網(wǎng)站的內(nèi)容設(shè)定一個過期時間,當用戶第一次訪問到這些內(nèi)容時,會把這些內(nèi)容存儲在用戶瀏覽器本地,這樣用戶第二次及之后繼續(xù)訪問該網(wǎng)站,瀏覽器就會檢查已經(jīng)緩存在用戶瀏覽器本地的內(nèi)容,就不會去瀏覽器下載了,直到緩存的內(nèi)容過期或者被清除為止。
?
?
2.9.1 expires作用和優(yōu)點:
?expires可以降低網(wǎng)站的帶寬,節(jié)約成本
加快用戶訪問網(wǎng)站的速度,提升了用戶訪問體驗
服務器訪問量降低,服務器壓力就減輕了,服務器的成本也會降低,甚至可以節(jié)約人力成本
幾乎對于所有web服務來說,這是非常重要的功能之一,apache服務也有此功能。
2.9.2 nginx expires 配置詳解:
## Add expires header according to URI(path or dir).location ~ ^/(images|javascript|js|css|flash|media|static)/ {expires 360d; }2.9.3 expire缺點及解決辦法:
當網(wǎng)站被緩存的頁面或數(shù)據(jù)更新了,此時用戶端看到的可能還是舊的已經(jīng)緩存的內(nèi)容,這樣就會影響用戶體驗,那么如何解決這個問題呢?
第一:對于經(jīng)常需要的變動圖片等文件,可以縮短對象緩存時間,例如,百度、谷歌等網(wǎng)站的首頁圖片經(jīng)常會換成一些節(jié)日的圖,這里可以將緩存期修改為1天
第二:當網(wǎng)站改版或更新內(nèi)容時,可以在服務器將緩存的對象改名(網(wǎng)站代碼程序)
對于網(wǎng)站的圖片、附件,一般不會被用戶直接修改,用戶層面上的修改圖片,實際上是重新傳到服務器,雖然內(nèi)容一樣但是一個新的圖片名了
網(wǎng)站改版升級會修改JS、CSS元素,若改版的時候?qū)@些元素改了名,會使得前端的CDN以及用戶端需要重新緩存內(nèi)容
3. nginx日志的優(yōu)化
3.1 編寫腳本實現(xiàn)日志輪詢
編寫腳本實現(xiàn)nginx access日志輪詢
用戶咋請求一個軟件時,絕大多數(shù)軟件都會記錄用戶的訪問情況,nginx軟件目前沒有類似apache通過cronolog或者rotatelog對日志分隔處理的功能,但是,運維人員可以通過利用腳本開發(fā)、nginx的信號控制功能或reload重新加載,來實現(xiàn)日志的自動切割、輪詢。
操作步驟:
寫一個定時任務
mv www_access.log www_access_$(date +F -d -1day).log /applocation/nginx/sbin/nginx -s reload3.2 不記錄不需要的日志
??? 在實際工作中,對于負載均衡器健康檢查節(jié)點或某些特定的文件(圖片、JS、CSS)的日志,一般不需要記錄下來,因為在統(tǒng)計PV時是按照頁面計算的,而且日志寫入的太頻繁會消耗磁盤i/o,降低服務的性能
具體配制方法:location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {access_log off; }3.3訪問日志的權(quán)限設(shè)置
假如日志目錄為/app/logs,則授權(quán)方法為:
chown -R root.root /app/logschmod -R 600 /app/logs不需要在日志目錄上給nginx用戶讀寫或者讀寫許可,很多人都沒有注意這個問題,這就稱為了安全隱患。
4. nginx站點目錄及文件URL訪問控制
4.1 根據(jù)擴展名限制程序和文件訪問
web2.0時代,絕大多數(shù)網(wǎng)站都是以用戶為中心的,這些產(chǎn)品有一些共同點,就是不允許用戶發(fā)布內(nèi)容到服務器,還允許用戶發(fā)圖片甚至附件上傳到服務器上,給用戶開啟了上傳的功能。帶來了很大的安全隱患。
下面將利用nginx配置禁止訪問上傳資源目錄下的PHP,SHELL,PERL,PYTHON程序文件,這樣就算是用戶上傳了木馬文件也沒辦法執(zhí)行
1 location ~ ^/images/.*\.(php|php5|.sh|.pl|.py)$2 {3 deny all;4 }5 location ~ ^/static/.*\.(php|php5|.sh|.pl|.py)$6 {7 deny all;8 }9 location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$ 10 { 11 deny all; 12 }對于上述目錄的限制必須寫在nginx處理PHP服務配置的前面
4.2 禁止訪問指定目錄下的所有文件和目錄
配置禁止訪問指定的單個或多個目錄
location ~ ^/(static)/ {deny all; }location ~ ^/static {deny all; }禁止訪問目錄并且返回代碼404
server {listen 80;server_name www.etiantian.org etiantian.org;root /data0/www/www;index index.html index.htm;access_log /app/logs/www_access.log commonlog;location /admin/ { return 404; }location /templates/ { return 403; }}4.3 限制網(wǎng)站來源的IP訪問
使用ngx_http_access_module限制網(wǎng)站來源IP訪問。
范例1:禁止外界訪問,但允許某個IP訪問該目錄
location ~ ^/oldboy/ {allow 202.111.12.211;deny all;}范例2:限制及指定IP或IP段訪問。
location / {deny 192.168.1.1;allow 192.168.1.0/24;allow 10.1.1.0/16;deny all;}4.4 配置nginx禁止非法域名解析訪問企業(yè)網(wǎng)站
問題:nginx如何防止用戶IP訪問網(wǎng)站(惡意域名解析,相當于直接使用IP訪問網(wǎng)站)
方法1:直接報錯,用戶體驗不好
server {listen 80 default_server;server_name _;return 501;}方法2:通過301跳轉(zhuǎn)到主頁
server {listen 80 default_server;server_name _;rewrite ^(.*) http//:blog.etiantian.org/$1 permanent;}?
5. nginx圖片防盜鏈解決方案。
簡單的說,沒有經(jīng)過你的允許在自己網(wǎng)站嵌入你的圖片。
?
??
5.1 常見的防盜鏈解決方案的基本原理
?
5.2 防盜鏈實戰(zhàn)
被盜鏈的網(wǎng)站配置
1 #Preventing hot linking of images and other file types2 3 location ~* ^.+\.(jpg|png|swf|flv|rar|zip)$ {4 5 valid_referers none blocked *.etiantian.org etiantian.org;6 7 if ($invalid_referer) {8 9 rewrite ^/ http://bbs.etiantian.org/img/nolink.gif; 10 11 } 12 13 root html/www; 14 15 }6. nginx錯誤頁面的優(yōu)雅顯示
范例:當出現(xiàn)403錯誤會跳轉(zhuǎn)到403.html頁面
error_page 403 /403.html;7. nginx站點目錄文件及目錄權(quán)限優(yōu)化
?
?
?
8. 部署網(wǎng)站程序權(quán)限設(shè)置
(1)wordpress站點目錄權(quán)限設(shè)置
方案1:推薦方案
目錄:755
文件:644
所有者:root
圖片及上傳目錄設(shè)置所有者為www
cd /application/apache/html/chown -R root.root blogfind ./blog/ -type f|xargs chmod 644find ./blog/ -type d|xargs chmod 7559. nginx防爬蟲優(yōu)化
配置
if ($http_user_agent ~* LWP:Simple|BBBike|wget) {return 403 ;rewrite ^(.*) http://blog.etiantian.org/$1 permanent;}?
10. 利用nginx限制HTTP的請求方法
配置:
if ($request_method !~ ^(GET|HEAD|POST)$ ) {return 501;}配置上傳服務器限制HTTP的GET的配置
#Only allow these request methods ##if ($request_method ~*(GET)$ ) {return 501;}?
11. 使用CDN做網(wǎng)站內(nèi)容加速
cdn特點
本地Cache加速 提高了企業(yè)站點(尤其含有大量圖片和靜態(tài)頁面站點)的訪問速度,并大大提高以上性質(zhì)站點的穩(wěn)定性?
鏡像服務 消除了不同運營商之間互聯(lián)的瓶頸造成的影響,實現(xiàn)了跨運營商的網(wǎng)絡加速,保證不同網(wǎng)絡中的用戶都能得到良好的訪問質(zhì)量。?
遠程加速 遠程訪問用戶根據(jù)DNS負載均衡技術(shù)智能自動選擇Cache服務器,選擇最快的Cache服務器,加快遠程訪問的速度?
帶寬優(yōu)化 自動生成服務器的遠程Mirror(鏡像)cache服務器,遠程用戶訪問時從cache服務器上讀取數(shù)據(jù),減少遠程訪問的帶寬、分擔網(wǎng)絡流量、減輕原站點WEB服務器負載等功能。?
集群抗攻擊 廣泛分布的CDN節(jié)點加上節(jié)點之間的智能冗余機制,可以有效地預防黑客入侵以及降低各種D.D.o.S攻擊對網(wǎng)站的影響,同時保證較好的服務質(zhì)量 。
12. 使用普通用戶啟動Nginx(監(jiān)牢模式)
解決方案?
給Nginx服務降權(quán),用普通用戶跑Nginx服務,給開發(fā)及運維設(shè)置普通賬號?
開發(fā)人員使用普通賬號即可管理nginx服務及站點下的程序和日志?
責任劃分:網(wǎng)絡問題:運維責任,網(wǎng)站打不開開發(fā)責任。(共同承擔)
實戰(zhàn)配置:
useradd incacd /home/incamkdir conf www logecho inca >www/index.html修改配置文件
error_log /home/inca/log/error.logpid /home/inca/log/nginx.pid13. 控制Nginx并發(fā)連接數(shù)量
ngx_http_limit_conn_module這個模塊用于限制每個定義key值得連接數(shù),特別是單個TP的連接數(shù)。?
不是所有的連接數(shù)都會被計算。一個符合計數(shù)要求的連接是整個請求頭已經(jīng)被讀取的連接。
控制Nginx并發(fā)連接數(shù)量參數(shù)的說明?
1)limit_conn_zone參數(shù):?
語法:limit_conn_zone key zone=name:size;?
上下文:http?
用于設(shè)置共享內(nèi)存區(qū)域,key可以是字符串、Nginx自帶變量或前兩個組合。name為內(nèi)存區(qū)域的名稱,size為內(nèi)存區(qū)域的大小。
2)limit_conn參數(shù)?
語法:limit_conn zone number;?
上下文:http、server、location?
用于指定key設(shè)置最大連接數(shù)。當超時最大連接數(shù)時,服務器會返回503報錯。
14. 控制客戶端請求Nginx的速率
ngx_http_limit_req_module模塊用于限制每個IP訪問每個定義key的請求速率。
limit_req_zone參數(shù)說明如下。?
語法:limit_req_zone key zone=name:size rate=rate;?
上下文:http?
用于設(shè)置共享內(nèi)存區(qū)域,key可以是字符串,Nginx自帶變量或前兩個組合。name為內(nèi)存區(qū)域的名稱,size為內(nèi)存區(qū)域的大小,rate為速率,單位為r/s,每秒一個請求。?
limit_req參數(shù)說明如下:?
語法:limit_req zone=name [burst-number] [nobelay]?
上下文:http、server、location?
這里運用了令牌桶原理,burst=num,一個有num快令牌,令牌發(fā)完后,多出來的那些請求就會返回503。?
nodelay默認在不超過burst值得前提下會排隊等待處理,如果使用此參數(shù),就會處理完num+1次請求,剩余的請求為超時,返回503。
https://www.cnblogs.com/dazhidacheng/p/7772451.html
總結(jié)
以上是生活随笔為你收集整理的面试题 nginx优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R语言安装部署基础
- 下一篇: 使用matplotlib绘制3D图表