Nginx提升學習架構總結

1.選擇nginx的理由

(1)支持高併發;(官方5w併發,實測3w併發,因爲採用epoll網絡IO模型)

(2)內存消耗少;(nginx+php-fcgi在3w併發下開啓10個nginx進程,消耗150mb內存,64個nginx進程消耗內存1280mb)

(3)成本低廉;(開源免費,可用於商業,相對硬件f5成本低)

(4)節省帶寬;

(5)穩定高;

(6)內置健康檢查功能;

(7)支持反向代理;

(8)支持負載均衡;(應用層)


2.網絡IO連接方法

分2種:阻塞IO(block IO)和多路複用IO(現在服務器多用);

阻塞IO:一個請求過來,只能幹這個事情,別的事情不能幹;(如同學來找你,告訴他你的地址,且在宿舍門口等,在這個過程中,一直等待,直到同學找到你,期間你不能做任何事情)

多路複用IO:包含select和epoll模型;(select模型舉例如同學來找你,告訴你同學地址並在宿舍等,同學來到宿舍門口還是找不到你,就找樓管,樓管挨個宿舍去找,效率很慢;epoll模型舉例如同學來找你,告訴你同學地址並在宿舍等,同學來到宿舍門口還是找不到你,就找樓管,樓管處有人員登記數據庫,查看登記名冊,告訴你同學在哪層樓多少號房間,這樣就快速找到你了)


3.nginx虛擬主機及相關配置

(1)nginx配置文件結構圖

......

event{

......

}


http{

......

 server{

   ......

 }

 server{

   ......

 }

}


(2)nginx虛擬主機

定義server,可以基於端口、ip、域名做虛擬主機。


(3)nginx匹配規則

location語法:location=[=|~|~*|^~]/uri/{...}

~  區分大小寫

~*  不區分大小寫

^~  禁止表達式匹配

=  精確匹配


舉例如:

location =/{

#只匹配/的查詢

}


location /{

#匹配任何以/開頭的查詢,但正則與一些較長字符串被首先匹配

#./document/index.html

}


location ^~ /images/{

#匹配任何以/images/開頭的查詢,且停止搜索,不檢查正則

#./images/1.gif

}


location ^* \.(gif|jpg|jpeg)${

#匹配任何以gif,jpg,jpeg結尾的文件,但所有/images/目錄的請求在上面處理,精確匹配

#./document/1.gif

}


解釋:url和uri

url:統一資源定位符,如http://www.onon.com/news/a10.html

uri:統一資源標示符,指具體的路徑,如news/a10.html


(4)自定義錯誤頁面

error_page 403 404 /40x.html;

location = /40x.html{

 root /var/web/error/;

}

解釋:server中定義,其中/40x.html前面的/是指定義server指定文件root的路徑。

另針對error指定專門存放路徑,如上面的“root /var/web/error/”,至此就可以將40x.html頁面放到改目錄下。


對於50x錯誤也同樣定義:

error_page 500 502 503 504 /50x.html

location = /50x.html{

 root /var/web/error/;

}


(5)自動索引及別名功能

location /onon{

root /web/html;

index index.html;

autoindex on;

}

解釋:將/web/html目錄下的文件索引顯示


location /over/{

alias /data/web3/images/toto/;

}

解釋:訪問/data/web3/images/toto/top.jpg文件時,可以使用/over/top.jpg訪問


(6)控制站點訪問

location /onon{

root /web/html;

index index.html;

autoindex on;

deny 192.168.0.110;

allow 192.168.0.0/24;

allow 192.168.1.12;

deny all;

}


(7)目錄身份驗證

/usr/local/apache/bin/htpasswd -c /home/nginx/conf/authdb webadmin

nginx auth_basic認證採用apache兼容的密碼文件,創建webadmin用戶,輸入密碼即可。

當訪問/onon時就會提示輸入用戶名和密碼。


location /onon{

root /web/html;

index index.html;

autoindex on;

auth_basic "Enter your user and password";

auth_basic_user_file /home/nginx/conf/authdb;

deny 192.168.0.110;

allow 192.168.0.0/24;

allow 192.168.1.12;

deny all;

}


(8)nginx狀態檢查

location /nginx_status{

 stub_status on;

 access_log off;

}

解釋:不需要開啓訪問日誌access_log;訪問目錄/nginx_status添加認證,見上;編譯的時候需要添加此模塊:--with-http_stub_status_module


(9)nginx rewrite

編譯時需要添加pcre庫,prel兼容正則表達式;

nginx rewrite是實現url/uri重寫;

語法指令:set、if、return、break、rewrite

語法規則:

=和!=

~  區分大小寫

~*  不區分大小寫

!~和!~*

-f和!-f   判斷文件是否存在

-d和!-d   判斷目錄是否存在

