Linux下Nginx的安裝、升級及動態添加模塊

原文連接:http://xueliang.org/article/detail/20160615172540639html

系統基於ubuntu server 14.04.4 amd64nginx

安裝

第一步 下載並解壓Nginx壓縮包

Nginx官網下載Nginx,或者在Linux上執行wget http://nginx.org/download/nginx-1.10.1.tar.gz命令直接下載
解壓nginx-1.10.1.tar.gz文件:ubuntu

tar zxvf nginx-1.10.1.tar.gz

第二步 配置

cd nginx-1.10.1
./configure --prefix=/usr/local/nginx

注意:
若是以前沒有安裝C compiler(C 編譯器),這一步將報以下錯誤信息:segmentfault

xueliang@dev:~/download/nginx-1.10.1$ ./configure --prefix=/usr/local/nginx
checking for OSui

    • Linux 4.2.0-27-generic x86_64code

    1. for C compiler ... not foundserver

    ./configure: error: C compiler cc is not foundhtm

    xueliang@dev:~/download/nginx-1.10.1$進程

    能夠參考這篇文章安裝C compiler,而後繼續下面的操做ip

    若是以前沒有安裝PCRE,這一步將報以下錯誤信息:

    checking for PCRE library ... not found

    checking for PCRE library in /usr/local/ ... not found
    checking for PCRE library in /usr/include/pcre/ ... not found
    checking for PCRE library in /usr/pkg/ ... not found
    checking for PCRE library in /opt/local/ ... not found

    ./configure: error: the HTTP rewrite module requires the PCRE library.

    You can either disable the module by using --without-http_rewrite_module
    option, or install the PCRE library into the system, or build the PCRE library
    statically from the source with nginx by using --with-pcre=<path> option.

    xueliang@dev:~/download/nginx-1.10.1&dollar;

    能夠參考這篇文章安裝PCRE,而後繼續下面的操做

    若是以前沒有安裝zlib,這一步將報以下錯誤信息:

    checking for md5 in system md library ... not found
    checking for md5 in system md5 library ... not found
    checking for md5 in system OpenSSL crypto library ... not found
    checking for sha1 in system md library ... not found
    checking for sha1 in system OpenSSL crypto library ... not found
    checking for zlib library ... not found

    ./configure: error: the HTTP gzip module requires the zlib library.
    You can either disable the module by using --without-http_gzip_module
    option, or install the zlib library into the system, or build the zlib library
    statically from the source with nginx by using --with-zlib=<path> option.

    xueliang@dev:~/download/nginx-1.10.1&dollar;

    能夠參考這篇文章安裝zlib,而後繼續下面的操做

    也能夠跳過此步,執行默認安裝,--prefix的默認值爲/usr/local/nginx,Nginx官網對此有說明:Building nginx from Sources

    第三步 編譯

    make

    第四步 完成安裝

    sudo make install

    平滑升級

    當須要對正在運行的Nginx進行升級時,能夠在不中止Nginx的狀況下,使用新版本或者重編譯的可執行程序替換舊版本的可執行程序,這裏咱們從nginx-1.10.1升級到nginx-1.11.1

    第一步 備份舊版本

    由於Nginx的升級,實質只是用新版本的可執行文件,替換舊版本的可執行程序,因此,對於備份,既能夠只備份舊版本可執行文件,也能夠打包備份整個舊版本安裝目錄,參考命令分別以下:
    只備份舊版本可執行文件

    sudo cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak

    打包備份整個舊版本安裝目錄

    sudo tar -cvf /usr/local/nginx.bak /usr/local/nginx

    第二步 下載新版本並解壓Nginx壓縮包

    對於新版本Nginx壓縮包的下載和解壓,能夠參考本文關於Nginx的安裝部分的第1、二步。

    第三步 使用舊版本配置參數,配置並編譯新版本Nginx

    由於只是對Nginx進行升級,並不涉及配置參數的修改,因此,咱們通常使用和舊版本相同的配置(固然你也可使用全新的配置信息),來編譯新版本的Nginx,使用以下命令查看舊版本配置信息:

    /usr/local/nginx/sbin/nginx -V

    能夠獲得結果以下:

    xueliang@dev:~/download/nginx-1.11.1&dollar; /usr/local/nginx/sbin/nginx -V
    nginx version: nginx/1.10.1
    built by gcc 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)
    configure arguments: --prefix=/usr/local/nginx
    xueliang@dev:~/download/nginx-1.11.1&dollar;

    其中 [configure arguments: --prefix=/usr/local/nginx] 這一行即爲舊版本Nginx配置信息,這裏能夠看出,舊版本只是指定了安裝路徑,使用[configure arguments:]後面的參數信息,對新版本Nginx做相同配置,而後進行編譯:

    ./configure --prefix=/usr/local/nginx

    第四步 編譯新版本Nginx可執行程序

    make

    第五步 用新版本Nginx可執行程序覆蓋舊版本可執行程序

    在上一步的基礎上,執行一下命令便可:

    sudo cp objs/nginx /usr/local/nginx/sbin/nginx

    執行這條命令,可能會報如下異常,提示文件被佔用:

    xueliang@dev:~/download/nginx-1.11.1&dollar; sudo cp objs/nginx /usr/local/nginx/sbin/nginx
    cp: cannot create regular file ‘/usr/local/nginx/sbin/nginx’: Text file busy
    xueliang@dev:~/download/nginx-1.11.1&dollar;

    可使用如下命令進行強制覆蓋:

    sudo cp -rfp objs/nginx /usr/local/nginx/sbin/nginx

    第六步 啓動新版本Nginx主進程

    發送 USR2信號給舊版本主進程號:

    kill -USR2 舊版本的Nginx主進程號

    舊版本Nginx主進程接收到-USR2信號,將重命名它的.pid文件爲.oldpid,而後執行新版本的Nginx可執行程序,依次啓動新版本的主進程和工做進程:

    PID PPID USER %CPU VSZ WCHAN COMMAND
    33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
    33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
    33135 33126 nobody 0.0 1380 kqread nginx: worker process (nginx)
    33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
    36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
    36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
    36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
    36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)

    第七步 從容關閉舊版本的工做進程

    此時,新、舊版本的Nginx實例會同時運行,共同處理請求,若是此時給舊版本主進程發送WINCH 信號,舊版本主進程將會給它的工做進程發送消息,請求它們從容關閉,此後,舊版本的工做進程開始逐步退出:

    PID PPID USER %CPU VSZ WCHAN COMMAND
    33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
    33135 33126 nobody 0.0 1380 kqread nginx: worker process is shutting down (nginx)
    36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
    36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
    36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
    36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)

    從容關閉舊版本的工做進程命令:

    kill -WINCH 舊版本的Nginx主進程號

    第八步 從容關閉舊版本的主進程,完成Nginx的升級

    通過一段時間後,舊的工做進程(work process)處理完了全部已鏈接的請求後退出,僅由新版本的工做進程來處理新的請求了:

    PID PPID USER %CPU VSZ WCHAN COMMAND
    33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
    36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
    36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
    36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
    36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)

    應該注意的是,此時,舊版本的主進程還還沒有關閉它監聽的套接字,若是有須要,你仍能夠恢復舊版本工做進程。若是因爲某些緣由,新版本的可執行文件運行狀況不理想,下面有幾種方案可供參考:

    • 給舊版本主進程發送 HUP 信號。舊版本主進程將在不從新讀取配置信息的狀況下,從新開啓工做進程。而後,經過給新版本主進程發送 QUIT 信號,全部新版本的進程將會從容關閉。

    • 給新版本主進程發送 TERM 信號。而後,他將會給它的工做進程發送消息,要求它們當即退出,緊接着,這些工做進程就會當即退出。(若是由於某些緣由,新版本進程沒有退出,應該給新版本主進程發送 KILL 信號,強制新版本主進程退出。)新版本主進程退出的同時,舊版本主進程將會自動啓動它的工做進程。
      新版本主進程退出後,舊版本主進程將會移除名字以.oldpid 結尾的文件,恢復爲它的 .pid 文件。

    若是升級成功,應該給舊版本主進程發送 QUIT 信號,使其退出,只保留新版本進程:

    PID PPID USER %CPU VSZ WCHAN COMMAND
    36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
    36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
    36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
    36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)

    添加模塊

    剛接觸Nginx時,只知道Nginx的功能是分模塊的,並不清楚有些模塊默認是不參與到構建中去的,好比ngx_http_ssl_module模塊,是用來支持https協議的,默認狀況下是沒有構建到Nginx中的。
    隨着業務不斷擴展,若是須要Nginx支持某些模塊,而這些模塊默認不在Nginx的構建計劃中,構建Nginx時,又沒有指定加入這些模塊,該怎麼辦呢?是否可以給已經運行的Nginx動態添加這些模塊呢?答案是確定的!
    給運行中的Nginx動態添加模塊的方案,與上面提到的平滑升級Nginx的方案很相似。下面咱們來看一下如何給運行中的Nginx添加 ngx_http_ssl_module 模塊。

    第一步 查看運行中的Nginx版本,並下載、解壓對應版本的壓縮包

    查看Nginx版本:

    /usr/local/nginx/sbin/nginx -v

    結果:

    xueliang@dev:~&dollar; /usr/local/nginx/sbin/nginx -v

    nginx version: nginx/1.11.1
    xueliang@dev:~&dollar;

    或者:

    /usr/local/nginx/sbin/nginx -V

    結果:

    xueliang@dev:~&dollar; /usr/local/nginx/sbin/nginx -V

    nginx version: nginx/1.11.1
    built by gcc 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)
    configure arguments: --prefix=/usr/local/nginx
    xueliang@dev:~&dollar;

    這裏能夠看出,正在運行的Nginx版本爲1.11.1,參照安裝Nginx部分,下載並解壓對應版本的Nginx

    第二步 編譯Nginx,同時加入須要模塊配置

    參考平滑升級的第三步,查看運行中的Nginx的配置參數,並在最後追加 -with-http_ssl_module
    如:原配置信息爲 --prefix=/usr/local/nginx,則新配置信息爲 --prefix=/usr/local/nginx --with_http_ssl_module,配置Nginx執行的命令以下:

    ./configure --prefix=/usr/local/nginx --with_http_ssl_module

    第三步 平滑重啓Nginx,完成動態模塊添加

    這一步能夠參考平滑升級的第四至八步

    相關文章
    相關標籤/搜索