天天看點

nginx 基本入門

作者:villainthr

本文屬于翻譯文章,原文連結為 nginx Beginner’s Guide。是至今為止見過最好的 nginx 入門文章。額。。。沒有之一。

這篇教程簡單介紹了 nginx 并且講解了一些 nginx 可以解決的簡單任務。這裡,我們假設 nginx 已經安裝在讀者的機器上。如果沒有,可以看一下如何安裝 nginx。這篇教程主要講解的是如何啟用和停止nginx,和重新加載配置,描述配置檔案的基本結構和怎樣搭建一個 nginx 靜态輔助器,怎樣配置 nginx 作為一個代理伺服器來。

nginx 有一個主程序和其他子程序。主程序的主要工作是加載和執行配置檔案,并且駐留子程序。子程序用來作為實際的請求處理。nginx 采取基于事件的模型和 OS 依賴的機制,在多個子程序之間高效的配置設定請求。子程序的個數會直接寫在配置檔案中并且,對于給定的配置可以是固定的,或者根據可用的 CPU 核數自動的進行調整(參考 子程序)。

nginx 和它子產品的工作方式是在配置檔案中寫好的。預設情況下,這個配置檔案通常命名為 <code>nginx.conf</code> 并且會放置在 <code>/usr/local/nginx/conf</code>,<code>/etc/nginx</code>,或者 <code>/usr/local/etc/nginx</code>。

運作可執行檔案就可以開啟 nginx,比如:

如果,nginx 已經開啟,那麼它就可以通過使用 <code>-s</code> 參數的可執行指令控制。使用下列格式:

signal 可以為下列指令之一:

stop — 直接關閉 nginx

quit — 會在處理完目前正在的請求後退出,也叫優雅關閉

reload — 重新加載配置檔案,相當于重新開機

reopen — 重新打開日志檔案

比如,等待目前子程序處理完正在執行的請求後,結束 nginx 程序,可以使用下列指令:

執行該指令的使用者需要和啟動的 nginx 的使用者一緻。

如果重載配置檔案的指令沒有傳遞給 nginx 或者 nginx 沒有重新開機,那麼配置檔案的改動是不會被使用的。重載配置檔案的指令可以使用:

一旦主程序接收到重載配置檔案的指令後,它會先檢查配置檔案文法的合法性,如果沒有錯誤,則會重新加載配置檔案。如果成功,則主程序會重新建立一個子程序并且發送關閉請求給以前的子程序。如果沒有成功,主程序會復原改動并且繼續使用以前的配置。老的子程序在接受關閉的指令後,會停止接受新的請求并且繼續處理目前的請求,直到處理完畢。之後,該子程序就直接退出了。

在 Unix 工具的幫助下,比如使用 kill 工具,該信号會被發送給 nginx 程序。在這種情況下,信号會被直接發送給帶有程序 ID 的程序。nginx 的主程序的程序 ID 是寫死在 nginx.pid 檔案中的。該檔案通常放在 <code>/usr/local/nginx/logs</code> 或者 <code>/var/run</code>目錄下。比如,如果主程序的 ID 是 1628,為了發送 <code>QUIT</code> 信号來使 nginx 優雅退出,可以執行:

為了得到所有正在運作的 nginx 程序,我們可能會使用到 ps 工具,比如,像下列的方式:

更多關于發送信号給 nginx,可以參考 nginx 控制。

nginx 是由一些子產品組成,我們一般在配置檔案中使用一些具體的指令來控制它們。指令被分為簡單指令和塊級指令。一個簡單的指令是由名字和參數組成,中間用空格分開,并以分号結尾。例如:

塊級指令和簡單指令一樣有着類似的結構,但是末尾不是分号而是用 <code>{</code> 和 <code>}</code> 大括号包裹的額外指令集。如果一個塊級指令的大括号裡有其他指令,則它被叫做一個上下文(比如:events,http,server,和 location)。

在配置檔案中,沒有放在任何上下文中的指令都是處在主上下文中。<code>events</code> 和 <code>http</code> 的指令是放在主上下文中,<code>server</code> 放在 <code>http</code> 中, <code>location</code> 放在 <code>server</code> 中。

以 <code>#</code> 開頭的行,會被當做注釋。

一個重要的網絡伺服器的任務是處理檔案(比如圖檔或者靜态 HTML 檔案)。這裡,你會實踐一個例子,檔案會從不同的目錄中映射(取決于請求):<code>/data/www</code>(放置 HTML 檔案)和 <code>/data/images</code>(放置圖檔)。這需要配置一下檔案,将帶有兩個 <code>location</code> 的指令的 <code>server</code> 的塊級指令放在 <code>server</code> 指令中。

首先,建立一個 <code>/data/www</code> 目錄,然後放置一個事先寫好内容的 index.html 檔案。接着,建立一個 <code>/data/images</code> 目錄,然後放置一些圖檔。

下一步,打開配置檔案。預設的配置檔案已經包含了一些關于 <code>server</code> 指令的樣式,大多數情況下直接把他們給注釋掉。現在,注釋掉其他的區塊,然後寫一個新的 <code>server</code> 區塊:

