系統基於
ubuntu server 14.04.4 amd64
html
從Nginx官網下載Nginx,或者在Linux上執行wget http://nginx.org/download/nginx-1.10.1.tar.gz
命令直接下載
解壓nginx-1.10.1.tar.gz
文件:nginx
tar zxvf nginx-1.10.1.tar.gz
cd nginx-1.10.1 ./configure --prefix=/usr/local/nginx
注意:
① 若是以前沒有安裝C compiler(C 編譯器),這一步將報以下錯誤信息:ubuntu
xueliang@dev:~/download/nginx-1.10.1$ ./configure --prefix=/usr/local/nginx
checking for OSui
./configure: error: C compiler cc is not foundcode
xueliang@dev:~/download/nginx-1.10.1$server
能夠參考這篇文章安裝C compiler,而後繼續下面的操做htm
② 若是以前沒有安裝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 foundip
./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=option. md5
xueliang@dev:~/download/nginx-1.10.1$
能夠參考這篇文章安裝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=option.
xueliang@dev:~/download/nginx-1.10.1$
能夠參考這篇文章安裝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的安裝部分的第1、二步。
由於只是對Nginx進行升級,並不涉及配置參數的修改,因此,咱們通常使用和舊版本相同的配置(固然你也可使用全新的配置信息),來編譯新版本的Nginx,使用以下命令查看舊版本配置信息:
/usr/local/nginx/sbin/nginx -V
能夠獲得結果以下:
xueliang@dev:~/download/nginx-1.11.1$ /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$
其中 [configure arguments: --prefix=/usr/local/nginx] 這一行即爲舊版本Nginx配置信息,這裏能夠看出,舊版本只是指定了安裝路徑,使用[configure arguments:]後面的參數信息,對新版本Nginx做相同配置,而後進行編譯:
./configure --prefix=/usr/local/nginx
make
在上一步的基礎上,執行一下命令便可:
sudo cp objs/nginx /usr/local/nginx/sbin/nginx
執行這條命令,可能會報如下異常,提示文件被佔用:
xueliang@dev:~/download/nginx-1.11.1$ 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$
可使用如下命令進行強制覆蓋:
sudo cp -rfp objs/nginx /usr/local/nginx/sbin/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主進程號
通過一段時間後,舊的工做進程(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版本:
/usr/local/nginx/sbin/nginx -v
結果:
xueliang@dev:~$ /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.11.1
xueliang@dev:~$
或者:
/usr/local/nginx/sbin/nginx -V
結果:
xueliang@dev:~$ /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:~$
這裏能夠看出,正在運行的Nginx版本爲1.11.1
,參照安裝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
這一步能夠參考平滑升級的第四至八步