nginx使用熱部署新增新模組

Johnson木木 發表於 2020-06-30

簡介

當初次編譯安裝nginx時,http_ssl_module 模組預設是不編譯進nginx的二進位制檔案當中,如果需要新增 ssl 證書。也就是使用 https協議。那麼則需要新增 http_ssl_module 模組。假設你的nginx安裝包目錄在/home/johnson/nginx-1.17.5,下面會用到

小知識點:使用/home/johnson/nginx-1.17.5/configure --help 命令,可以看到很多 --with--without 開頭的模組選項。

  • --with:預設是不編譯進nginx的二進位制檔案當中
  • --without:預設編譯進nginx的二進位制檔案當中
/home/johnson/nginx-1.17.5/configure --help
...
  --with-http_ssl_module             enable ngx_http_ssl_module
...
  --without-http_gzip_module         disable ngx_http_gzip_module
...

可以看到http_ssl_module 模組預設是不編譯進nginx的二進位制檔案當中。

編譯新增新模組

當需要新增http_ssl_module模組時,命令如下:

/home/johnson/nginx-1.17.5/configure --with-http_ssl_module

執行完該命令後,可以在/home/johnson/nginx-1.17.5/objs/ngx_modules.c檔案中看到哪些模組要安裝到nginx中。如下:

ngx_module_t *ngx_modules[] = {
    &ngx_core_module,
...
    &ngx_http_ssl_module,
...

可以看到http_ssl_module模組要安裝到nginx當中,然後使用make命令,把http_ssl_module編譯進nginx的二進位制檔案當中

cd /home/johnson/nginx-1.17.5
make

執行完上述命令後,/home/johnson/nginx-1.17.5/objs/nginx該檔案就是編譯後的nginx二進位制檔案,然後我們們就需要進行熱部署升級了。

熱部署

假設你的nginx安裝目錄在/usr/local/nginx當中。

  1. 備份正在使用的nginx二進位制檔案
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
  1. 使用最新的nginx二進位制檔案替換掉正在使用的nginx二進位制檔案
cp -r /home/johnson/nginx-1.17.5/objs/nginx /usr/local/nginx/sbin/ -f
  1. 檢視正在執行nginx的master程式
ps -ef | grep nginx
root      6503     1  0 Jun23 ?        00:00:00 nginx: master process nginx
ubuntu   26317 19063  0 07:39 pts/0    00:00:00 grep --color=auto nginx
nobody   31869  6503  0 Jun27 ?        00:00:00 nginx: worker process

可以看到,當前nginx的master程式號為 6503。

  1. 告知正在執行的nginx的master程式,需要進行nginx升級
kill -USR2 6503
ps -ef | grep nginx
root      6503     1  0 Jun23 ?        00:00:00 nginx: master process nginx
root      7128  6503  0 08:05 ?        00:00:00 nginx: master process nginx
nobody    7129  7128  0 08:05 ?        00:00:00 nginx: worker process
root      7140 30619  0 08:05 pts/0    00:00:00 grep --color=auto nginx
nobody   31869  6503  0 Jun27 ?        00:00:00 nginx: worker process

可以看到,執行完命令後會啟動新的nginx的master程式,新的master程式是由舊的master程式啟動的。如果沒有啟動,那麼可以使用nginx -t檢視配置檔案是否正確,如果沒有問題,那麼一般是能夠啟動新的master程式。

  1. 告知舊的nginx master程式,請優雅的關閉所有舊的worker程式
kill -WINCH 6503
[email protected]:/usr/local/nginx# ps -ef | grep nginx
root      6503     1  0 Jun23 ?        00:00:00 nginx: master process nginx
root      7128  6503  0 08:05 ?        00:00:00 nginx: master process nginx
nobody    7129  7128  0 08:05 ?        00:00:00 nginx: worker process
root      9431 30619  0 08:17 pts/0    00:00:00 grep --color=auto nginx

可以看到,舊的worker程式都已經關閉掉。如果發生了錯誤,則可以使用nginx -s reload命令回退到舊版本當中。
如果發現一切都正常,沒有問題,那麼你可以關閉掉舊的master程式。kill -9 6503,此時新的master程式的父程式(舊的master程式)被關閉後,那麼會把他的父程式改成系統程式,系統程式的程式號為 1。
此時就完美新增了新模組和實現熱部署了!!!

總結

因為初次編譯nginx,可能沒想到要用到其他模組,或許也可能刪除某些模組。此時往往就需要使用到nginx的熱部署。
參考文章:極客時間Nginx核心知識100講: 第10講

個人部落格網址: https://colablog.cn/

如果我的文章幫助到您,可以關注我的微信公眾號,第一時間分享文章給您
微信公眾號