nginx 基本入門

本文作者:ivweb villainthr 原文出處:ivweb.io/topic/58427dfb未經同意,禁止轉載

本文屬於翻譯文章,原文鏈接為 nginx Beginner』s Guide。是至今為止見過最好的 nginx 入門文章。額。。。沒有之一。

這篇教程簡單介紹了 nginx 並且講解了一些 nginx 可以解決的簡單任務。這裡,我們假設 nginx 已經安裝在讀者的機器上。如果沒有,可以看一下如何安裝 nginx。這篇教程主要講解的是如果啟用和停止ngixn,和重新載入配置,描述配置文件的基本結構和怎樣搭建一個 nginx 靜態輔助器,怎樣配置 nginx 作為一個代理伺服器來。 nginx 有一個主進程和其他子進程。主進程的主要工作是載入和執行配置文件,並且駐留子進程。子進程用來作為實際的請求處理。nginx 採取基於事件的模型和 OS 依賴的機制,在多個子進程之間高效的分配請求。子進程的個數會直接寫在配置文件中並且,對於給定的配置可以是固定的,或者根據可用的 CPU 核數自動的進行調整(參考 子進程)。 nginx 和它模塊的工作方式是在配置文件中寫好的。默認情況下,這個配置文件通常命名為 nginx.conf 並且會放置在 /usr/local/nginx/conf,/etc/nginx,或者 /usr/local/etc/nginx。

啟用,停止和重載配置

運行可執行文件就可以開啟 nginx,比如:

// -c nginx 的配置文件nnginx -c /usr/local/nginx/conf/nginx.confn

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

nginx -s signaln

signal 可以為下列命令之一:

  • stop — 直接關閉 nginx
  • quit — 會在處理完當前正在的請求後退出,也叫優雅關閉
  • reload — 重新載入配置文件,相當於重啟
  • reopen — 重新打開日誌文件 比如,等待當前子進程處理完正在執行的請求後,結束 nginx 進程,可以使用下列命令:

nginx -s quitn

執行該命令的用戶需要和啟動的 nginx 的用戶一致。 如果重載配置文件的命令沒有傳遞給 nginx 或者 nginx 沒有重啟,那麼配置文件的改動是不會被使用的。重載配置文件的命令可以使用:

nginx -s reloadn

一旦主進程接收到重載配置文件的命令後,它會先檢查配置文件語法的合法性,如果沒有錯誤,則會重新載入配置文件。如果成功,則主進程會重新創建一個子進程並且發送關閉請求給以前的子進程。如果沒有成功,主進程會回滾改動並且繼續使用以前的配置。老的子進程在接受關閉的命令後,會停止接受新的請求並且繼續處理當前的請求,直到處理完畢。之後,該子進程就直接退出了。 在 Unix 工具的幫助下,比如使用 kill 工具,該信號會被發送給 nginx 進程。在這種情況下,信號會被直接發送給帶有進程 ID 的進程。nginx 的主進程的進程 ID 是寫死在 nginx.pid 文件中的。該文件通常放在 /usr/local/nginx/logs 或者 /var/run 目錄下。比如,如果主進程的 ID 是 1628,為了發送 QUIT 信號來使 nginx 優雅退出,可以執行:kill -s QUIT 1628

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

$ ps -ax | grep nginxn// 結果為:(下面是單核 CPU 的情況)n 516 pts/0 D+ 0:00 grep --color=auto nginxn 1156 ? S 1:22 nginx: worker processn27999 ? Ss 0:00 nginx: master process ./nginxn

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

配置文件結構

nginx 是由一些模塊組成,我們一般在配置文件中使用一些具體的指令來控制它們。指令被分為簡單指令和塊級命令。一個簡單的指令是由名字和參數組成,中間用空格分開,並以分號結尾。例如:

// 簡單指令nroot /data/www;n

塊級指令和簡單指令一樣有著類似的結構,但是末尾不是分號而是用 { 和 } 大括弧包裹的額外指令集。如果一個塊級指令的大括弧里有其他指令,則它被叫做一個上下文(比如:events,Module ngx_http_core_module,server,和 location)。 在配置文件中,沒有放在任何上下文中的指令都是處在主上下文中。events 和 http 的指令是放在主上下文中,server 放在 http 中, location 放在 server 中。

以 # 開頭的行,會被當做注釋。

# this is a commentnevents {n worker_connections 4096; ## Default: 1024n}nnhttp {n server { n listen 80;n server_name domain1.com www.domain1.com;n access_log logs/domain1.access.log main;n root html;nn location ~ .php$ {n fastcgi_pass 127.0.0.1:1025;n }n }n}n

靜態伺服器

一個重要的網路伺服器的任務是處理文件(比如圖片或者靜態 HTML 文件)。這裡,你會實踐一個例子,文件會從不同的目錄中映射(取決於請求):/data/www(放置 HTML 文件)和 /data/images(放置圖片)。這需要配置一下文件,將帶有兩個 location 的指令的 server 的塊級命令放在 server 指令中。 首先,創建一個 /data/www目錄,然後放置一個事先寫好內容的 index.html 文件。接著,創建一個 /data/images 目錄,然後放置一些圖片。 下一步,打開配置文件。默認的配置文件已經包含了一些關於 server 指令的樣式,大多數情況下直接把他們給注釋掉。現在,注釋掉其他的區塊,然後寫一個新的 server 區塊:

