nginx 基本入門

leon_zeng0發表於2020-09-25

中文參考:https://www.jianshu.com/p/93ac21161ac6

英文參考:http://nginx.org/en/docs/beginners_guide.html

Nginx 是什麼?

在部署Django, Flask等Python的Web 應用時,總是看到nginx,而且還總堵在那裡。就想nginx 到底是怎麼用的,就查了很多資料。

Nginx 是俄羅斯人編寫的十分輕量級的 HTTP 伺服器,Nginx,它的發音為“engine X”,是一個高效能的HTTP和反向代理伺服器,同時也是一個 IMAP/POP3/SMTP 代理伺服器。Nginx 是由俄羅斯人 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點開發的,它已經在該站點執行超過兩年半了。Igor Sysoev 在建立的專案時,使用基於 BSD 許可。

英文主頁:http://nginx.net 。

Nginx 以事件驅動的方式編寫,所以有非常好的效能,同時也是一個非常高效的反向代理、負載平衡。其擁有匹配 Lighttpd 的效能,同時還沒有 Lighttpd 的記憶體洩漏問題,而且 Lighttpd 的 mod_proxy 也有一些問題並且很久沒有更新。

現在,Igor 將原始碼以類 BSD 許可證的形式釋出。Nginx 因為它的穩定性、豐富的模組庫、靈活的配置和低系統資源的消耗而聞名.業界一致認為它是 Apache2.2+mod_proxy_balancer 的輕量級代替者,不僅是因為響應靜態頁面的速度非常快,而且它的模組數量達到 Apache 的近 2/3。對 proxy 和 rewrite 模組的支援很徹底,還支援 mod_fcgi、ssl、vhosts ,適合用來做 mongrel clusters 的前端 HTTP 響應。

安裝

在linux上安裝是:

前提準備:

sudo apt install curl gnupg2 ca-certificates lsb-release

安裝:

sudo apt update
sudo apt install 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 的配置檔案

nginx-c/usr/local/nginx/conf/nginx.conf

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

nginx-ssignal

signal 可以為下列命令之一:

stop — 直接關閉 nginx

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

reload — 重新載入配置檔案,相當於重啟

reopen — 重新開啟日誌檔案 比如,等待當前子程式處理完正在執行的請求後,結束 nginx 程式,可以使用下列命令:

nginx -s quit

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

nginx -s reload

一旦主程式接收到過載配置檔案的命令後,它會先檢查配置檔案語法的合法性,如果沒有錯誤,則會重新載入配置檔案。如果成功,則主程式會重新建立一個子程式並且傳送關閉請求給以前的子程式。如果沒有成功,主程式會回滾改動並且繼續使用以前的配置。老的子程式在接受關閉的命令後,會停止接受新的請求並且繼續處理當前的請求,直到處理完畢。之後,該子程式就直接退出了。 在 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 nginx

// 結果為:(下面是單核 CPU 的情況) 

516 pts/0    D+    0:00 grep --color=auto nginx 

1156 ?        S      1:22 nginx: worker process

27999 ?        Ss    0:00 nginx: master process ./nginx

更多關於傳送訊號給 nginx,可以參考nginx 控制

測試nginx 的配置:sudo nginx -t

測試nginx 的配置並顯示:sudo nginx -T 

單一的啟動nginx:sudo nginx 

啟動nginx服務:sudo systemctl start nginx

對於上面的nginx 啟動測試,用的哪個配置檔案呢?

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

預設配置:/etc/nginx/sites-available/default

幫助檔案說主配置檔案:/etc/nginx/nginx.conf

配置檔案結構

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

// 簡單指令

root /data/www;

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

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

# this is a comment

events {  

    worker_connections  4096;  ## Default: 1024

}

http {    

        server {          

                listen      80;        

                server_name  domain1.com www.domain1.com;        

                access_log  logs/domain1.access.log  main;        

                root        html;        

                location ~ \.php$ {          

                    fastcgi_pass  127.0.0.1:1025;        

                }    

        }

}

靜態伺服器

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

http {    

        server {    

        }

}

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

location / {    

        root /data/www;

}

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

location /images/ {    

        root /data;

}

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

server {   

        location / {       

                root /data/www;   

        }   

        location /images/ {       

                root /data;   

        }

}

這已經是一個可用的伺服器配置,它監聽標準的 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 reload

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

搭建一個簡易的代理服務

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

server {   

        listen 8080;   

        root /data/up1;   

        location / {   

        }

}

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

server {   

        location / {

                proxy_pass http://localhost:8080;   

        }   

        location /images/ {

               root /data;   

        }

}

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

location ~ \.(gif|jpg|png)${

        root/data/images;

}

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

server{

        location/{

                proxy_passhttp://localhost:8080/;

        }

        location~\.(gif|jpg|png)${

                root/data/images;

        }

}

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





 

相關文章