簡(jiǎn)介
nginx 的安裝:
#?CentOS yum?install?nginx; #?Ubuntu sudo?apt-get?install?nginx; #?Mac brew?install?nginx;
一般可以在/etc/nginx/nginx.conf中配置,啟動(dòng)參數(shù)為:
#?啟動(dòng) nginx?-s?start; #?重新啟動(dòng),熱啟動(dòng),修改配置重啟不影響線上 nginx?-s?reload; #?關(guān)閉 nginx?-s?stop; #?修改配置后,可以通過(guò)下面的命令測(cè)試是否有語(yǔ)法錯(cuò)誤 nginx?-t;
-s,signal,意思就是向 nginx 發(fā)送start|reload|stop命令,還是很好理解的。先看一個(gè)最簡(jiǎn)單的nginx.conf配置:
events?{ ????#?需要保留這一個(gè)段落,可以為空 } http?{ ????server?{ ????????listen?127.0.0.1:8888; ????????location?/?{ ????????????root?/home/chenya/test/; ????????} ????} }
啟動(dòng)后,訪問(wèn)htttp://127.0.0.1:8888,如果/home/chenya/test/下有index.html文件就會(huì)展示index.html的內(nèi)容,否則返回404。
Nginx 配置一個(gè) Web 服務(wù)器
以下對(duì)配置 Web 服務(wù)器的參數(shù)做簡(jiǎn)單說(shuō)明,包括如何配置端口、域名,如何處理請(qǐng)求,如何響應(yīng)請(qǐng)求。
1、 虛擬主機(jī)和請(qǐng)求的分發(fā)
域名和端口的配置
listen?127.0.0.1:8000; listen?*:8000; listen?localhost:8000; #?IPV6 listen?[::]:8000; #?other?params listen?443?default_serer?ssl; listen?127.0.0.1?default_server?accept_filter=dataready?backlog=1024
主機(jī)名配置
server_name?www.chenya.site??chenya.site server_name?*.chenya.com server_name?~^.chenya.com$
URI 匹配
location?=?/?{ ????#?完全匹配??= ????#?大小寫敏感?~ ????#?忽略大小寫?~* } location?^~?/images/?{ ????#?前半部分匹配?^~ ????#?可以使用正則,如: ????#?location?~*?.(gif|jpg|png)$?{?} } location?/?{ ????#?如果以上都未匹配,會(huì)進(jìn)入這里 }
2、 文件路徑的定義
根目錄設(shè)置
location?/?{ ????root?/home/chenya/test/; }
別名設(shè)置
location?/blog?{ ????alias?/home/chenya/www/blog/; } location?~?^/blog/(d+)/([w-]+)$?{ ????#?/blog/20141202/article-name? ????#?->?/blog/20141202-article-name.md ????alias?/home/chenya/www/blog/$1-$2.md; }
首頁(yè)設(shè)置
index?/html/index.html?/php/index.php;
重定向頁(yè)面設(shè)置
error_page????404?????????/404.html; error_page????502??503????/50x.html; error_page????404??=200???/1x1.gif; location?/?{ ????error_page??404?@fallback; } location?@fallback?{ ????#?將請(qǐng)求反向代理到上游服務(wù)器處理 ????proxy_pass?http://localhost:9000; }
try_files 設(shè)置
try_files?$uri?$uri.html?$uri/index.html?@other; location?@other?{ ????#?嘗試尋找匹配?uri?的文件,失敗了就會(huì)轉(zhuǎn)到上游處理 ????proxy_pass??http://localhost:9000; } location?/?{ ????#?嘗試尋找匹配?uri?的文件,沒(méi)找到直接返回?502 ????try_files?$uri?$uri.html?=502; }
Nginx 配置反向代理服務(wù)器
反向代理(reserve proxy)方式是指用代理服務(wù)器來(lái)接受 Internet 上的連接請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)中的上游服務(wù)器,并將上游服務(wù)器上得到的結(jié)果返回給 Internet 上請(qǐng)求連接的客戶端,此時(shí)代理服務(wù)器對(duì)外的表現(xiàn)就是一個(gè) Web 服務(wù)器。
Nginx 具備超強(qiáng)的高并發(fā)高負(fù)載能力,一般會(huì)作為前端的服務(wù)器直接向客戶端提供靜態(tài)文件服務(wù);而業(yè)務(wù)一般還包含一些業(yè)務(wù)邏輯需要 Apache、Tomcat 等服務(wù)器來(lái)處理,故通常 Nginx 對(duì)外表現(xiàn)即為靜態(tài) Web 服務(wù)器也是反向代理服務(wù)器。
缺點(diǎn)是增加了一次請(qǐng)求的處理時(shí)間,優(yōu)點(diǎn)是降低了上游服務(wù)器的負(fù)載,盡量將壓力放在 Nginx 服務(wù)器上。
1、負(fù)載均衡配置
upstream,定義一個(gè)上游服務(wù)器集群
upstream?backend?{ ????#?ip_hash; ????server?s1.chenya.com; ????server?s2.chenya.com; } server?{ ????location?/?{ ????????proxy_pass?http://backend; ????} }
2、反向代理
proxy_pass 將請(qǐng)求轉(zhuǎn)發(fā)到有處理能力的端上,默認(rèn)不會(huì)轉(zhuǎn)發(fā)請(qǐng)求中的 Host 頭部
location?/blog?{ ????prox_pass?http://localhost:9000; ????###?下面都是次要關(guān)注項(xiàng) ????proxy_set_header?Host?$host; ????proxy_method?POST; ????#?指定不轉(zhuǎn)發(fā)的頭部字段 ????proxy_hide_header?Cache-Control; ????proxy_hide_header?Other-Header; ????#?指定轉(zhuǎn)發(fā)的頭部字段 ????proxy_pass_header?Server-IP; ????proxy_pass_header?Server-Name; ????#?是否轉(zhuǎn)發(fā)包體 ????proxy_pass_request_body?on?|?off; ????#?是否轉(zhuǎn)發(fā)頭部 ????proxy_pass_request_headers?on?|?off; ????#?顯形/隱形?URI,上游發(fā)生重定向時(shí),Nginx?是否同步更改?uri ????proxy_redirect?on?|?off; }
一個(gè)簡(jiǎn)單的例子,Node.js
一個(gè)十分常見(jiàn)的需求:處理請(qǐng)求,如果是靜態(tài)文件,Nginx 直接返回,否則交給 Node 服務(wù)器處理。首先創(chuàng)建了一個(gè) Node 服務(wù)器:
const?http?=?require('http'); http.createServer((req,?res)?=>?{ ????res.end('hello?world'); }).listen(9000);
任何請(qǐng)求過(guò)來(lái)都返回hello world,簡(jiǎn)版的 Nginx 配置如下,
events?{ ????#?這里可不寫東西 ????use?epoll; } http?{ ????server?{ ????????listen?127.0.0.1:8888; ????????#?如果請(qǐng)求路徑跟文件路徑按照如下方式匹配找到了,直接返回 ????????try_files?$uri?$uri/index.html; ????????location?~*?^/(js|css|image|font)/$?{ ????????????#?靜態(tài)資源都在?static?文件夾下 ????????????root?/home/chenya/www/static/; ????????} ????????location?/app?{ ????????????#?Node.js?在?9000?開了一個(gè)監(jiān)聽(tīng)端口 ????????????proxy_pass?http://127.0.0.1:9000; ????????} ????????#?上面處理出錯(cuò)或者未找到的,返回對(duì)應(yīng)狀態(tài)碼文件 ????????error_page????404????????????/404.html; ????????error_page????502??503??504??/50x.html; ????} }
首先 try_files,嘗試直接匹配文件;沒(méi)找到就匹配靜態(tài)資源;還沒(méi)找到就交給 Node 處理;否則就返回 4xx/5xx 的狀態(tài)碼。
測(cè)試語(yǔ)法
nginx?-t