原文出處:https://blog.csdn.net/david_xtd/article/details/16967837
譯者注:不知道其他開發(fā)者是否和我一樣菱阵,參與或者寫了很多Web項目疑苔,但是卻沒有真正的去完整的部署應用立哑,很多時候都是交給ops即運維的同學幫忙來做。而作為一個有節(jié)操的開發(fā)者来候,我認為了解一些服務器方面的知識是很有必要的,讀了這篇文章之后,自己對nginx也有了一個初步的認識蛔溃,對自己很有幫助,不敢獨享篱蝇,遂譯之贺待。
如果你是一名Web開發(fā)人員,那么你很有可能聽過nginx(讀音聽起來像engine-x). Nginx是一款速度快零截,功能強大的http以及反向代理服務器麸塞,經(jīng)過簡單的配置之后即可以用來托管頁面。
不幸的是涧衙,和很多其他系統(tǒng)管理工具一樣哪工,相關(guān)的原理教程和配置說明文檔都很少。雖然官方提供了一個wiki,但是內(nèi)容多且復雜弧哎,卻沒有真正的介紹那些你可能真正需要的東西雁比。在自己糾結(jié)這個wiki一段時間之后,我終于掌握了使用nginx的一些基礎(chǔ)知識撤嫩,并把它們在這里與其他開發(fā)者分享出來章贞,希望你們能夠更加快速的去掌握這些知識。
下面進入正題。針對本教程鸭限,你需要一個VPS(虛擬主機)蜕径,最好是剛剛建立的,這樣可以避免與先前的配置產(chǎn)生沖突败京。
初始化安裝
現(xiàn)在假設(shè)你已經(jīng)擁有一個運行ubuntu的虛擬主機(比如說托管于 digital ocean),配置好登錄選項并更新好 apt
之后兜喻,運行 apt-get install nginx
安裝nginx.在瀏覽器訪問你的IP地址,你會看到頁面顯示“welcome to ngnix”信息赡麦。OK,一切正常朴皆。
查找nginx目錄
在我們通過 apt
安裝完nginx后,它為我們提供了一個基本的結(jié)構(gòu)泛粹,幫助我們迅速設(shè)置好配置文件遂铡。所有的nginx配置文件都在 /etc/nginx
下(譯者注:Mac OS X環(huán)境下使用homebrew路徑與linux有區(qū)別,文章結(jié)尾部分提供mac下解決方案)晶姊,輸入 cd
進入該目錄扒接。你需要添加新配置選項的地方位于 sites-enabled
文件夾。如果你打開這個文件夾们衙,你會發(fā)現(xiàn)一個名為 default
的txt文檔钾怔,打開后你就會找到nginx的配置選項以及 “welcome to nginx"歡迎選項的代碼。接下來我們開始建立屬于我們自己的配置文件用于顯示一個頁面蒙挑。在sites-enabled目錄下新建一個空白文件并命名為 test
,用你自己喜歡的文本編輯器進行編輯宗侦。
注意: 在該目錄下會發(fā)現(xiàn)一個
/etc/nginx/sites-available
的文件夾。這個文件夾一般在你需要建立和管理多個站點的時候非常有用忆蚀,可以幫助你更好的組織不同的項目矾利。你需要在這里添加你的nginx配置文案并將他們鏈接至sites-enabled
目錄下。命令如下:
ln -s /etc/nginx/sites-available/dotcom /etc/nginx/sites-enabled/dotcom
只有在 sites-enabled
目錄下的配置文件才能夠真正被用戶訪問馋袜。但是你同樣可以將文件放在 sites-available
目錄下用來存檔或者生成鏈接男旗。
配置靜態(tài)服務器
Nginx配置文件有自己的格式,好消息是文件的格式相當簡單桃焕,看起來特別像CSS文件剑肯,先指定變量名,然后在花括號內(nèi)編寫指令观堂。最頂層是 server
,代碼為:
server {
}
在花括號內(nèi)让网,我們?nèi)匀豢梢韵駮鴮慍SS一樣,鍵值對后接分號师痕,或者說更像sass的語法溃睹,并添加嵌套代碼塊。后面兩種風格的代碼我們都會用到胰坟,也很容易理解因篇。
這里可以添加的鍵值對和代碼塊(在本教程的后面我們把它稱為指令)有很多種,你可以轉(zhuǎn)到官方文檔去具體查看。對于基本的服務器設(shè)置其實只用掌握一些重要的指令即可竞滓。我會給后面的每個指令鏈接官方的ngnix文檔咐吼。官方文檔是你深入理解nginx的唯一渠道,因此你必須掌握如何更好的去使用它商佑。
聲明服務器監(jiān)聽的端口號锯茄。如果你了解rails,你一定知道本地服務器的默認端口是3000. Roots運行在1111端口。SSL在443端口茶没〖∮模互聯(lián)網(wǎng)的默認端口是80,因此在url中未定義端口的話一般默認為80抓半。因為你很有可能是去運行一個線上的服務器喂急,因此最好定義成80端口。代碼如下:
server {
listen 80;
}
注意默認端口嚴格來講不是必要的笛求,但是為了能夠保證你對整個流程足夠了解最好加上廊移。完成了第一步,我們進入下一步server_name.
server_name主要用來匹配url地址涣易。任意請求通過nginx時画机,它會查看url并尋找 server_name
片段冶伞。如果你的站點地址為 http://xvfeng.me
, 那么你的 server_name
應當也為 xvfeng.me
. 如果你在域名解析時使用了A記錄并通過服務器指向 http://snargles.com
, 你可以添加另外一個 server
代碼新症,將 server_name
指向 snargles.com
, 這段代碼就會匹配來自于這個域名的請求。
這個特性非常強大响禽。這意味著你可以在單個nginx配置文件里托管無數(shù)個站點徒爹,甚至包括不同域名的網(wǎng)站。你需要做的只是將設(shè)置A記錄并指向虛擬機所在的IP, 之后設(shè)置其他的nginx服務器配置芋类。
針對 server_name
還有兩點值得關(guān)注隆嗅。首先是你可以設(shè)置子域名。如果你想匹配http://test.example.com
,設(shè)置相當簡單侯繁,甚至還可以指向一個完全不同的應用胖喳。第二點,你可以使用通配符, 即 *
或者正則來匹配路由贮竟。這個功能絕對強大丽焊。下面我們簡單的配置一下server_name到example.com
.
server {
listen 80;
server_name example.com;
}
Nice.接下來再加一些配置就可以讓服務器運轉(zhuǎn)了。
這個是托管靜態(tài)站點最關(guān)鍵的部分咕别。如果你只是想用它來托管一些html和css文件技健,root部分要定義的就是這些文件存放的路徑。我喜歡把文件放在 /var/www
目錄下惰拱,因此我們在這里建立一個文件夾雌贱。使用 mkdir
創(chuàng)建 /var/www/example
目錄,建立一個空白的 index.html
文件,隨便添加一些段落輸出hello world之類的內(nèi)容。代碼如下:
server {
listen 80;
server_name example.com;
root /var/www/example;
}
基本變量設(shè)置完畢欣孤,下一步配置路由馋没。
Location接受兩個參數(shù),一個字符串或者正則和一段代碼降传。字符串或者正則用于匹配某個特定目錄披泪。如果你想讓用戶在訪問 example.com/whaterver
時訪問某個特定頁面,你需要將 whatever
設(shè)置為uri地址搬瑰。在這里我們只需要訪問root目錄款票,因此只需要加上 /
即可,內(nèi)容暫時為空泽论,后面再做解釋艾少。
server {
listen 80;
server_name example.com;
root /var/www/example;
location / {
}
}
第一參數(shù)可以有很多種寫法,你可以參考上面給出的鏈接翼悴。在以上區(qū)塊內(nèi)缚够,我們需要路由指向結(jié)果頁面。注意 /
會匹配所有的url地址鹦赎,因為在這里它被解釋為一個正則谍椅。如果你只想匹配某個準確的字符串,只需要在前面加上一個等號古话,寫法如下:
location = / { ... }
現(xiàn)在我們需要完成之前的代碼雏吭。我們可以在區(qū)塊內(nèi)添加另外一段指令,用于加載名為 try_files
的文件陪踩。Try fiels接受了一組文件名或者正則杖们,用于在根目錄下查找,并會加載查找到的第一個結(jié)果肩狂。對于我們的靜態(tài)服務器來講摘完,我們希望找到一個在 /
之后緊跟著whatever的文件,例如 whatever.html
. 如果在斜線后面沒有任何內(nèi)容傻谁,則會尋找 index.html
. 在上面給出的文檔鏈接中你可以找到更多的關(guān)于如何設(shè)置該選項的吸納關(guān)系介紹孝治,這里我們只寫一些簡單的配置:
server {
listen 80;
server_name example.com;
root /var/www/example;
location / {
try_files $uri $uri/ /index.html;
}
}
你可能會奇怪上面的 $url
是從哪里來的?其實是nginx所提供的审磁。每次有請求時谈飒,nginx會生成一系列變量,這些變量存儲了請求的相關(guān)信息力图。這里的uri就是我們將要了解的內(nèi)容之一步绸。
- 來自
http://example.com
的請求進入。 - nginx找到server片段代碼吃媒,其中
server_name
為example.com
瓤介,并使用它來處理請求 - nginx匹配任意請求吕喘。因為這里的
/
會匹配根域名下的任意內(nèi)容。 - 在匹配到的location代碼中刑桑,nginx開始試圖加載一個文件氯质。首先尋找一個未命名的文件,因為這里的uri匹配的就是沒有名稱的文件祠斧,所以無法找到闻察。接著開始查找未命名的目錄,結(jié)果還是找不到琢锋。最后開始查找并加載根目錄下
/index.html
辕漂。
接下來想象一下如果你添加一個名為 test.html
的文件到根目錄下并訪問 http://example.com/test.html
.自己試一下你就知道了。
你可以任意的去嘗試改變這里的配置環(huán)境吴超。例如钉嘹,在carrot.is這個網(wǎng)站里,但用戶訪問某個文件并且沒有加上 .html
后綴時鲸阻,try_files同樣會查找 $uri.html
并匹配相應結(jié)果跋涣。因此在你訪問http://carrot.is.about
和 http://carrot.is/about.html
時你會得到相同的文件。你可以充分發(fā)揮你的想象力去設(shè)置你的配置文件鸟悴。
啟動服務
總結(jié)一下我們所做的事情陈辱。首先添加了 server
選項,在nginx運行時细诸,會查找 /etc/sites-enabled
目錄下的所有配置文件用于顯示對應內(nèi)容沛贪。但是請等一下,你可能無法馬上得到結(jié)果-因為nginx并不知道你所作的這些改動揍堰。為了讓nginx真正讀取新配置文件鹏浅,你需要重啟服務器嗅义,運行以下命令:
service nginx reload
注意:這里的
service
命令實際上是調(diào)用了配置文件里內(nèi)容屏歹,這些都在使用apt
時被生成。這里調(diào)用的實際上是/etc/init.d/nginx reload
.
接下來就是訪問服務器IP地址便可得到你想要的頁面