-e和!-e   判斷文件或目錄是否存在

-x和!-x   判斷文件是否可以執行

$1 - $9 位置化參數


全局變量(系統已定義好)

$arg_PARAMETER#這個變量包含GET請求中,如果有變量PARAMETER時的值。

$args    #這個變量等於請求行中(GET請求)的參數,例如foo=123&bar=blahblah;

$binary_remote_addr#二進制的客戶地址。

$body_bytes_sent#響應時送出的body字節數數量。即使連接中斷,這個數據也是精確的。

$content_length#請求頭中的Content-length字段。

$content_type#請求頭中的Content-Type字段。

$cookie_COOKIE#cookie COOKIE變量的值

$document_root#當前請求在root指令中指定的值。

$document_uri#與$uri相同。

$host#請求主機頭字段,否則爲服務器名稱。

$hostname#Set to the machine’s hostname as returned by gethostname

$http_HEADER

$is_args#如果有$args參數,這個變量等於”?”,否則等於”",空值。

$http_user_agent#客戶端agent信息

$http_cookie#客戶端cookie信息

$limit_rate#這個變量可以限制連接速率。

$query_string#與$args相同。

$request_body_file#客戶端請求主體信息的臨時文件名。

$request_method#客戶端請求的動作,通常爲GET或POST。

$remote_addr#客戶端的IP地址。

$remote_port#客戶端的端口。

$remote_user#已經經過Auth Basic Module驗證的用戶名。

$request_completion#如果請求結束,設置爲OK. 當請求未結束或如果該請求不是請求鏈串的最後一個時,爲空(Empty)。

$request_method#GET或POST

$request_filename#當前請求的文件路徑,由root或alias指令與URI請求生成。

$request_uri#包含請求參數的原始URI,不包含主機名,如:”/foo/bar.php?arg=baz”。不能修改。

$scheme#HTTP方法(如http,https)。

$server_protocol#請求使用的協議,通常是HTTP/1.0或HTTP/1.1。

$server_addr#服務器地址,在完成一次系統調用後可以確定這個值。

$server_name#服務器名稱。

$server_port#請求到達服務器的端口號。

$uri#不帶請求參數的當前URI,$uri不包含主機名,如”/foo/bar.html”。該值有可能和$request_uri 不一致。$request_uri是瀏覽器發過來的值。該值是rewrite後的值。例如做了internal redirects後。


if指令:

if($http_user_agent ~MSIE){

 rewrite ^(.*)$ /msie/$1 break;

}

解釋:$http_user_agent用戶代理,如瀏覽器ie,firefox等;

~區分大小寫,MSIE瀏覽器ie;

^以什麼開始,$以什麼結尾,.*匹配任意字符串;$1位置符,/msie/$1指的是web所指向的root路徑下

的/msie/$1,如/data/web3/images/toto/msie/index.html



return指令:

如果訪問url以“*.sh”或“*.bash”結尾,則返回狀態碼403

location ~.*\.(sh|bash)?$

{

 return 403;

}

解釋:“~”匹配大小寫,“.*”前面不管是什麼字符,“.(sh|bash)?$”以sh或bas,用$標識,“\”去掉其後面“.”的特殊意義的。403錯誤就是指error_page定義的錯誤。


rewrite指令:

最後一項參數flag標記,有以下:

last:完成rewrite,相當於apache的[L]標記,瀏覽器url地址不變;

break:本條規則匹配後就完成,終止匹配,瀏覽器url地址不變;


redirect:返回302臨時重定向,瀏覽器顯示跳轉後的url;

permanent:返回301永久重定向,瀏覽器顯示跳轉後的url;



案例:

1)將/bbs目錄重寫到/data

rewrite ^/bbs/?$ /data/ permanent;


location /data{

 index index.html;

}


location /bbs{

 rewrite ~/bbs/?$ /data/ permanent;

}


2)根據不同的瀏覽器將得到不同的結果

if($http_user_agent ~MSIE){

 rewrite ^(.*)$ /msie/$1 break;

}


server{

listen 80 default_server;

server_name www.onon.com;

index index.html;

root /data/www/onon;


if($http_user_agent ~Firefox){

 rewrite ^(.*)$ /firefox/$1 break;

}


if($http_user_agent ~MSIE){

 rewrite ^(.*)$ /msie/$1 break;

}


}


3)防止盜鏈

所謂防盜鏈就是別人網站的圖片引用我們的網站上的,且點擊別人網站上的那個圖片,使用的是我們網站的流量,只引用我們網站的圖片,不會跳轉到我們網站上來。

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

 valid_referers none blocked www.onon.com *.onon.com;

 if ($invalid_referer) {

   rewrite ^/(.*) http://www.onon.com/block.html;

 }

}


4)實現域名跳轉

