如何在Ubuntu 18.04 LTS上從源代碼構建NGINX

 

NGINX (發音 “引擎x”)是一個開源的Web服務器軟件,設計時考慮到高並發性,可以用作 HTTP / HTTPS服務器, 反向代理服務器, 郵件代理服務器, 軟件負載均衡器, TLS終結者, 緩存服務器...

閱讀更多

它是一個極其模塊化的軟件。 甚至一些看似“內置”的軟件(例如GZIP或SSL)實際上也構建為可在構建期間啟用和禁用的模塊。

它有 核心 (母語) 模塊第三方(外部)模塊 由社區創建。 現在,我們可以使用超過一百個第三方模塊。

寫入 C 語言,它是非常快速和輕量級的軟件。

從源代碼安裝NGINX相對“簡單” - 下載最新版本的NGINX源代碼,配置,構建和安裝它。

您需要選擇是否下載 主線 or 穩定 版本,但建立它們是完全一樣的。

內置nginx 1

在本教程中,我們將使用開源版NGINX中的所有可用模塊構建NGINX,我們將使用 主線 版本是在 1.15.0 在撰寫本文時。 更新版本可用時更新版本號。

穩定與主線版本

NGINX開源有兩個版本:

  • 主線 - 包括最新功能和錯誤修復,並始終是最新的。 它是可靠的,但它可能包括一些實驗模塊,它也可能有一些新的bug。
  • 穩定 - 不包括所有最新功能,但有重要的錯誤修復,始終向後移植到主線版本。

核心模塊與第三方模塊

NGINX有兩種類型的模塊可供您使用: 核心模塊第三方模塊.

核心模塊由核心NGINX開發人員構建,他們是軟件本身的一部分。

第三方模塊由社區構建,您可以使用它們來擴展NGINX功能。 有很多有用的第三方模塊,其中最著名的是:PageSpeed,ModSecurity,RTMP,Lua等......

靜態模塊與動態模塊

從第一個版本開始,NGINX中就存在靜態模塊。 2月1.9.11中使用NGINX 2016 +引入了動態模塊。

對於靜態模塊,構成NGINX二進製文件的模塊集在編譯時由 ./configure 腳本。 靜態模塊使用 --with-foo_bar_module or --add-module=PATH 句法。

要將核心(標準)模塊編譯為動態我們添加 =dynamic,例如 --with-http_image_filter_module=dynamic.

要將第三方模塊編譯為動態我們使用 --add-dynamic-module=/path/to/module 語法然後我們通過使用加載它們 load_module 在全球範圍內的指令 nginx.conf 文件。

從源代碼構建NGINX的要求

與其他一些UNIX / Linux軟件相比,NGINX非常輕量級,並且沒有很多庫依賴項。 默認構建配置僅依賴於要安裝的3庫: OpenSSL的/LibreSSL/BoringSSL, 的ZlibPCRE.

注意:NGINX也可以編譯 LibreSSLBoringSSL 加密庫而不是 OpenSSL的.

要求

  • 運行Ubuntu 18.04 LTS的服務器。
  • 具有sudo權限的非root用戶。

初步步驟

檢查Ubuntu版本:

lsb_release -ds
#Ubuntu 18.04 LTS

設置時區:

timedatectl list-timezone
sudo timedatectl set-timezone'地區/城市'

更新操作系統的軟件包:

sudo apt更新&& sudo apt升級-y

從源代碼構建NGINX

NGINX是一個用來編寫的程序 C,所以你首先需要安裝一個編譯工具。 安裝 build-essential, gittree 包:

sudo apt install -y build-essential git tree

下載最新的主流版NGINX源代碼並解壓縮。 NGINX源代碼作為壓縮存檔(gzipped tarball)分發,與大多數Unix和Linux軟件一樣:

wget https://nginx.org/download/nginx-1.15.0.tar.gz && tar zxvf nginx-1.15.0.tar.gz

下載強制性NGINX依賴項的源代碼並提取它們:

#PCRE版本8.42
wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz && tar xzvf pcre-8.42.tar.gz
#zlib版本1.2.11
wget https://www.zlib.net/zlib-1.2.11.tar.gz && tar xzvf zlib-1.2.11.tar.gz
#OpenSSL版本1.1.0h
wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz && tar xzvf openssl-1.1.0h.tar.gz

安裝可選的NGINX依賴項:

sudo add-apt-repository -y ppa:maxmind / ppa
sudo apt更新&& sudo apt升級-y
sudo apt install -y perl libperl-dev libgd3 libgd-dev libgeoip1 libgeoip-dev geoip-bin libxml2 libxml2-dev libxslt1.1 libxslt1-dev

清理所有 .tar.gz 文件。 我們不再需要它們了:

rm -rf * .tar.gz

