上篇文章,咱們已經安裝好 Nginx,而且配置好 Nginx 文件後,這個時候我就須要操做 Nginx 的命令行了,這篇文章主要講解 Nginx 命令行相關知識,並經過平常遇到的熱部署、切割日誌文件場景來熟悉 Nginx 命令行操做。html
推薦閱讀:Nginx 瞭解一下?linux
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 服務並重啓服務才能替換成功,這樣的話會使正在訪問的用戶在斷開鏈接,因此爲了在不影響用戶的體驗下進行版本升級,就須要熱部署來升級版本。測試
接下來,讓咱們一塊兒進行一次熱部署吧。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 熱部署、日誌切割等操做,仍是須要多實踐操做,實踐出真知。