Nginx 詳細(xì)配置

原文出處: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的唯一渠道,因此你必須掌握如何更好的去使用它。

listen

聲明服務(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

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)了。

root

這個(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

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_nameexample.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.abouthttp://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地址便可得到你想要的頁面

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,551評(píng)論 19 139
  • 配置運(yùn)行Nginx服務(wù)器用戶(組) 用于配置運(yùn)行Nginx服務(wù)器用戶(組)的指令是user,其語法格式為: use...
    吃瓜的東閱讀 4,683評(píng)論 0 41
  • 本文所介紹的環(huán)境是:操作系統(tǒng):CenOS-7-x86_64環(huán)境:虛擬機(jī)Nginx 版本:1.6.3 一、Nginx...
    FlySheep_ly閱讀 9,083評(píng)論 1 40
  • ??本周學(xué)習(xí)了一些有關(guān)bash shell腳本的知識(shí),單純的去講理論不易于腳本知識(shí)的理解,這里為大家展示幾個(gè)腳本實(shí)...
    KingFighting閱讀 2,037評(píng)論 0 1
  • vb
    Piscine閱讀 293評(píng)論 0 0

友情鏈接更多精彩內(nèi)容