原文出處:https://blog.csdn.net/david_xtd/article/details/16967837
譯者注:不知道其他開發(fā)者是否和我一樣,參與或者寫了很多Web項(xiàng)目,但是卻沒有真正的去完整的部署應(yīng)用,很多時(shí)候都是交給ops即運(yùn)維的同學(xué)幫忙來做。而作為一個(gè)有節(jié)操的開發(fā)者,我認(rèn)為了解一些服務(wù)器方面的知識(shí)是很有必要的,讀了這篇文章之后,自己對(duì)nginx也有了一個(gè)初步的認(rèn)識(shí),對(duì)自己很有幫助,不敢獨(dú)享,遂譯之。
如果你是一名Web開發(fā)人員,那么你很有可能聽過nginx(讀音聽起來像engine-x). Nginx是一款速度快,功能強(qiáng)大的http以及反向代理服務(wù)器,經(jīng)過簡(jiǎn)單的配置之后即可以用來托管頁面。
不幸的是,和很多其他系統(tǒng)管理工具一樣,相關(guān)的原理教程和配置說明文檔都很少。雖然官方提供了一個(gè)wiki,但是內(nèi)容多且復(fù)雜,卻沒有真正的介紹那些你可能真正需要的東西。在自己糾結(jié)這個(gè)wiki一段時(shí)間之后,我終于掌握了使用nginx的一些基礎(chǔ)知識(shí),并把它們?cè)谶@里與其他開發(fā)者分享出來,希望你們能夠更加快速的去掌握這些知識(shí)。
下面進(jìn)入正題。針對(duì)本教程,你需要一個(gè)VPS(虛擬主機(jī)),最好是剛剛建立的,這樣可以避免與先前的配置產(chǎn)生沖突。
初始化安裝
現(xiàn)在假設(shè)你已經(jīng)擁有一個(gè)運(yùn)行ubuntu的虛擬主機(jī)(比如說托管于 digital ocean),配置好登錄選項(xiàng)并更新好 apt 之后,運(yùn)行 apt-get install nginx 安裝nginx.在瀏覽器訪問你的IP地址,你會(huì)看到頁面顯示“welcome to ngnix”信息。OK,一切正常。
查找nginx目錄
在我們通過 apt 安裝完nginx后,它為我們提供了一個(gè)基本的結(jié)構(gòu),幫助我們迅速設(shè)置好配置文件。所有的nginx配置文件都在 /etc/nginx下(譯者注:Mac OS X環(huán)境下使用homebrew路徑與linux有區(qū)別,文章結(jié)尾部分提供mac下解決方案),輸入 cd 進(jìn)入該目錄。你需要添加新配置選項(xiàng)的地方位于 sites-enabled 文件夾。如果你打開這個(gè)文件夾,你會(huì)發(fā)現(xiàn)一個(gè)名為 default 的txt文檔,打開后你就會(huì)找到nginx的配置選項(xiàng)以及 “welcome to nginx"歡迎選項(xiàng)的代碼。接下來我們開始建立屬于我們自己的配置文件用于顯示一個(gè)頁面。在sites-enabled目錄下新建一個(gè)空白文件并命名為 test,用你自己喜歡的文本編輯器進(jìn)行編輯。
注意: 在該目錄下會(huì)發(fā)現(xiàn)一個(gè)
/etc/nginx/sites-available的文件夾。這個(gè)文件夾一般在你需要建立和管理多個(gè)站點(diǎn)的時(shí)候非常有用,可以幫助你更好的組織不同的項(xiàng)目。你需要在這里添加你的nginx配置文案并將他們鏈接至sites-enabled目錄下。命令如下:
ln -s /etc/nginx/sites-available/dotcom /etc/nginx/sites-enabled/dotcom
只有在 sites-enabled 目錄下的配置文件才能夠真正被用戶訪問。但是你同樣可以將文件放在 sites-available 目錄下用來存檔或者生成鏈接。
配置靜態(tài)服務(wù)器
Nginx配置文件有自己的格式,好消息是文件的格式相當(dāng)簡(jiǎn)單,看起來特別像CSS文件,先指定變量名,然后在花括號(hào)內(nèi)編寫指令。最頂層是 server ,代碼為:
server {
}
在花括號(hào)內(nèi),我們?nèi)匀豢梢韵駮鴮慍SS一樣,鍵值對(duì)后接分號(hào),或者說更像sass的語法,并添加嵌套代碼塊。后面兩種風(fēng)格的代碼我們都會(huì)用到,也很容易理解。
這里可以添加的鍵值對(duì)和代碼塊(在本教程的后面我們把它稱為指令)有很多種,你可以轉(zhuǎn)到官方文檔去具體查看。對(duì)于基本的服務(wù)器設(shè)置其實(shí)只用掌握一些重要的指令即可。我會(huì)給后面的每個(gè)指令鏈接官方的ngnix文檔。官方文檔是你深入理解nginx的唯一渠道,因此你必須掌握如何更好的去使用它。
聲明服務(wù)器監(jiān)聽的端口號(hào)。如果你了解rails,你一定知道本地服務(wù)器的默認(rèn)端口是3000. Roots運(yùn)行在1111端口。SSL在443端口。互聯(lián)網(wǎng)的默認(rèn)端口是80,因此在url中未定義端口的話一般默認(rèn)為80。因?yàn)槟愫苡锌赡苁侨ミ\(yùn)行一個(gè)線上的服務(wù)器,因此最好定義成80端口。代碼如下:
server {
listen 80;
}
注意默認(rèn)端口嚴(yán)格來講不是必要的,但是為了能夠保證你對(duì)整個(gè)流程足夠了解最好加上。完成了第一步,我們進(jìn)入下一步server_name.
server_name主要用來匹配url地址。任意請(qǐng)求通過nginx時(shí),它會(huì)查看url并尋找 server_name 片段。如果你的站點(diǎn)地址為 http://xvfeng.me, 那么你的 server_name 應(yīng)當(dāng)也為 xvfeng.me . 如果你在域名解析時(shí)使用了A記錄并通過服務(wù)器指向 http://snargles.com , 你可以添加另外一個(gè) server 代碼,將 server_name 指向 snargles.com, 這段代碼就會(huì)匹配來自于這個(gè)域名的請(qǐng)求。
這個(gè)特性非常強(qiáng)大。這意味著你可以在單個(gè)nginx配置文件里托管無數(shù)個(gè)站點(diǎn),甚至包括不同域名的網(wǎng)站。你需要做的只是將設(shè)置A記錄并指向虛擬機(jī)所在的IP, 之后設(shè)置其他的nginx服務(wù)器配置。
針對(duì) server_name 還有兩點(diǎn)值得關(guān)注。首先是你可以設(shè)置子域名。如果你想匹配http://test.example.com ,設(shè)置相當(dāng)簡(jiǎn)單,甚至還可以指向一個(gè)完全不同的應(yīng)用。第二點(diǎn),你可以使用通配符, 即 * 或者正則來匹配路由。這個(gè)功能絕對(duì)強(qiáng)大。下面我們簡(jiǎn)單的配置一下server_name到example.com .
server {
listen 80;
server_name example.com;
}
Nice.接下來再加一些配置就可以讓服務(wù)器運(yùn)轉(zhuǎn)了。
這個(gè)是托管靜態(tài)站點(diǎn)最關(guān)鍵的部分。如果你只是想用它來托管一些html和css文件,root部分要定義的就是這些文件存放的路徑。我喜歡把文件放在 /var/www 目錄下,因此我們?cè)谶@里建立一個(gè)文件夾。使用 mkdir 創(chuàng)建 /var/www/example 目錄,建立一個(gè)空白的 index.html 文件,隨便添加一些段落輸出hello world之類的內(nèi)容。代碼如下:
server {
listen 80;
server_name example.com;
root /var/www/example;
}
基本變量設(shè)置完畢,下一步配置路由。
Location接受兩個(gè)參數(shù),一個(gè)字符串或者正則和一段代碼。字符串或者正則用于匹配某個(gè)特定目錄。如果你想讓用戶在訪問 example.com/whaterver 時(shí)訪問某個(gè)特定頁面,你需要將 whatever 設(shè)置為uri地址。在這里我們只需要訪問root目錄,因此只需要加上 / 即可,內(nèi)容暫時(shí)為空,后面再做解釋。
server {
listen 80;
server_name example.com;
root /var/www/example;
location / {
}
}
第一參數(shù)可以有很多種寫法,你可以參考上面給出的鏈接。在以上區(qū)塊內(nèi),我們需要路由指向結(jié)果頁面。注意 / 會(huì)匹配所有的url地址,因?yàn)樵谶@里它被解釋為一個(gè)正則。如果你只想匹配某個(gè)準(zhǔn)確的字符串,只需要在前面加上一個(gè)等號(hào),寫法如下:
location = / { ... }
現(xiàn)在我們需要完成之前的代碼。我們可以在區(qū)塊內(nèi)添加另外一段指令,用于加載名為 try_files 的文件。Try fiels接受了一組文件名或者正則,用于在根目錄下查找,并會(huì)加載查找到的第一個(gè)結(jié)果。對(duì)于我們的靜態(tài)服務(wù)器來講,我們希望找到一個(gè)在 / 之后緊跟著whatever的文件,例如 whatever.html. 如果在斜線后面沒有任何內(nèi)容,則會(huì)尋找 index.html. 在上面給出的文檔鏈接中你可以找到更多的關(guān)于如何設(shè)置該選項(xiàng)的吸納關(guān)系介紹,這里我們只寫一些簡(jiǎn)單的配置:
server {
listen 80;
server_name example.com;
root /var/www/example;
location / {
try_files $uri $uri/ /index.html;
}
}
你可能會(huì)奇怪上面的 $url 是從哪里來的?其實(shí)是nginx所提供的。每次有請(qǐng)求時(shí),nginx會(huì)生成一系列變量,這些變量存儲(chǔ)了請(qǐng)求的相關(guān)信息。這里的uri就是我們將要了解的內(nèi)容之一。
- 來自
http://example.com的請(qǐng)求進(jìn)入。 - nginx找到server片段代碼,其中
server_name為example.com,并使用它來處理請(qǐng)求 - nginx匹配任意請(qǐng)求。因?yàn)檫@里的
/會(huì)匹配根域名下的任意內(nèi)容。 - 在匹配到的location代碼中,nginx開始試圖加載一個(gè)文件。首先尋找一個(gè)未命名的文件,因?yàn)檫@里的uri匹配的就是沒有名稱的文件,所以無法找到。接著開始查找未命名的目錄,結(jié)果還是找不到。最后開始查找并加載根目錄下
/index.html。
接下來想象一下如果你添加一個(gè)名為 test.html 的文件到根目錄下并訪問 http://example.com/test.html.自己試一下你就知道了。
你可以任意的去嘗試改變這里的配置環(huán)境。例如,在carrot.is這個(gè)網(wǎng)站里,但用戶訪問某個(gè)文件并且沒有加上 .html 后綴時(shí),try_files同樣會(huì)查找 $uri.html 并匹配相應(yīng)結(jié)果。因此在你訪問http://carrot.is.about 和 http://carrot.is/about.html 時(shí)你會(huì)得到相同的文件。你可以充分發(fā)揮你的想象力去設(shè)置你的配置文件。
啟動(dòng)服務(wù)
總結(jié)一下我們所做的事情。首先添加了 server 選項(xiàng),在nginx運(yùn)行時(shí),會(huì)查找 /etc/sites-enabled 目錄下的所有配置文件用于顯示對(duì)應(yīng)內(nèi)容。但是請(qǐng)等一下,你可能無法馬上得到結(jié)果-因?yàn)閚ginx并不知道你所作的這些改動(dòng)。為了讓nginx真正讀取新配置文件,你需要重啟服務(wù)器,運(yùn)行以下命令:
service nginx reload
注意:這里的
service命令實(shí)際上是調(diào)用了配置文件里內(nèi)容,這些都在使用apt時(shí)被生成。這里調(diào)用的實(shí)際上是/etc/init.d/nginx reload.
接下來就是訪問服務(wù)器IP地址便可得到你想要的頁面