Nginx 熱部署和日誌切割,你學會了嗎?

上篇文章,咱們已經安裝好 Nginx,而且配置好 Nginx 文件後,這個時候我就須要操做 Nginx 的命令行了,這篇文章主要講解 Nginx 命令行相關知識,並經過平常遇到的熱部署、切割日誌文件場景來熟悉 Nginx 命令行操做。html

推薦閱讀:Nginx 瞭解一下?linux

Nginx 命令行

  1. 格式:nginx -s stop
  2. 幫助:-? -h
  3. 使用指定的配置文件:-c
  4. 指定配置指令:-g (用途是覆蓋配置文件中的指令)
  5. 指定運行目錄:-p
  6. 發送信號:-s(馬上中止服務:stop,優雅的中止服務:quit,從新配置文件:reload,從新開始記錄日誌文件:reopen)
  7. 測試配置文件是否有語法錯誤:-t -T
  8. 打印 nginx 的版本信息、編譯信息等:-v -V

Nginx 命令和大部分的 Linux 的命令很類似,都是 nginx 加基本指令,再加指令相關的參數。默認狀況下 nginx 會去尋找以前執行 configure 命令時指定位置的配置文件,可是能夠經過 -c 來指定配置文件,而且能夠經過 -g 來指定配置指令。nginx

nginx 去操做運行中進程的方法通常是經過發送信號,能夠經過 linux 通用的 kill 命令,也能夠用 nginx 的 -s 命令來發送信號。shell

接下來,讓咱們經過幾個栗子來熟悉 Nginx 的命令行操做。bash

重載配置文件

配置文件默認是在安裝目錄的 conf 文件下,文件名爲 nginx.conf,咱們能夠打開看一下:app

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;

    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

假如咱們須要開啓 gzip 壓縮,咱們能夠把它前面的註釋去掉,當咱們在修改完 nginx 配置文件後,咱們能夠經過 nginx 的命令 ./nginx -s reload 重啓 nginx 服務。tcp

Nginx 熱部署

當從老版本替換爲新版本的 nginx 的時候,若是不熱部署的話,會須要取消 nginx 服務並重啓服務才能替換成功,這樣的話會使正在訪問的用戶在斷開鏈接,因此爲了在不影響用戶的體驗下進行版本升級,就須要熱部署來升級版本。測試

接下來,讓咱們一塊兒進行一次熱部署吧。ui

由於進行升級主要是更換二進制文件,因此在升級前先備份舊的二進制文件。.net

# 備份舊版本的 nginx 二進制文件
mv /usr/local/nginx/sbin/nginx  /usr/local/nginx/sbin/nginx.old

而後下載最新版本的 nginx,解壓後進行編譯,再把編譯好的最新版本的 nginx 二進制文件拷貝到安裝目錄下的 sbin 目錄下。

# 到官網下載最新版本的 nginx
wget http://nginx.org/download/nginx-1.17.2.tar.gz
# 解壓
tar -xzvf nginx-1.17.2.tar.gz
cd nginx-1.17.2
./configure --prefix=/usr/local/nginx
# 編譯
make
# 替換舊的 nginx 的執行程序
cp -r /usr/local/nginx-1.16.1/objs/nginx /usr/local/nginx/sbin/ -f

經過 ps -ef | grep nginx 來查看 nginx 運行情況:

[root@wupx sbin]# ps -ef | grep nginx 
root      1752     1  0 20:39 ?        00:00:00 nginx: master process ./sbin/nginx
nobody    1783  1752  0 20:41 ?        00:00:00 nginx: worker process
root      1787     1  0 20:41 ?        00:00:00 wget http://nginx.org/download/nginx-1.17.2.tar.gz
root      4357  1708  0 21:00 pts/2    00:00:00 grep --color=auto nginx

能夠看到目前啓動的 nginx 的 PID 爲 1752,下面須要給正在運行的 nginx 的 master 進程發送信號,告訴它咱們要進行熱部署了。

# 發送 USR2 信號給舊版本主進程號,使 nginx 的舊版本中止接收請求,用 nginx 新版本接替
kill -USR2 1752

再經過 ps -ef | grep nginx 來查看 nginx 運行情況:

[root@wupx sbin]# ps -ef | grep nginx 
root      1752     1  0 20:39 ?        00:00:00 nginx: master process ./sbin/nginx
nobody    1783  1752  0 20:41 ?        00:00:00 nginx: worker process
root      1787     1  0 20:41 ?        00:00:00 wget http://nginx.org/download/nginx-1.17.2.tar.gz
root      4391  1752  0 21:02 ?        00:00:00 nginx: master process ./sbin/nginx
nobody    4392  4391  0 21:02 ?        00:00:00 nginx: worker process
root      4394  1708  0 21:07 pts/2    00:00:00 grep --color=auto nginx

這個時候咱們須要給老的 nginx 發送信號,告訴老的 nginx 請優雅的關閉全部的 worker 進程。

# 發送 WINCH 信號到舊的主進程,它會通知舊的 worker 進程優雅的關閉,而後退出
kill -WINCH 1752

從新在查看 nginx 狀態:

[root@wupx sbin]# ps -ef | grep nginx 
root      1752     1  0 20:39 ?        00:00:00 nginx: master process ./sbin/nginx
root      1787     1  0 20:41 ?        00:00:00 wget http://nginx.org/download/nginx-1.17.2.tar.gz
root      4391  1752  0 21:02 ?        00:00:00 nginx: master process ./sbin/nginx
nobody    4392  4391  0 21:02 ?        00:00:00 nginx: worker process
root      4402  1708  0 21:08 pts/2    00:00:00 grep --color=auto nginx

也能夠發現老的 nginx maser 進程還存在,它的意義是:若是存在問題,須要退回到老版本中,咱們能夠給它發送 reload 命令,讓他從新把 worker 進程拉起來、把新版本關掉。保留在這裏方便咱們作版本回退。

若是要退出保留的 master 進程,能夠經過 kill -QUIT 命令來完成:

# 發送 QUIT 信號到舊的主進程,它會退出保留的 master 進程
kill -QUIT 1752

執行完後,1752 進程退出,經過 netstat lntup 能夠看到 80 端口已經被 4391 進程監聽了(新版本 nginx 的進程)。

到此爲止,咱們就完成了 nginx 的熱部署。

日誌切割

爲了不日誌文件過大不方便查看,所以須要對日誌切割。首先將原先的日誌進行備份:

# 備份原日誌
mv error.log old_error.log

查看日誌大小:

[root@wupx logs]# ll
total 20
-rw-r--r-- 1 root root 6789 Nov  6 22:28 access.log
-rw-r--r-- 1 root root    5 Nov  6 22:16 nginx.pid
-rw-r--r-- 1 root root 7831 Nov  6 22:28 old_error.log

接下來進行日誌切割:

# 日誌切割
/usr/local/nginx/sbin/nginx -s reopen

再次查看:

[root@wupx logs]# ll
total 24
-rw-r--r-- 1 nobody root 6789 Nov  6 22:28 access.log
-rw-r--r-- 1 nobody root   60 Nov  6 22:30 error.log
-rw-r--r-- 1 root   root    5 Nov  6 22:16 nginx.pid
-rw-r--r-- 1 root   root 7831 Nov  6 22:28 old_error.log

通過上面的操做,咱們就完成了日誌的切割,以上操做只是爲了瞭解日誌切割的操做流程,不建議直接生產這麼使用。推薦先寫成一個 shell 腳本,經過 shell 腳本去定時執行。

示例腳本:

#!/bin/bash
LOGS_PATH=/usr/local/nginx/logs/history
CUR_LOGS_PATH=/usr/local/nginx/logs
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
mv ${CUR_LOGS_PATH}/access.log ${LOGS_PATH}/old_access_${YESTERDAY}.log
mv ${CUR_LOGS_PATH}/error.log ${LOGS_PATH}/old_error_${YESTERDAY}.log
## 向 NGINX 主進程發送 USR1 信號。USR1 信號是從新打開日誌文件
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)

總結

這篇文章主要介紹了 Nginx 命令行相關知識,並介紹了重載配置文件、Nginx 熱部署、日誌切割等操做,仍是須要多實踐操做,實踐出真知。

file

file

相關文章
相關標籤/搜索