輸入NGINX源目錄:

cd~ / nginx-1.15.0

對於良好的度量列表目錄和組成NGINX源代碼的文件 tree 效用:

tree -L 2。

將NGINX手冊頁複製到 /usr/share/man/man8/ 目錄:

sudo cp~ / nginx-1.15.0 / man / nginx.8 / usr / share / man / man8
sudo gzip /usr/share/man/man8/nginx.8
ls / usr / share / man / man8 / | grep nginx.8.gz
#檢查NGINX的Man頁面是否正常工作:
男人nginx

Nginx手冊頁

如需幫助,您可以通過運行以下命令查看最新的NGINX編譯時選項的完整列表:

./configure -help
#要查看是否可以將核心模塊構建為動態運行:
./configure -help | grep -F =動態

配置,編譯和安裝NGINX:

./configure -prefix = / etc / nginx
-sbin路徑= / usr / sbin目錄/ nginx的
- 模塊路徑= / usr / lib中/ nginx的/模塊
-conf路徑= /等/ nginx的/ nginx.conf
-error日誌路徑= /無功/日誌/ nginx的/ error.log中
-pid路徑= /變種/運行/ nginx.pid
-lock路徑= /變種/運行/ nginx.lock
-user = nginx的
-group = nginx的
-build = Ubuntu的
-builddir = nginx的-1.15.0
-with-select_module
-with-poll_module
-with線程
-with文件-AIO
-with-http_ssl_module
-with-http_v2_module
-with-http_realip_module
-with-http_addition_module
-with-http_xslt_module =動態
-with-http_image_filter_module =動態
-with-http_geoip_module =動態
-with-http_sub_module
-with-http_dav_module
-with-http_flv_module
-with-http_mp4_module
-with-http_gunzip_module
-with-http_gzip_static_module
-with-http_auth_request_module
-with-http_random_index_module
-with-http_secure_link_module
-with-http_degradation_module
-with-http_slice_module
-with-http_stub_status_module
-with-http_perl_module =動態
-with-perl_modules_path =的/ usr /共享/的Perl / 5.26.1
-with-perl的=在/ usr /斌/ perl的
-http日誌路徑= /無功/日誌/ nginx的/ access.log的
-http客戶端體-TEMP-路徑= /變種/高速緩存/ nginx的/ client_temp
-http代理-TEMP-路徑= /變種/高速緩存/ nginx的/ proxy_temp那
-http-的fastcgi-TEMP-路徑= /變種/高速緩存/ nginx的/ fastcgi_temp
-http-uwsgi-TEMP-路徑= /變種/高速緩存/ nginx的/ uwsgi_temp
-http-SCGI-TEMP-路徑= /變種/高速緩存/ nginx的/ scgi_temp
-with郵件=動態
-with-mail_ssl_module
-with流=動態
-with-stream_ssl_module
-with-stream_realip_module
-with-stream_geoip_module =動態
-with-stream_ssl_preread_module
-with-COMPAT
-with-PCRE = .. / PCRE-8.42
-with-PCRE-JIT
-with-ZLIB = .. / ZLIB-1.2.11
-with-的OpenSSL = .. / OpenSSL的-1.1.0h
-with-的OpenSSL選擇=無nextprotoneg
-with調試
使
sudo make install

建立NGINX後,導航到家(~) 目錄:

CD〜

符號鏈接 /usr/lib/nginx/modules/etc/nginx/modules 目錄。 etc/nginx/modules 是NGINX模塊的標準位置:

sudo ln -s / usr / lib / nginx / modules / etc / nginx / modules

打印NGINX版本,編譯器版本並配置腳本參數:

sudo nginx -V
#nginx版本:nginx / 1.15.0(Ubuntu)
#由gcc 7.3.0構建(Ubuntu 7.3.0-16ubuntu3)
#使用OpenSSL 1.1.0h 27 Mar 2018構建
#TLS SNI支持已啟用
#configure arguments:-prefix = / etc / nginx -sbin-path = / usr / sbin / nginx -modules-path = / usr / lib / nginx / modules
#。 。 。
#。 。 。

創建NGINX系統組和用戶:

sudo adduser -system -home / nonexistent -shell / bin / false -no-create-home -disabled-login -disabled-password -gecos“nginx user”-group nginx

檢查NGINX語法和潛在錯誤:

sudo nginx -t
#將引發此錯誤-> nginx:[emerg] mkdir()“ / var / cache / nginx / client_temp”失敗(2:沒有此類文件或目錄)
#創建NGINX緩存目錄並設置適當的權限
sudo mkdir -p / var / cache / nginx / client_temp / var / cache / nginx / fastcgi_temp / var / cache / nginx / proxy_temp / var / cache / nginx / scgi_temp / var / cache / nginx / uwsgi_temp
sudo chmod 700 / var / cache / nginx / *
sudo chown nginx:root / var / cache / nginx / *
#重新檢查語法和潛在錯誤。
sudo nginx -t