http {n server {n }n}n

通常,該配置文件可能會包含多個 server 指令。這些 server 指令監聽不同的埠和伺服器名。一旦 nginx 決定哪個服務進程處理請求,它會根據在 server 塊級指令中定義好的 location 指令的參數,來匹配請求頭中指定的 URI。 將下列 location 指令添加到 server 指令中:

location / {n root /data/www;n}n

該 location 指令相對於請求中的 URI 執行了 「/」 的前綴。為了匹配請求,URI 會被添加到 root 命令指定的路徑後,即 /data/www,得到本地文件系統中請求文件的路徑。如果,有幾個 location 匹配到,那麼 nginx 會選擇最長的前綴。上面的 location 提供了長度為 1 的前綴,所以,僅當其他的 location 匹配失敗後,該指令才會使用。 接著,添加第二個 location 區塊:

location /images/ {n root /data;n}n

它會匹配到以 /images/ 開頭的請求(location / 也會匹配到該請求,只是前綴更短) server 塊級命令的配置結果如下:

server {n location / {n root /data/www;n }nn location /images/ {n root /data;n }n}n

這已經是一個可用的伺服器配置,它監聽標準的 80 埠並且可以在本地上通過 http://localhost/ 訪問。對於 URI 以 /images/ 開頭的請求,伺服器會從 /data/images 目錄中,返回對應的文件。例如,nginx 會返回 /data/images/example.png 文件,當接收到 http://localhost/images/example.png 的請求響應時。如果該文件不存在,nginx 會返回一個 404 錯誤的響應。沒有以 /images/ 開頭的 URI 的請求,將會直接映射到 /data/www 目錄中。比如,響應 http://localhost/some/example.html 的請求,nginx 會發送 /data/www/some/example.html 文件。 為了使用新的配置文件,如果還沒開啟 nginx 需要先開啟,然後將重載信號發送給 nginx 的主進程,通過執行:

nginx -s reloadn

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

搭建一個簡易的代理服務

nginx 常常用來作為代理伺服器,這代表著伺服器接收請求,然後將它們傳遞給被代理伺服器,得到請求的響應,再將它們發送給客戶端。 我們將配置一個基本的代理伺服器,它會處理本地圖片文件的請求並返回其他的請求給被代理的伺服器。在這個例子中,兩個伺服器都會定義在一個 nginx 實例中。 首先,通過在 nginx 配置文件中添加另一個 server區塊,來定義一個被代理的伺服器,像下面的配置:

server {n listen 8080;n root /data/up1;nn location / {n }n}n

上面就是一個簡單的伺服器,它監聽在 8080 埠(之前,listen 並沒被定義,是因為默認監聽的 80 埠)並且會映射所有的請求給 本地文件目錄 /data/up1。創建該目錄,然後添加 index.html 文件。注意,root 指令是放在 server 上下文中。當響應請求的 location 區塊中,沒有自己的 root 指令,上述的 root 指令才會被使用。 接著,使用前面章節中的 server 配置,然後將它改為一個代理服務配置。在第一個 location 區塊中,放置已經添加被代理伺服器的協議,名字和埠等參數的 proxy_pass 指令(在這裡,就是 http://localhost:8080):

server {n location / {n proxy_pass http://localhost:8080;n }nn location /images/ {n root /data;n }n}n

我們將修改第二個 location 區塊,使他返回一些典型後綴的圖片文件請求,現在它只會映射帶有 /images/ 前綴的請求到 /data/images 目錄下。修改後的 location 指令如下:

location ~ .(gif|jpg|png)$ {n root /data/images;n}n

該參數是一個正則表達式,它會匹配所有以 .gif,.jpg 或者 .png 結尾的 URIs。一個正則表達式需要以 ~ 開頭。匹配到的請求會被映射到 /data/images 目錄下。 當 nginx 在選擇 location 去響應一個請求時,它會先檢測帶有前綴的 location 指令,記住先是檢測帶有最長前綴的 location,然後檢測正則表達式。如果有一個正則的匹配的規則,nginx 會選擇該 location,否則,會選擇之前緩存的規則。 最終,一個代理伺服器的配置結果如下:

server {n location / {n proxy_pass http://localhost:8080/;n }nn location ~ .(gif|jpg|png)$ {n root /data/images;n }n}n

該伺服器會選擇以 .gif,.jpg,或者 .png 結束的請求並且映射到 /data/images 目錄(通過添加 URI 給 root 指令的參數),接著將其他所有的請求映射到上述被代理的伺服器。 為了使用新的配置,像前幾個章節描述的一樣,需要向 nginx 發送重載信號。 這還有很多其他的指令,可以用於進一步配置代理連接。


推薦閱讀:

chrome瀏覽器擴展應用開發之旅(一)
什麼才是你心目中的前端圈?
API文檔化開發實戰
他來了,給您提個醒

TAG:前端开发 | PHP | Nginx |