運維面試篇-----3.nginx基礎面試

1.什麼是nginx?
Nginx (engine x) 是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP服務器
Nginx作爲負載均衡服務器:Nginx 既可以在內部直接支持 Rails 和 PHP 程序對外進行服務,也可以支持作爲 HTTP代理服務器對外進行服務。Nginx採用C進行編寫,不論是系統資源開銷還是CPU使用效率都比 Perlbal 要好很多。
FastCGI,簡單的負載均衡和容錯
2.常見的模塊化結構
模塊化的結構。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。

3.五種負載均衡模式:
1.roudrobin 輪詢
2.weight 權重
3.ip——hash 解決session問題 i固定服務器
4.url——hash請求分配不同機器
5.fair 根據後因愛響應時間來分發請求,響應時間短的分發請求多

4.中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等

5.模塊依賴性
gzip模塊需要 zlib 庫
rewrite模塊需要 pcre 庫
ssl 功能需要openssl庫

5.nginx特點:
    Ø 跨平臺:可以在大多數Unix like 系統編譯運行。而且也有Windows的移植版本。 
  Ø 配置異常簡單:非常的簡單,易上手。 
  Ø 非阻塞、高併發連接:數據複製時,磁盤I/O的第一階段是非阻塞的。官方測試能支持5萬併發連接,實際生產中能跑2~3萬併發連接數(得益於Nginx採用了最新的epoll事件處理模型(消息隊列)。 
  Ø Nginx代理和後端Web服務器間無需長連接; 
  Ø Nginx接收用戶請求是異步的,即先將用戶請求全部接收下來,再一次性發送到後端Web服務器,極大減輕後端Web服務器的壓力。 
  Ø 發送響應報文時,是邊接收來自後端Web服務器的數據,邊發送給客戶端。 
  Ø 網絡依賴性低,理論上只要能夠ping通就可以實施負載均衡,而且可以有效區分內網、外網流量。 
  Ø 支持內置服務器檢測。Nginx能夠根據應用服務器處理頁面返回的狀態碼、超時信息等檢測服務器是否出現故障,並及時返回錯誤的請求重新提交到其它節點上。 
  Ø 採用Master/worker多進程工作模式 
  Ø 此外還有內存消耗小、成本低廉(比F5硬件負載均衡器廉價太多)、節省帶寬、穩定性高等特點

6.nginx優化:
1.nginx配置的優化:
唯一可調的時nginx.conf ,因爲fastcgi是爲nginx管理進程的工具,當客戶端請求到達nginx時,fastcgi選擇並連接一個進程,並將web server的返回信息推送
從進程數優化 
》設置爲web server打開的最大worker進程數,設爲auto
》設置每個worker進程的最大連接數,設置大點
從鏈接設置
》設置客戶端鏈接超時時間,服務器在這個時間之後關閉鏈接,設置小點
》設置客戶端響應超時時間,倆次客戶端讀取操作的時間,設置小點
gzip壓縮形式的數據傳輸
》對於比較大的數據可以開啓gzip壓縮傳輸的形式傳輸
從緩存設置
》指定緩存的最大數目,緩存的時間
2.從集羣架構優化
做nginx的lvs集羣,實現負載
**************************************88
1.  隱藏nginx header裏面的版本信息


執行:curl –I 127.0.0.1會顯示nginx的版本信息


隱藏操作:在http標籤內加入“server_tokenoff”參數


2.  更改源碼隱藏軟件名稱及版本號


在nginx編譯安裝之前,先更改,之後再編譯安裝


cd /nginx-1.6.3/src/core


sed –n ’13,17p’ nginx.h裏面修改NGINX_VERSION


修改ngx_http_header_filter_module.c


sed –I ‘s#Server:nginx#Server:Apache#g’ ngx_http_header_filter_module.c


修改ngx_http_special_response.c


3 更改nginx默認用戶及用戶組(worker進程優化)


建立nginx用戶 useradd nginx–s/sbin/nologin –M


id nginx確認


在nginx.conf最外層上面配置usernginx;即可


也可以編譯的時候指定用戶


3.  讓worker進程使用普通用戶運行


爲master服務降權:使用非root跑nginx master


注意不能用80特權端口,前端nginx反向代理轉端口在啓動的時候指定配置文件


4.  配置nginx worker進程個數


nginx由master和worker進程組成,master進程相當於管理員,worker進程爲用戶提供服務一般設置爲cpu核數×2,用top按1查看cpu數量


修改nginx.conf配置文件第一行


worker_processes 4;


5.  根據cpu核數進行nginx進程優化


work_processes 4;


worker_cpu_affinity 0001 0010 0100 1000;


6nginx事件處理模型優化


nginx的連接處理機制在不同的操作系統上採用不同的IO模型,在linux下,nginx使用epoll的IO多路複用模型,windows下使用icop模型


具體配置:


events{


use epoll;


worker_connections 1024;


}


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


這個值根據服務器性能和程序的內存來指定(一個進程啓動使用的內存根據程序確定)


events{


use epoll;


worker_connections 201480;


}


這個參數是單個進程的最大連接數,實際最大連接數公式爲:


Max_client=worker_processes*worker_connections


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


worker_rlimit_nofile 65535;


相當於系統ulimit –HSn,應該是總的


9開啓高效的文件傳輸模式


參數在http標籤設置爲:sendfileon;tcp_nopush on;(只有在sendfile開啓模式下有效


10設置連接超時時間


建立連接也是消耗資源的,我們一般斷掉那些連上的鏈接,但是不做事的


php網站建議短鏈接,java網站建議長連接


http標籤設置:


keepalive_timeout 60;


設置客戶端連接保持會話的超時時間,超過這個時間,服務器會關閉該鏈接


tcp_nodelay on;


打開tcp_nodelay,在包含keepalive參數纔有效


client_header_timeout 15;


請求頭超時


client_body_timeout 15


請求主體超時


send_timeout 15;


指定響應客戶端超時時間,這個超時時間僅僅限於兩個連接活動之間的時間,如果超過這個時間,客戶端沒有任何活動,nginx將會關閉連接


11.上傳文件大小限制


http{


client_max_body_size 10m;


}


12.fastcgi調優(配合php引擎動態服務)


cache讀取緩存區


buffer寫入緩存區


fastcgi是靜態服務和動態服務之間的一個接口


http {


#向fastcgi傳送請求的超時時間,這個值是指已經完成兩次握手後向fastcgi傳送請求的超時時間


fastcgi_send_timeout 240;


#指定鏈接到後端fastcgi的超時時間


fastcgi_connect_timeout 240;


#指定收fastcgi答應的超時時間,這個值是指已經完成兩次握手後接收fastcgi應答的超時時間、


fastcgi_read_timeout 240;


#指定讀取fastcgi應答第一部分需要用多大的緩衝區,這個值表示將使用1個64kb的


fastcgi_buffer_size 64kb的緩衝區讀取應答的第一部分(應答頭),可以設置爲fastcgi_buffers選定的的緩衝區大小


fastcgi_buffers 64k;


#指定本地需要用多少和多大的緩衝區來緩衝fastcgi,如果一個php腳本所產生的頁面大小爲256kb,那麼會分配4個64kb的緩存區來緩存,如果頁面大於256kb,那麼大於256kb的部分會緩存到fastcgi_temp指定的路徑中,但是這並不是好方法,因爲內存中的數據處理速度大於硬盤,一般這個值應該爲站點中php所產生的頁面大小的中間值,如果站點大部分腳本產生的頁面大小爲256kb,那麼可以把這個值設置爲“816k ”464k“等


fastcgi_buffers 4 64k;


#建議設置爲fastcgi_buffer的兩倍,繁忙時段的buffer


fastcgi_busy_buffers_size 128k;


##在寫入fastcgi_temp_path時將用多大的數據庫,默認值是fastcgi_buffers的兩倍,設置上述數值小時負載上來時可能報 502 badgateway


fastcgi_temp_file_write_size 128k;


##表示開啓fastcgi緩存爲其指定一個名稱,開啓緩存非常有用,可以有效降低cpu的負載,並防止502錯誤


fastcgi_cache oldboy_nginx;


#用來指定應答代碼的緩存時間,實例中的值表示將2000和302應答緩存一個小時,要和fastcgi_cache配合使用


fastcgi_cache_valid 200 302 1h;


#將301應答緩存一天


fastcgi_cache_valic 301 1d;


#將其他應答緩存爲1分鐘


fastcgi_cache_valid any 1m;


##請求的數量


fastcgi_cache_min_uses 1;


#定義緩存的路徑


fastcgi_cache_path


13.配置nginx gzip壓縮功能(重要)


使用的模塊ngx_http_gzip_module(nginx)


mod_deflate模塊(apaceh)


常用的壓縮對象:純文本(js,css,html),對於圖片,視頻,FLASH什麼的不壓縮,gzip——types參數控制,因爲壓縮佔用cpu


對應參數的含義如下:


gzip on;


#開啓壓縮功能


gzip_min_length 1k;


#設置允許壓縮的頁面最小字節數,頁面字節數從header頭頂content-length中獲取,默認值0,不管頁面多大都進行壓縮,建議設置成大於1k,如果小於1k可能會越壓越大。


gzip_buffers 4 32k;


#壓縮緩衝區大小,表示申請4個單位爲32k的內存作爲壓縮結果流緩存,默認值是申請與原始數據大小相同的內存空間來存儲gzip壓縮結果。


gzip_http_version 1.1;


##壓縮版本擁有設置http協議版本


gzip_comp_level 9;


###壓縮比例,用來指定gzip壓縮比 1最小9最大 建議設置爲2.設置過大消耗cpu資源就多


gzip_types text/css test/xmlapplication/javascript;


##指定壓縮的類型,test/html類型總是會被壓縮


gzip_vary on;


##vary header支持,改選項可以讓前端的緩存服務器經過gzip壓縮的頁面,例如用squid緩存經過nginx壓縮的數據。


14.配置nginx expires緩存功能


對於圖片,css,js等元素更改的機會較少,特別是圖片,這時可以將圖片設置在瀏覽器本地緩存365天或更長


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


{


expires 3650d;


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


{


expires 30d;


}


expire功能優點


1expires可以降低網站購買的帶寬,節約成本


2同事提升用戶訪問體驗


3減輕服務端壓力


缺點:


被緩存的頁面或數據更新了,用戶看到的可能還是舊的內容,反而影響用戶體驗


解決辦法:


第一個縮短緩存時間,例如1天,不徹底,除非更新頻率大於1天


第二個對緩存的對象改名


a圖片,附件一般不會被用戶修改,如果用戶修改了,實際上也是更改文件名重新傳來而已


b網升級對於js,css元素,一般可以改名,把css,js,推送到cdn


15.nginx日誌相關優化與安全


1)配置日誌切割腳本並寫入計劃任務


cd /app/logs


mv www_access.log www_acess_$(date +%F –d-1day).log


/application/nginx/sbin/nginx –s reload


cat >>/var/spool/cron/root<<eof


00 00 * * * /bin/sh cut_nginx_log.sh>/dev/null2>&1


eof


2)不記錄不需要的訪問日誌


對於健康檢查或某些(圖片,js,css)日誌,一般不記錄日誌,因爲在統計pv時是按照頁面計算,而且日誌寫入頻繁會消耗磁盤IO降低服務器性能。


參數:access_log off;


1.  訪問日誌的權限設置


假設日誌目錄爲/app/logs,則授權


chown –R root.root /app/logs


chmod –R 700 /app/logs


16 nginx站點目錄及文件URL訪問控制(重要:防止惡意解析)


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


作用:禁止目錄下指定文件被訪問,或者禁止指定目錄下所有內容被訪問


最佳應用場景:集羣的共享存儲,本來就應該只是資源文件,禁止指定擴展名程序被執行,php,sh,pl


nginx下禁止訪問資源目錄下的php程序文件,配置方法如下:


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


{


deny all;


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


return 404;


2)nginx下配置禁止訪問.txt文件


location ~*\.(txt|doc)${


if (-f $request_filename){
###rewrite^^^^^


break;


}


location ~*\.(txt|doc)${


root /data/www;


deny all;


}


3)使用ngx_http_access_module限制ip訪問


17.配置nginx圖片及目錄防盜鏈


原理:是利用http referer日誌信息


當瀏覽器向web服務器發送請求的時候,一般會帶上referer,告訴服務器我從那個頁面鏈接過來的,服務器可以藉此獲得一下信息用於處理


location~*\.(jpg|gif|png|swf|flv|wma|asf|mp3|mmf|zip|rar)${


valid_referers none blocked *.etiantian.orgetiantian.org;


if ($invalid_referer){


rewrite ^/ http://www.xiaofeng886.org/img/nolink.jpg;


}


}


18.nginx錯誤頁面優雅顯示


參數:error_page 403 /403.html;


19 nginx 方爬蟲優化


20 使用tmpfs文件系統給/tmp


提高效率,部分程序切圖片操作臨時放到/tmp下,可以把tmp設置成內存文件系統,佔用內存空間的,就是從內存裏拿出一塊來當磁盤用


mount –t tmpfs –o size=16m tmpfs /tmp


21放DDos攻擊


1)控制單個ip的併發請求防止DOS攻擊


使用limit_conn_zone進行控制,控制單個IP或域名的訪問次數,限制連續訪問


者http標籤添加控制,可以添加多個


limit_conn_zone $binary_remote_addr zone=perip:10m;


limit_conn_zone $binary_name zone=perserver:10m;


server {


limit_conn perip 10;


limit_conn perserver 100;


2)限制單個的請求速率防止DOS的訪問速率


使用limit_req_zone進行控制,控制單個ip訪問速率


 


22爲web服務增加用戶身份驗證(適合內部機密網址)


nginx配置


location /phpmyadmin/{


auth_basic “oldboy training”;


auth_basic_user_file/application/nginx/conf/htpasswd;


}


創建密碼文件


htpasswd –cb /application/nginx/conf/htpasswdoldboy 123456


cat /application/nginx/conf/htpasswd


chmod 400 /application/nginx/conf/htpasswd


chown nginx /application/nginx/conf/htpasswd


23 讓nginx運行於監牢模式


創建普通用戶,將站點目錄以及nginx.conf放到普通用戶目錄,之後用/application/nginx/sbin/nginx –c


配置文件來啓服務


注意相關日誌所在路徑,指定pid,端口不能用80


useradd inca


cd /home/inca


mkdir conf www log


echo inca >www/index.html


error_log /home/inca/log/error.log


pid /home/inca/log/nginx.pid


指定站點目錄


日誌


端口不能用80


用普通用戶啓動


解決端口問題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章