創建NGINX systemd單元文件:

sudo vim /etc/systemd/system/nginx.service

將以下內容複製/粘貼到 /etc/systemd/system/nginx.service 文件:

[單位]描述= nginx  - 高性能網絡服務器文檔= https://nginx.org/en/docs/之後= network-online.target remote-fs.target nss-lookup.target Wants = network-online.target [服務] Type = forking PIDFile = / var / run / nginx.pid ExecStartPre = / usr / sbin / nginx -t -c /etc/nginx/nginx.conf ExecStart = / usr / sbin / nginx -c / etc / nginx / nginx.conf ExecReload = / bin / kill -s HUP $ MAINPID ExecStop = / bin / kill -s TERM $ MAINPID [Install] WantedBy = multi-user.target

啟用NGINX以啟動並立即啟動NGINX:

sudo systemctl啟用nginx.service
sudo systemctl啟動nginx.service

檢查NGINX是否會在重啟後自動啟動:

sudo systemctl已啟用nginx.service
#enabled

通過運行以下命令之一檢查NGINX是否正在運行:

sudo systemctl status nginx.service
# 要么
ps aux | grep nginx
# 要么
curl -I 127.0.0.1

您也可以打開瀏覽器並導航到您的域/ IP地址以查看默認的NGINX頁面。 這是NGINX啟動並運行的指標。

Nginx歡迎頁面

創建簡單的防火牆(UFW)NGINX應用簡介:

sudo vim /etc/ufw/applications.d/nginx

將以下內容複製/粘貼到 /etc/ufw/applications.d/nginx 文件:

[Nginx HTTP] title = Web服務器(Nginx,HTTP)描述=小但非常強大和高效的Web服務器端口= 80 / tcp [Nginx HTTPS] title = Web服務器(Nginx,HTTPS)description =小,但功能非常強大高效的Web服務器端口= 443 / tcp [Nginx Full] title = Web服務器(Nginx,HTTP + HTTPS)description =小而強大且高效的Web服務器端口= 80,443 / tcp

驗證是否已創建和識別UFW應用程序配置文件:

sudo ufw應用程序列表
#可用應用程序:
#Nginx Full
#Nginx HTTP
#Nginx HTTPS
#OpenSSH

NGINX默認情況下會生成備份 .default 在文件 /etc/nginx。 去掉 .default 從文件 /etc/nginx目錄:

sudo rm /etc/nginx/*.default

將Vim編輯器的NGINX配置的語法高亮顯示放入 ~/.vim:

#對於普通的非root用戶mkdir~ / .vim / cp -r~ / nginx-1.15.0 / contrib / vim / *〜/ .vim /#對於root用戶sudo mkdir /root/.vim/ sudo cp -r~ / nginx-1.15.0 / contrib / vim / * /root/.vim/

注意:通過執行上述步驟,在Vim編輯器中編輯NGINX配置文件時,您將獲得一個很好的語法高亮顯示。

Nginx語法在Vim中突出顯示

創建 conf.d, snippets, sites-availablesites-enabled 目錄 /etc/nginx 目錄:

sudo mkdir /etc/nginx/{conf.d,snippets,sites-available,sites-enabled}

更改NGINX日誌文件的權限和組所有權:

sudo chmod 640 / var / log / nginx / *
sudo chown nginx:adm /var/log/nginx/access.log /var/log/nginx/error.log

為NGINX創建logrotation配置。

sudo vim /etc/logrotate.d/nginx

使用以下文本填充文件,然後保存並退出:

/var/log/nginx/*.log {每日missok旋轉52壓縮延遲壓縮notifempty創建640 nginx adm sharedscripts postrotate if [-f /var/run/nginx.pid]; 然後殺死-USR1`cat / var / run / nginx.pid` fi endscript}

從主目錄中刪除所有下載的文件:

CD〜
rm -rf nginx-1.15.0 / openssl-1.1.0h / pcre-8.42 / zlib-1.2.11 /

而已。 現在,您通過從源代碼構建NGINX來安裝最新版本的NGINX。 它是針對一些重要的庫(如OpenSSL)進行靜態編譯的。 通常,系統提供的OpenSSL版本已過時。 通過使用這種使用較新版本的OpenSSL進行安裝的方法,您可以利用新的密碼 CHACHA20_POLY1305 和協議 TLS 1.3的 這將在OpenSSL中提供 1.1.1. 此外,通過編譯自己的二進製文件,您可以定制NGINX將提供的功能,這比安裝預先構建的二進製文件更靈活。

 

資源

相關文章