訪問www.onon.com跳轉到www.onbing.com

server{

listen 80 default_server;

server_name www.onon.com;

index index.html;

root /data/www/onon;


location / {

 rewrite ~(.*)$ http://www.onbing.com$1 permanent;

}

}


5)URL rewrite和反向代理同時進行

location /news/ {

 proxy_pass http://10.0.0.10;

}


location /health/ {

 proxy_pass http://10.0.0.20;

}



(10)nginx日誌管理

語法如下:log_format name format (format ....)

自定義日誌格式如下:

log_format main '$remote_addr - $remote_user [$time_local] "$request"'

'$status $body_bytes_sent "$http_referer"';

'"$http_user_agent" "$http_x_forwarded_for"';


$http_x_forwarded_for 記錄遠程用戶真實ip地址,不是緩存/代理服務器地址;

$remote_user          記錄遠程客戶端用戶名稱,一般不會記錄的;

$time_local           記錄訪問時間及地區,記錄用戶訪問時的本地時間;

$request              記錄請求的URL與HTTP協議,具體訪問的頁面;

$status               記錄請求的狀態,第一次成功訪問狀態爲200,再次訪問頁面未更新狀態爲304,頁面找不到時爲404

$body_bytes_sent      記錄發送給客戶端的文件主體內容大小

$http_referer         記錄是從哪個頁面鏈接訪問過來的,如百度鏈接過來的;

$http_user_agent      記錄客戶端瀏覽器的相關信息


注意:上面定義的日誌格式,跟在access_log後面,error_log後面跟錯誤級別,如下:

access_log /data0/logs/nginx/www.onon.com-access.log main;

access_log /data0/logs/$server_name.log mylogformat buffer=32k;

解釋:main、mylogformat爲定義日誌格式時取名;$server_name爲自動獲取訪問地址,如www.onon.com,消耗資源;buffer=32k爲設置緩存區大小,只記錄日誌文件描述符。


error_log /data0/logs/nginx/www.onon.com-error.log warn;

解釋:warn爲錯誤級別,日誌等級有8個,分別爲:emerg、alert、crit、err、warn、notice、info、debug


開啓日誌緩存

每一條日誌記錄,日誌文件先打開文件,寫入日誌記錄,馬上關閉。

如何提高包含變量的日誌文件存放路徑性能?開啓open_log_file_cache

open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m;

解釋:max最大文件描述符數量,inactive設定時間內沒有使用此文件描述符,則自動刪除此描述符,


min_uses在inactive指定時間範圍內,若日誌文件超過被使用次數,則計入緩存,默認10秒,valid多長時間檢查一次,看日誌文件路徑和文件名是否仍然存在,默認60秒。


nginx日誌分割

vim /data/sh/nginxlog_cut.sh

#! /bin/bash

#nginx log 存放位置

logs_path="/data/logs/nglogcut/"

#將日誌改名

mkdir -p ${logs_path}$(date -d "yesterday" + "%Y")/$(date -d "yesterday" + "%m")/

mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" + "%Y")/$(date -d "yesterday" + "%m")/access_$(date -d "yesterday" + "%Y%m%d").log


重新加載nginx服務

service nginx reload


添加計劃任務

chmod +x /data/sh/nginxlog_cut.sh


#crontab -l

01 01 * * * /bin/bash /data/sh/nginxlog_cut.sh



(11)nginx壓縮輸出

在http{}中間啓用壓縮

模塊:HttpGzipModule和HttpGzipStaticModule

前者用於啓用在文件傳輸過程中使用gzip壓縮,而後者的作用是將一個文件以壓縮的方式傳遞到一個支持壓縮功能的客戶端之前,首先檢查是否已經存在相應的*.gz結尾的文件名格式,這樣避免重複壓縮而造成資源浪費。

對於nginx的網頁壓縮傳輸在nginx中的配置是將其分到兩種模式:一種是動態的,實時壓縮輸出(邊壓縮邊輸出),另一種是靜態的,找到同名文件的.gz格式文件就輸出。


啓用gzip功能需要zlib庫的支持,--with-http_gzip_module;

編譯時需要指定--with-http_gzip_static_module


gzip(GNU-ZIP)是一種壓縮技術。經過gzip壓縮後頁面大小可以變爲原來的30%甚至更小,這樣,用戶瀏覽頁面的時候速度會塊得多。gzip的壓縮頁面需要瀏覽器和服務器雙方都支持,實際上就是服務器端壓縮,傳到瀏覽器後瀏覽器解壓並解析。瀏覽器那裏不需要我們擔心,因爲目前的巨大多數瀏覽器都支持解析gzip過的頁面。


#vim nginx.conf

http{

gzip on;

gzip_min_length 1k;

gzip_buffer 4 16k;

gzip_http_version 1.1;

gzip_comp_level 2;

gzip_types text/plain application/x-javascript text/css application/xml;

gzip_vary on;

}