通常,該配置檔案可能會包含多個 <code>server</code> 指令。這些 <code>server</code> 指令監聽不同的端口和伺服器名。一旦 nginx 決定哪個服務程序處理請求,它會根據在 server 塊級指令中定義好的 <code>location</code> 指令的參數,來比對請求頭中指定的 URI。

将下列 location 指令添加到 server 指令中:

該 <code>location</code> 指令相對于請求中的 URI 執行了 “/” 的字首。為了比對請求,URI 會被添加到 <code>root</code> 指令指定的路徑後,即 <code>/data/www</code>,得到本地檔案系統中請求檔案的路徑。如果,有幾個 <code>location</code> 比對到,那麼 nginx 會選擇最長的字首。上面的 <code>location</code> 提供了長度為 1 的字首,是以,僅當其他的 <code>location</code> 比對失敗後,該指令才會使用。

接着,添加第二個 <code>location</code> 區塊:

它會比對到以 <code>/images/</code> 開頭的請求(<code>location /</code> 也會比對到該請求,隻是字首更短)

<code>server</code> 塊級指令的配置結果如下:

這已經是一個可用的伺服器配置,它監聽标準的 80 端口并且可以在本地上通過 <code>http://localhost/</code> 通路。對于 URI 以 <code>/images/</code> 開頭的請求,伺服器會從 <code>/data/images</code> 目錄中,傳回對應的檔案。例如,nginx 會傳回 <code>/data/images/example.png</code> 檔案,當接收到 <code>http://localhost/images/example.png</code> 的請求響應時。如果該檔案不存在,nginx 會傳回一個 404 錯誤的響應。沒有以 <code>/images/</code> 開頭的 URI 的請求,将會直接映射到 <code>/data/www</code> 目錄中。比如,響應 <code>http://localhost/some/example.html</code> 的請求,nginx 會發送 <code>/data/www/some/example.html</code> 檔案。

為了使用新的配置檔案,如果還沒開啟 nginx 需要先開啟,然後将重載信号發送給 nginx 的主程序,通過執行:

如果你發現有些地方出了問題,你可以在 <code>/usr/local/nginx/logs</code> 或者 <code>/var/log/nginx</code> 目錄下的 <code>access.log</code> 和 <code>error.log</code> 檔案中,找到原因。

nginx 常常用來作為代理伺服器,這代表着伺服器接收請求,然後将它們傳遞給被代理伺服器,得到請求的響應,再将它們發送給用戶端。

我們将配置一個基本的代理伺服器,它會處理本地圖檔檔案的請求并傳回其他的請求給被代理的伺服器。在這個例子中,兩個伺服器都會定義在一個 nginx 執行個體中。

首先,通過在 nginx 配置檔案中添加另一個 <code>server</code> 區塊,來定義一個被代理的伺服器,像下面的配置:

上面就是一個簡單的伺服器,它監聽在 8080 端口(之前,<code>listen</code> 并沒被定義,是因為預設監聽的 80 端口)并且會映射所有的請求給 本地檔案目錄 <code>/data/up1</code>。建立該目錄,然後添加 <code>index.html</code> 檔案。注意,<code>root</code> 指令是放在 <code>server</code> 上下文中。當響應請求的 <code>location</code> 區塊中,沒有自己的 <code>root</code> 指令,上述的 <code>root</code>指令才會被使用。

接着,使用前面章節中的 <code>server</code> 配置,然後将它改為一個代理服務配置。在第一個 <code>location</code> 區塊中,放置已經添加被代理伺服器的協定,名字和端口等參數的 proxy_pass 指令(在這裡,就是 <code>http://localhost:8080</code>):

我們将修改第二個 <code>location</code> 區塊,使他傳回一些典型字尾的圖檔檔案請求,現在它隻會映射帶有 <code>/images/</code> 字首的請求到 <code>/data/images</code> 目錄下。修改後的 <code>location</code> 指令如下:

該參數是一個正規表達式,它會比對所有以 <code>.gif</code>,<code>.jpg</code> 或者 <code>.png</code> 結尾的 URIs。一個正規表達式需要以 <code>~</code> 開頭。比對到的請求會被映射到 <code>/data/images</code>目錄下。

當 nginx 在選擇 <code>location</code> 去響應一個請求時,它會先檢測帶有字首的 <code>location</code>指令,記住先是檢測帶有最長字首的 <code>location</code>,然後檢測正規表達式。如果有一個正則的比對的規則,nginx 會選擇該 <code>location</code>,否則,會選擇之前緩存的規則。

最終,一個代理伺服器的配置結果如下:

該伺服器會選擇以 <code>.gif</code>,<code>.jpg</code>,或者 <code>.png</code> 結束的請求并且映射到 <code>/data/images</code> 目錄(通過添加 URI 給 root 指令的參數),接着将其他所有的請求映射到上述被代理的伺服器。

為了使用新的配置,像前幾個章節描述的一樣,需要向 nginx 發送重載信号。

這還有很多其他的指令,可以用于進一步配置代理連接配接。

原文連結:http://ivweb.io/topic/58427dfb270eedfd10a0f5ea

相關推薦

Nginx網站使用CDN之後禁止使用者真實IP通路的方法

【騰訊雲的1001種玩法】Nginx + Tomcat 負載均衡配置詳解