從原始碼安裝 NGINX 提供了高度的客製化彈性,可以根據需求調整編譯選項。首先,需要下載 NGINX 原始碼,解壓縮後進入目錄。執行 ./configure
命令,這個步驟會檢查系統的相依套件,例如 GCC、PCRE、zlib 和 OpenSSL 等,並生成 Makefile。如果缺少必要的套件,組態過程會失敗,可以根據錯誤訊息安裝缺少的套件後重新執行。./configure
也支援各種選項,例如 --prefix
可以指定安裝路徑,--with-http_ssl_module
可以啟用 SSL 模組。執行 make
命令會根據 Makefile 編譯程式碼,產生 NGINX 的執行檔。接著使用 make install
命令將編譯好的檔案安裝到指定的目錄。安裝完成後,可以使用 sbin/nginx -t
命令測試 NGINX 的組態檔案是否正確。NGINX 執行時會以 daemon 的形式在背景執行,可以使用 sbin/nginx
啟動,sbin/nginx -s stop
或 sbin/nginx -s quit
停止,sbin/nginx -s reload
重新載入組態。為了方便管理,可以將 NGINX 設定為系統服務。在使用 systemd 的系統中,可以建立一個 service 檔案,例如 /etc/systemd/system/nginx.service
,設定 NGINX 的啟動、停止、重新啟動等指令。設定完成後,可以使用 systemctl enable nginx.service
啟用服務,systemctl start nginx.service
啟動 NGINX,systemctl stop nginx.service
停止 NGINX,systemctl restart nginx.service
重新啟動 NGINX,systemctl reload nginx.service
重新載入 NGINX 組態,systemctl status nginx.service
檢視 NGINX 的狀態。
NGINX 的下載與安裝
NGINX 是一款高效能的 Web 伺服器軟體,廣泛應用於伺服器端的請求處理。本篇文章將詳細介紹如何從原始碼下載和安裝 NGINX,並強調關鍵步驟和注意事項。
簡單快速的安裝方式
如果你希望快速測試或未來需要重新編譯應用程式,可以選擇簡單的方式進行安裝,而不需要進行複雜的組態。以下是三個基本的命令,可以幫助你建立和安裝 NGINX:
[user@server nginx-1.25.2]# ./configure
[user@server nginx-1.25.2]# make
[root@server nginx-1.25.2]# make install
內容解密:
這三個命令分別完成以下工作:
./configure
:這個命令會啟動一系列驗證步驟,確保你的系統中包含了所有必要的元件。如果組態過程失敗,通常是因為缺少某些前提條件,可以檢查objs/autoconf.err
檔案以取得更詳細的錯誤報告。make
:這個命令會編譯應用程式。如果組態過程成功,這個步驟通常不會出現錯誤。make install
:這個命令會將編譯好的檔案和其他資源複製到安裝目錄,預設是/usr/local/nginx
。依據/usr/local
目錄的許可權設定,你可能需要以 root 身份執行這個操作。
需要注意的是,如果沒有進行組態,你可能會錯過許多功能,包括可選模組等。
組態路徑選項
在執行 configure
命令時,你可以使用一些開關來指定各種元素的目錄或檔案路徑。以下是一些常見的組態開關示例:
[root@server nginx]# ./configure --conf-path=/etc/nginx/nginx.conf
內容解密:
這個命令指定了 NGINX 組態檔案的路徑。每個版本的 NGINX 可能會提供不同的組態開關,因此建議執行 ./configure --help
命令來檢視當前版本支援的所有開關。
組態編譯問題排除
在某些情況下,configure
命令可能會失敗。以下是一些排除問題的方法:
檢查前提條件
主要的前提條件包括 GCC、PCRE、zlib 和 OpenSSL。這些函式庫需要兩個部分:函式庫本身和其開發來源。確保你已經安裝了這些函式庫及其開發工具。
./configure [...] --with-openssl=/usr/lib64
內容解密:
這個命令指定了 OpenSSL 檔案所在的目錄。如果 configure
指令碼無法找到所需的檔案,可能是因為未正確指定路徑。
檢查目錄許可權
確保 NGINX 檔案所在的目錄具有讀寫許可權,並且所有組態指令碼中指定的路徑都是有效且存在的。
編譯與安裝
成功執行 configure
指令碼後,可以進入編譯步驟。在原始碼目錄中執行以下命令:
[user@server nginx-1.25.2]$ make
內容解密:
如果編譯過程中出現問題,通常是因為缺少某些前提條件或指定了無效路徑。建議重新執行 configure
命令並仔細檢查所有開關和前提條件選項。
成功編譯後,以 root 身份執行以下命令進行安裝:
[root@server nginx-1.25.2]# make install
內容解密:
這個命令會執行 makefile
中的安裝部分,將二進位制檔案和組態檔案複製到指定的安裝目錄。如果系統出現異常錯誤(例如儲存空間不足或記憶體不足),可能需要處理相應問題。
NGINX 安裝完成
經過上述步驟後,NGINX 已成功編譯並安裝完成。接下來可以將 NGINX 轉換為後台執行的守護程式(daemon),使其能夠持續執行並處理請求。
總結來說,NGINX 的下載與安裝過程中需要注意前提條件、路徑設定和許可權問題。透過遵循以上步驟,可以順利完成 NGINX 的安裝並進一步組態其運作環境。
控制 NGINX 服務
NGINX 基本操作
在這個階段,假設你已經成功安裝並構建了 NGINX。預設的輸出檔案位置是 /usr/local/nginx
,接下來的範例將根據這個路徑來介紹如何啟動、停止、開機自動啟動 NGINX 以及使用 daemon 監控其狀態。
Daemon 與服務
接下來,我們需要執行 NGINX。然而,在這之前,瞭解這個應用程式的性質非常重要。電腦應用程式分為兩種型別:需要即時使用者輸入且在前景執行的應用程式,以及不需要即時輸入且在背景執行的應用程式。NGINX 屬於後者,通常稱為 daemon。Daemon 的名稱通常以「d」結尾,例如 Apache 在許多 Linux 發行版中被稱為 httpd
(HTTP 伺服器 daemon),名稱伺服器 daemon 被稱為 named
,任務排程器 cron
也是一個 daemon,儘管它不適用於 NGINX。從命令列啟動後,daemon 會立即傳回提示符視窗,並且大多數情況下不會輸出任何資料到終端機。
因此,當你啟動 NGINX 時,你不會看到任何文字出現在螢幕上,提示符會立即傳回。雖然這看起來可能有些令人困惑,但其實這是一個好兆頭。這表示 daemon 已經正確啟動,並且組態檔案中沒有任何錯誤。
使用者與群組
理解 NGINX 的程式架構特別是使用者與群組非常重要。設定 NGINX 時常見的問題之一是無效的檔案存取許可權——由於使用者或群組組態錯誤,你可能會遇到 403 Forbidden HTTP 錯誤,因為 NGINX 無法存取請求的檔案。
NGINX 有兩層程式,每層可能有不同的許可權設定:
NGINX 主程式
主程式應該以 root 身份啟動。在大多數 Unix-like 系統中,以 root 帳戶啟動的程式允許在任何連線埠上開啟 TCP 槽口,而其他使用者只能在連線埠 1024 以上開啟監聽槽口。如果你不以 root 身份啟動 NGINX,標準連線埠如 80 或 443 將無法存取。
注意:允許你指定工作程式不同使用者和群組的
user
指令對主程式無效。
NGINX 工作程式
工作程式由主程式自動產生,使用組態檔案中 user
指令指定的帳戶(詳見《基本 NGINX 組態》第2章)。組態設定優先於編譯時指定的設定。如果沒有指定任何設定,工作程式將以 nobody
帳戶啟動,群組為 nobody
(或 nogroup
,視你的作業系統而定)。
NGINX 命令列切換
NGINX 二進位檔接受命令列引數來執行各種操作,其中包括控制背景程式。要獲得完整的命令列表,可以使用以下命令:
[user@server ~]$ cd /usr/local/nginx/sbin
[user@server sbin]$ ./nginx -h
接下來幾節將詳細描述這些切換的用途。一些切換允許你控制 daemon ,一些則讓你對應用程式組態進行各種操作。
啟動與停止 daemon
你可以透過不加任何切換地執行 NGINX 二進位檔來啟動它。如果 daemon 已經執行中,一則訊息會顯示指定連線埠已被佔用:
[emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use)
[...] [emerg]: still could not bind().
在此之後,你可以透過傳送訊號來控制 daemon ,停止它、重新啟動它或僅重新載入其組態:
命令說明
命令 | 說明 |
---|---|
nginx -s stop | 停止 daemon (使用 TERM 必要) |
nginx -s quit | 優雅地停止 daemon (使用 QUIT 必要) |
nginx -s reopen | 重新開啟記錄檔 |
nginx -s reload | 檢查組態無誤後重新載入 |
當啟動 daemon 、停止它或進行上述任何操作時,組態檔案會首先解析和驗證。如果組態無效,無論你提交了什麼命令都會失敗,即使嘗試停止 daemon 。換句話說,在某些情況下,如果組態檔案無效,你可能無法透過正常 init 控制命令停止 NGINX。
測試組態
這些細節可能會變得重要如果你經常調整組態。在任何組態檔案中最小的錯誤都可能導致失去對服務的控制——然後你無法透過正常 init 控制命令停止它,顯然也無法再次啟動它。
因此以下命令將對你有很大幫助。它允許你檢查語法、驗證和完整性:
[user@server ~]$ /usr/local/nginx/sbin/nginx -t
-t
指的是測試組態。NGINX 會重新解析組態並告訴你它是否有效。有效的組態檔案並不意味著 NGINX 一定能夠正常執行——因為還可能存在其他問題如槽口問題、無效路徑或錯誤的存取許可權。
顯然地操作生產環境中的組態檔案是危險行為且應避免。 此時最佳做法是將新組態放入一個臨時檔案並在該檔案上執行測試:
[user@server sbin]$ ./nginx -t -c /home/user/test.conf
此命令將解析 /home/user/test.conf
,並確保它是一個有效的 NGINX 組態檔案。
當確認新檔案有效後可直接取代舊有之組態檔案:
[user@server sbin]$ cp -i /home/user/test.conf /usr/local/nginx/conf/nginx.conf
cp: erase 'nginx.conf' ? yes
[user@server sbin]$ ./nginx -s reload
其他切換
另一個在許多情況下可能會派上用場的是 -V
指令。
[user@server sbin]$ ./nginx -V
除了告訴你當前 NGINX 構建版本外,-V指令同時提供編譯時所使用之引數資訊:
nginx version: nginx/1.25.2 (Ubuntu)
built by gcc 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
TLS SNI support enabled
configure arguments: --with-http_ssl_module
NGINX 是經由 --with-http_ssl_module
編譯而成。
為什麼這麼重要?因為如果嘗試使未編譯內建之模組生效時必須先確認該模組是否已成功編譯內建。
另外 -g
選項則可以指定追加之組態指令:
[user@server sbin]$ ./nginx -g "timer_resolution 200ms";
在下一節中我們將會透過系統設定方式來讓NGINX與系統整合並自動於Linux系統開機時自動啟動。
新增 NGINX 作為系統服務
在這部分我們將建立一個指令碼將NGINX daemon 轉變成一個真正的系統服務。 結果主要包括:daemon可以透過標準指令來控制並且更重要的是它將自動隨著系統開機而自動啟動並隨著系統關機而停止。
systemd 初始化檔案
大多數現代 Linux 作業系統都使用 systemd 風格的服務檔案。 Debian, Ubuntu, RHEL 和 CentOS等均採用了 systemd ;因此,該服務檔案應該可以適用於任何流行Linux發行版。 其他的初始化軟體如 System V 和 OpenRC也存在;但為了便於維護,我們將專注於最受支援和最流行的一種初始化方式.
下載及安裝 systemd unit file範例
可以透過以下步驟來完成:
sudo curl -o /etc/systemd/system/nginx.service https://www.example.com/nginx.service
修改完畢後請記得重新載入systemd:
sudo systemctl daemon-reload
透過以下指令可觀察目前ngnix執行狀況:
systemctl status nginx.service
啟用及管理NGINX服務:
完成後,我們可透過以下步驟啟用及管理NGIXN:
# 啟用服務使其隨系統開機而自動啟動:
sudo systemctl enable nginx.service
# 啟動服務:
sudo systemctl start nginx.service
# 停止服務:
sudo systemctl stop nginx.service
# 檢視NGNIX目前狀態:
sudo systemctl status nginx.service
# 檢視日誌紀錄:
journalctl -u nginx.service --since "1 hour ago"
問答集錦:
以下是一些常見問題及解答:
如何重新載入NGNIX?
- 您可以透過以下步驟完成:
sudo systemctl reload nginx.service # (更新config)
- 您可以透過以下步驟完成:
如何檢視目前NGNIX工作狀態?
sudo systemctl status nginx.service # 檢視目前ngnix狀態(詳細)
如何檢視NGNIX目前日誌紀錄?
journalctl -u nginx.service --since "1 hour ago" #查詢最後一小時內日誌紀錄(可更改時間範圍)