解釋:gzip on開啓gzip模塊,關閉使用off;

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

gzip_buffer設置系統獲取幾個單位的緩存用於存儲gzip的壓縮結果數據流。上面的設置爲以16k爲單位的4倍申請內存;

gzip_http_version識別http協議的版本,早期的瀏覽器不支持gzip壓縮,用戶會看到亂碼,所以爲了支持前期版本加了此選項,目前此項基本可以忽略;

gzip_comp_level爲gzip壓縮比,分1-9等級,1壓縮比最小處理速度最快,9壓縮比最大但處理速度最慢(傳輸快但比較消耗cpu);

gzip_types匹配mime類型進行壓縮,無論是否指定,”text/html”類型總是會被壓縮的;

gzip_vary和http頭有關係,加個vary頭,給代理服務器用的,有的瀏覽器支持壓縮,有的不支持,所以避免浪費不支持的也壓縮,所以根據客戶端的HTTP頭來判斷,是否需要壓縮;


(12)nginx的瀏覽器本地緩存設置

#vim nginx.conf

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

 expires 30d;

}


location ~.*\.(js|css|jsp)?${

 expires 1h;

}


(13)設定限速(常見流媒體)

location /download {

 limit_rate 256k;

 proxy_pass http://www.onbing.com;

 proxy_set_header Host $host;

 proxy_set_header X-Forwarded-For $remote_addr;

}


location /movie {

 limit_rate_after 10m;

 limit_rate 100k;

}

解釋:前10m不限速,之後限速爲100k。


if($http_user_agent ~Google|Yahoo|baidu){

 limit_rate 20k;

}

解釋:通過google,yahoo或baidu搜索引擎訪問進來的,限速爲20k。


(14)反向代理

正向代理和反向代理?正向就是一個從內向外的訪問,反向則是一個從外向內的訪問。正向和反向是一個相對的概念。

正向:典型應用爲在防火牆內的局域網客戶端提供訪問Internet的途徑;

     相對於用戶,就是正向代理,代理用戶去請求;

     讓nginx成爲正向代理,而將外網視爲整個後端在給我們提供服務。

反向:典型應用爲將防火牆後面的服務器提供給Internet用戶訪問;

     相對於內部的服務那麼nginx就是反向代理,代理接受用戶請求;

http {  

client_body_buffer_size 600;  

client_header_buffer_size 600;  

client_max_body_size 300M;  


proxy_buffering on;

proxy_cache_min_uses 3;  

proxy_ignore_client_abort off;  

proxy_intercept_errors on;  

proxy_next_upstream error timeout invalid_header;  

proxy_redirect off;  

proxy_connect_timeout 60;  


proxy_send_timeout 600;  

proxy_read_timeout 600;


proxy_buffer_size 256k;

proxy_buffers 4 256k;

proxy_busy_buffers_size 256k;

proxy_temp_file_write_size 256k;

proxy_temp_path /usr/local/nginx/proxy_temp;

proxy_cache_path /usr/local/nginx/proxy_cache/ levels=1:2

keys_zone=cache_onon:10m inactive=10m max_size=1000M;


location /weibo {

 proxy_pass http://192.168.10.213;

 proxy_set_header Host $host;

 proxy_cache cache_onon;

 proxy_set_header X-Forward-For $remote_addr;

}


location ~.*\.(gif|jpg|jpeg|png|bmp|swf|flv|js|css|html)${

 #狀態碼

 proxy_cache cache_onon;

 proxy_cache_valid 200 10m;

 proxy_cache_valid 304 1m;

 proxy_cache_valid 301 302 1h;

 proxy_cache_valid any 1m;

 #哈希key值

 proxy_cache_key $host$uri$is_args$args;

 proxy_set_header Host $host;

 proxy_set_header X-Forward-For $remote_addr;

 proxy_pass http://192.168.1.66;

}


}


(15)負載均衡

upstream news_server_pool{

 server 10.0.0.21:80 weight=1 max_fails=2 fail_timeout=30s;

 server 10.0.0.22:80 weight=1 max_fails=2 fail_timeout=30s;

}


upstream tv_server_pool{

 server 10.0.0.31:80 weight=1 max_fails=2 fail_timeout=30s;

 server 10.0.0.32:80 weight=2 max_fails=2 fail_timeout=30s;

}

解釋:30s內檢測2次,失效就找下一個服務器。


location /news {

 proxy_pass http://news_server_pool;

 proxy_set_header Host $host;

 proxy_set_header X-Forward-For $remote_addr;

}

location /tv {

 proxy_pass http://tv_server_pool;

 proxy_set_header Host $host;

 proxy_set_header X-Forward-For $remote_addr;

}

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