日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面试题 nginx优化

發布時間:2023/12/29 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试题 nginx优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

nginx的優化

1. gzip壓縮優化 2. expires緩存有還 3. 網絡IO事件模型優化 4. 隱藏軟件名稱和版本號 5. 防盜鏈優化 6. 禁止惡意域名解析 7. 禁止通過IP地址訪問網站 8. HTTP請求方法優化 9. 防DOS攻擊單IP并發連接的控制,與連接速率控制 10. 嚴格設置web站點目錄的權限 11. 將nginx進程以及站點運行于監牢模式 12. 通過robot協議以及HTTP_USER_AGENT防爬蟲優化 13. 配置錯誤頁面根據錯誤碼指定網頁反饋給用戶 14. nginx日志相關優化訪問日志切割輪詢,不記錄指定元素日志、最小化日志目錄權限 15. 限制上傳到資源目錄的程序被訪問,防止木馬入侵系統破壞文件 16. FastCGI參數buffer和cache配置文件的優化 17. php.ini和php-fpm.conf配置文件的優化 18. 有關web服務的Linux內核方面深度優化(網絡連接、IO、內存等) 19. nginx加密傳輸優化(SSL) 20. web服務器磁盤掛載及網絡文件系統的優化 21. 使用nginx cache

1、基本安全優化

1.1  隱藏版本信息

??? 一般來說,軟件的漏洞都和版本相關,所以我們要隱藏或消除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 reload

1.2  隱藏nginx要修改源代碼

要修改內容的路徑:

第一路徑:

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參數,將默認的#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  降權啟動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服務

 重點強調:

  1.nginx.conf里面的相關路徑都要更改

  2.普通用戶的端口問題

2、  根據參數優化nginx服務性能

2.1  優化nginx進程個數的策略

  在高并發、高訪問量的web服務場景,需要事先啟動好更多的nginx進程,以保證快速響應并處理大量并發用戶的請求。

  worker_processes? 1;一般調整到與CPU的顆數相同

  (1)查看LInux可查看CPU個數及總核數

grep processor /proc/cpuinfo|wc -l

  (2)查看CPU總顆數

grep 'physical id' /proc/cpuinfo|sort|uniq|wc -l

  (3)通過執行top命令,然后按數字1,即可顯示所有的CPU核數

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.0

2.2   優化綁定不同的nginx進程到不同的CPU上

???  默認情況下,nginx的進程跑在某一個CPU或CPU的某一個核上,導致nginx進程使用硬件的資源不均,本節的優化是不同的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事件處理模型優化

  nginx的連接處理機制在于不同的操作系統會采用不同的I/O模型,Linux下,nginx使用epoll的I/O多路復用模型,在freebsd使用kqueue的IO多路復用模型,在solaris使用/dev/pool方式的IO多路復用模型,在windows使用的icop等等。?
  要根據系統類型不同選擇不同的事務處理模型,選擇有“use [ kqueue | rtsig |epool |dev/pool |select |pllo ];”我們使用的是Centos6.5的linux,因此將nginx的事件處理模型調整為epool模型。

events { worker_connections 1024; use epoll; }

官方說明:在不指定事件處理模型時,nginx默認會自動的選擇最佳的事件處理模型服務

2.4 調整nginx單個進程允許的客戶端最大連接數

參數語法:worker_connections number?
默認配置:worker_connections 512?
放置位置:events 標簽  

