運維面試篇-----3.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
用普通使用者啟動
解決埠問題