在上一篇的文章中, 學習了內建提供的變數與設定客製的變數,並且有稍微提到模組的概念。

要學習安裝 Nginx 模組前首先需要了解該如何編譯 Nginx 原始碼,今天要先來學習如何從頭編譯原始碼。


Nginx Source Code

首先看一下官方的安裝文檔

這邊只有 pcre2 是必需的函式庫,Nginx 會依賴這個模組來處理 Regular Expressions 相關功能, 要使用 Nginx Gzip 模組需要額外安裝 zlib 函式庫,要使用 HTTPS 則需要安裝 openssl 函式庫並且編譯 openssl 時需要依賴 perl 函式庫。

apk add perl

wget -P ~ https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.42/pcre2-10.42.tar.gz
tar -zxf pcre2-10.42.tar.gz
cd pcre2-10.42
./configure
make
sudo make install

wget -P ~ https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz
tar -zxf zlib-1.2.13.tar.gz
cd zlib-1.2.13
./configure
make
sudo make install

wget -P ~ https://github.com/openssl/openssl/releases/download/openssl-3.2.2/openssl-3.2.2.tar.gz
tar -zxf openssl-3.2.2.tar.gz
cd openssl-3.2.2
./Configure linux-x86_64 --prefix=/usr
make
sudo make install

上面是直接透過原始碼編譯的方式來安裝依賴的函式庫,可以改用 alpine 官方打包的函式庫也能達到同樣的效果。

apk add pcre2-dev
apk add zlib-dev
apk add openssl

安裝完相關依賴後開始下載 nginx 原始碼,這邊選擇的是下載目前 stable 版本 1.26.1

wget -P ~ https://nginx.org/download/nginx-1.26.1.tar.gz
tar zxf nginx-1.26.1.tar.gz
cd nginx-1.26.1

觀查一下 nginx 頂層的目錄結構,發現有幾個文檔幾個資料夾和一個 configure 可執行檔, 需要先運行 configure 產生 makefile 才能進行安裝。

[node1] (local) root@192.168.0.18 ~/nginx-1.26.1
$ ls -lh
total 824K   
-rw-r--r--    1 502      dialout   319.9K May 29 14:30 CHANGES
-rw-r--r--    1 502      dialout   489.4K May 29 14:30 CHANGES.ru
-rw-r--r--    1 502      dialout     1.4K May 28 13:28 LICENSE
-rw-r--r--    1 502      dialout       49 May 28 13:28 README
drwxr-xr-x    6 502      dialout      326 Aug  5 09:42 auto
drwxr-xr-x    2 502      dialout      168 Aug  5 09:42 conf
-rwxr-xr-x    1 502      dialout     2.5K May 28 13:28 configure
drwxr-xr-x    4 502      dialout       72 Aug  5 09:42 contrib
drwxr-xr-x    2 502      dialout       40 Aug  5 09:42 html
drwxr-xr-x    2 502      dialout       21 Aug  5 09:42 man
drwxr-xr-x    9 502      dialout       91 Aug  5 09:42 src

configure 能夠接收多個參數提供我們進行細項的設定,這邊參考 alpine 打包腳本的參數來設定我們的 Nginx。

./configure \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--pid-path=/run/nginx/nginx.pid \
--with-http_ssl_module

如果是手動編譯的函式庫需要自行指定路徑。

./configure \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--pid-path=/run/nginx/nginx.pid \
--with-pcre=../pcre2-10.42 \
--with-zlib=../zlib-1.2.13 \
--with-http_ssl_module

在產生過程後會顯示設定的總結,可以看到這邊使用的系統安裝的的 PCRE2 OpenSSL zlib 函式庫, 還有把 sbin conf pid 都修改成我們想要的路徑,沒有特別指定的都是使用預設的路徑。

Configuration summary
  + using system PCRE2 library
  + using system OpenSSL library
  + using system zlib library

  nginx path prefix: "/usr/local/nginx"
  nginx binary file: "/usr/sbin/nginx"
  nginx modules path: "/usr/local/nginx/modules"
  nginx configuration prefix: "/etc/nginx"
  nginx configuration file: "/etc/nginx/nginx.conf"
  nginx pid file: "/run/nginx/nginx.pid"
  nginx error log file: "/usr/local/nginx/logs/error.log"
  nginx http access log file: "/usr/local/nginx/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

產生完後根目錄底下會產生 Makefile 與 objs。

[node1] (local) root@192.168.0.18 ~/nginx-1.26.1
$ ls -lh
total 828K   
-rw-r--r--    1 502      dialout   319.9K May 29 14:30 CHANGES
-rw-r--r--    1 502      dialout   489.4K May 29 14:30 CHANGES.ru
-rw-r--r--    1 502      dialout     1.4K May 28 13:28 LICENSE
-rw-r--r--    1 root     root         393 Aug  5 10:23 Makefile
-rw-r--r--    1 502      dialout       49 May 28 13:28 README
drwxr-xr-x    6 502      dialout      326 Aug  5 09:42 auto
drwxr-xr-x    2 502      dialout      168 Aug  5 09:42 conf
-rwxr-xr-x    1 502      dialout     2.5K May 28 13:28 configure
drwxr-xr-x    4 502      dialout       72 Aug  5 09:42 contrib
drwxr-xr-x    2 502      dialout       40 Aug  5 09:42 html
drwxr-xr-x    2 502      dialout       21 Aug  5 09:42 man
drwxr-xr-x    3 root     root         125 Aug  5 10:23 objs
drwxr-xr-x    9 502      dialout       91 Aug  5 09:42 src
default:        build

clean:
        rm -rf Makefile objs

.PHONY: default clean

build:
        $(MAKE) -f objs/Makefile

install:
        $(MAKE) -f objs/Makefile install

modules:
        $(MAKE) -f objs/Makefile modules

upgrade:
        /usr/sbin/nginx -t

        kill -USR2 `cat /run/nginx/nginx.pid`
        sleep 1
        test -f /run/nginx/nginx.pid.oldbin

        kill -QUIT `cat /run/nginx/nginx.pid.oldbin`

.PHONY: build install modules upgrade

輸入命令安裝 Nginx。

make && make install

安裝完最後運行 sbin 底下的 nginx 的可執行檔,並且訪問 80 port 即可看到 Nginx 的歡迎頁面。

/usr/sbin/nginx

可以輸入 -V 參數在底下可以看到編譯時有帶入什麼參數。

[node1] (local) root@192.168.0.18 ~/nginx-1.26.1
$ /usr/sbin/nginx -V
nginx version: nginx/1.26.1
built by gcc 12.2.1 20220924 (Alpine 12.2.1_git20220924-r10) 
built with OpenSSL 3.1.4 24 Oct 2023
TLS SNI support enabled
configure arguments: --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --pid-path=/run/nginx/nginx.pid --with-http_ssl_module

Summary

今天學習了如何從原始碼編譯 Nginx 執行檔,也學習到編譯可以帶入多個參數也可以開啟或關閉特定的模組, 接下來要學習如何添加第三方的模組。