events {worker_connections 1024; #一個worker進程的并發 }

總并發= worker_processes* worker_connections

2.5 配置nginx worker進程最大打開文件數

參數語法:worker_rlimit_nofile number?
放置位置:主標簽段?
說明:作用是改變worker processes能打開的最大文件數

worker_rlimit_nofile 65535;

這各參數受系統文件的最大打開數限制,解決方法:

[root@admin nginx]# cat /proc/sys/fs/file-max 8192

文件系統最大可打開文件數

[root@admin nginx]# ulimit -n 1024

程序限制只能打開1024個文件

使用#?ulimit -n 8192調整一下

或者永久調整打開文件數 可在啟動文件/etc/rc.d/rc.local末尾添加(在/etc/sysctl.conf末尾添加fs.file-max=xxx無效)

2.6 開啟高效文件傳輸模式

設置參數?sendfile on;

sendfile參數用于開啟文件的高效傳輸模式。同時將tcp_nopush和tcp_nodelay兩個指令設置為on,可防止網絡及磁盤i/o阻塞,提升nginx工作效率。

http {sendfile on; #放在http,server,location都可以 }

設置參數tcp_nopush;

激活tcp_nopush參數可以允許把httpresponse header和文件的開始放在一個文件里發布,積極的作用是減少網絡報文段的數量(只有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相關參數調優

??? fastcgi參數是配合nginx向后請求PHP動態引擎服務的相關參數。

?

?

?

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壓縮實現性能優化

  nginx壓縮功能的介紹:

  nginx gzip壓縮模塊提供了壓縮文件內容的功能,用戶請求的內容在發送給客戶端之前,nginx服務器會根據一些具體的策略實施壓縮,以節省網站出口帶寬,同時加快了數據傳輸效率,提升了用戶的訪問體驗。

2.8.1 壓縮的優點:

  提升網站用戶體驗:由于發給用戶的內容小了,所以用戶訪問單位大小的頁面就快了,用戶體驗就提升了

  節約網站帶寬成本:由于數據時壓縮傳輸的,因此,會消耗一些cpu資源

2.8.2 壓縮的對象:

  純文本內容壓縮比很高,因此,純文本的內容最好要壓縮

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

  圖片、視頻(流媒體)等文件盡量不要壓縮,因為這些文件大多都是經過壓縮的,如果再壓縮很可能不會減小或減小很少,或者有可能增大,而在壓縮時還會消耗大量的CPU、內存資源

2.8.3 參數介紹及配置說明:

gzip on; ? ? ? ?                  ??#表示開啟壓縮功能

gzip_min_length? 1k;                ??#表示允許壓縮的頁面最小字節數,頁面字節數從header頭的Content-Length中獲取。默認值是0,表示不管頁面多大都進行壓縮,建議設置成大于1K。如果小于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;                   #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功能

  為用戶訪問網站的內容設定一個過期時間,當用戶第一次訪問到這些內容時,會把這些內容存儲在用戶瀏覽器本地,這樣用戶第二次及之后繼續訪問該網站,瀏覽器就會檢查已經緩存在用戶瀏覽器本地的內容,就不會去瀏覽器下載了,直到緩存的內容過期或者被清除為止。

?

?

2.9.1 expires作用和優點:

  ?expires可以降低網站的帶寬,節約成本

  加快用戶訪問網站的速度,提升了用戶訪問體驗

  服務器訪問量降低,服務器壓力就減輕了,服務器的成本也會降低,甚至可以節約人力成本

  幾乎對于所有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缺點及解決辦法:

  當網站被緩存的頁面或數據更新了,此時用戶端看到的可能還是舊的已經緩存的內容,這樣就會影響用戶體驗,那么如何解決這個問題呢?

  第一:對于經常需要的變動圖片等文件,可以縮短對象緩存時間,例如,百度、谷歌等網站的首頁圖片經常會換成一些節日的圖,這里可以將緩存期修改為1天

  第二:當網站改版或更新內容時,可以在服務器將緩存的對象改名(網站代碼程序)

  對于網站的圖片、附件,一般不會被用戶直接修改,用戶層面上的修改圖片,實際上是重新傳到服務器,雖然內容一樣但是一個新的圖片名了

  網站改版升級會修改JS、CSS元素,若改版的時候對這些元素改了名,會使得前端的CDN以及用戶端需要重新緩存內容

3.   nginx日志的優化

3.1 編寫腳本實現日志輪詢

  編寫腳本實現nginx access日志輪詢

  用戶咋請求一個軟件時,絕大多數軟件都會記錄用戶的訪問情況,nginx軟件目前沒有類似apache通過cronolog或者rotatelog對日志分隔處理的功能,但是,運維人員可以通過利用腳本開發、nginx的信號控制功能或reload重新加載,來實現日志的自動切割、輪詢。

  操作步驟:

    寫一個定時任務

mv www_access.log www_access_$(date +F -d -1day).log /applocation/nginx/sbin/nginx -s reload

3.2 不記錄不需要的日志

???  在實際工作中,對于負載均衡器健康檢查節點或某些特定的文件(圖片、JS、CSS)的日志,一般不需要記錄下來,因為在統計PV時是按照頁面計算的,而且日志寫入的太頻繁會消耗磁盤i/o,降低服務的性能

具體配制方法:location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {access_log off; }

3.3訪問日志的權限設置

  假如日志目錄為/app/logs,則授權方法為:

chown -R root.root /app/logschmod -R 600 /app/logs

  不需要在日志目錄上給nginx用戶讀寫或者讀寫許可,很多人都沒有注意這個問題,這就稱為了安全隱患。

4.   nginx站點目錄及文件URL訪問控制

4.1 根據擴展名限制程序和文件訪問

  web2.0時代,絕大多數網站都是以用戶為中心的,這些產品有一些共同點,就是不允許用戶發布內容到服務器,還允許用戶發圖片甚至附件上傳到服務器上,給用戶開啟了上傳的功能。帶來了很大的安全隱患。

  下面將利用nginx配置禁止訪問上傳資源目錄下的PHP,SHELL,PERL,PYTHON程序文件,這樣就算是用戶上傳了木馬文件也沒辦法執行

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 限制網站來源的IP訪問

使用ngx_http_access_module限制網站來源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禁止非法域名解析訪問企業網站

問題:nginx如何防止用戶IP訪問網站(惡意域名解析,相當于直接使用IP訪問網站)

方法1:直接報錯,用戶體驗不好

server {listen 80 default_server;server_name _;return 501;}

方法2:通過301跳轉到主頁

server {listen 80 default_server;server_name _;rewrite ^(.*) http//:blog.etiantian.org/$1 permanent;}

?

5.   nginx圖片防盜鏈解決方案。

簡單的說,沒有經過你的允許在自己網站嵌入你的圖片。

?

??

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

  • 根據HTTP referer實現防盜鏈
  • 根據cookie防盜鏈
  • ?

    5.2 防盜鏈實戰

    被盜鏈的網站配置

    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錯誤頁面的優雅顯示

    范例:當出現403錯誤會跳轉到403.html頁面

    error_page 403 /403.html;

    7.   nginx站點目錄文件及目錄權限優化

    ?

    ?

    ?

    8.  部署網站程序權限設置

    (1)wordpress站點目錄權限設置

    方案1:推薦方案

    目錄:755

    文件:644

    所有者:root

    圖片及上傳目錄設置所有者為www

    cd /application/apache/html/chown -R root.root blogfind ./blog/ -type f|xargs chmod 644find ./blog/ -type d|xargs chmod 755

    9.   nginx防爬蟲優化

    配置

    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做網站內容加速

    cdn特點

      本地Cache加速 提高了企業站點(尤其含有大量圖片和靜態頁面站點)的訪問速度,并大大提高以上性質站點的穩定性?

      鏡像服務 消除了不同運營商之間互聯的瓶頸造成的影響,實現了跨運營商的網絡加速,保證不同網絡中的用戶都能得到良好的訪問質量。?

      遠程加速 遠程訪問用戶根據DNS負載均衡技術智能自動選擇Cache服務器,選擇最快的Cache服務器,加快遠程訪問的速度?

      帶寬優化 自動生成服務器的遠程Mirror(鏡像)cache服務器,遠程用戶訪問時從cache服務器上讀取數據,減少遠程訪問的帶寬、分擔網絡流量、減輕原站點WEB服務器負載等功能。?

      集群抗攻擊 廣泛分布的CDN節點加上節點之間的智能冗余機制,可以有效地預防黑客入侵以及降低各種D.D.o.S攻擊對網站的影響,同時保證較好的服務質量 。

    12.  使用普通用戶啟動Nginx(監牢模式)

    解決方案?

      給Nginx服務降權,用普通用戶跑Nginx服務,給開發及運維設置普通賬號?

      開發人員使用普通賬號即可管理nginx服務及站點下的程序和日志?

      責任劃分:網絡問題:運維責任,網站打不開開發責任。(共同承擔)

    實戰配置:

    useradd incacd /home/incamkdir conf www logecho inca >www/index.html

    修改配置文件

    error_log /home/inca/log/error.logpid /home/inca/log/nginx.pid

    13. 控制Nginx并發連接數量

      ngx_http_limit_conn_module這個模塊用于限制每個定義key值得連接數,特別是單個TP的連接數。?
      不是所有的連接數都會被計算。一個符合計數要求的連接是整個請求頭已經被讀取的連接。

      控制Nginx并發連接數量參數的說明?
      1)limit_conn_zone參數:?
        語法:limit_conn_zone key zone=name:size;?
        上下文:http?
        用于設置共享內存區域,key可以是字符串、Nginx自帶變量或前兩個組合。name為內存區域的名稱,size為內存區域的大小。

      2)limit_conn參數?
        語法:limit_conn zone number;?
        上下文:http、server、location?
        用于指定key設置最大連接數。當超時最大連接數時,服務器會返回503報錯。

    14. 控制客戶端請求Nginx的速率

      ngx_http_limit_req_module模塊用于限制每個IP訪問每個定義key的請求速率。

      limit_req_zone參數說明如下。?
        語法:limit_req_zone key zone=name:size rate=rate;?
        上下文:http?
        用于設置共享內存區域,key可以是字符串,Nginx自帶變量或前兩個組合。name為內存區域的名稱,size為內存區域的大小,rate為速率,單位為r/s,每秒一個請求。?
      limit_req參數說明如下:?
        語法:limit_req zone=name [burst-number] [nobelay]?
        上下文:http、server、location?
        這里運用了令牌桶原理,burst=num,一個有num快令牌,令牌發完后,多出來的那些請求就會返回503。?
      nodelay默認在不超過burst值得前提下會排隊等待處理,如果使用此參數,就會處理完num+1次請求,剩余的請求為超時,返回503。

    https://www.cnblogs.com/dazhidacheng/p/7772451.html

    總結

    以上是生活随笔為你收集整理的面试题 nginx优化的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。