Nginx的基本使用

# Nginx 常用命令

Nginx的指令格式为 nginx [options argument]

  • 查看帮助
1
./sbin/nginx  -?
  • 使用指定的配置文件
1
./sbin/nginx -c filename
  • 指定运行目录
1
./sbin/nginx -p /home/mazhen/nginx/
  • 设置配置指令,覆盖配置文件中的指令
1
./sbin/nginx -g directives
  • 向 Nginx 发送信号

我们可以向 Nginx 进程发送信号,控制运行中的 Nginx。一种方法是使用 kill 命令,也可以使用 nginx -s

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 重新加载配置
$ ./sbin/nginx -s reload

# 立即停止服务
$ ./sbin/nginx -s stop

# 优雅停止服务
$ ./sbin/nginx -s quit

# 重新开始记录日志文件
$ ./sbin/nginx -s reopen
  • 测试配置文件是否有语法错误
1
./sbin/nginx  -t/-T
  • 打印nginx版本
1
./sbin/nginx  -v/-V

# 热部署

在不停机的情况下升级正在运行的 Nginx 版本,就是热部署。

首先查看正在运行的 Nginx:

1
2
3
4
5
6
7
$ ps aux | grep nginx
mazhen      4376  0.0  0.0   9896  2372 ?        Ss   16:47   0:00 nginx: master process ./sbin/nginx
mazhen      4402  0.0  0.0  10324  2104 ?        S    16:50   0:00 nginx: worker process
mazhen      4403  0.0  0.0  10324  2104 ?        S    16:50   0:00 nginx: worker process
mazhen      4404  0.0  0.0  10324  2104 ?        S    16:50   0:00 nginx: worker process
mazhen      4405  0.0  0.0  10324  2104 ?        S    16:50   0:00 nginx: worker process
mazhen      4407  0.0  0.0  12184  2316 pts/0    S+   16:51   0:00 grep --color=auto nginx

备份现有 Nginx 的二进制文件:

1
cp nginx nginx.old

将构建好的最新版 Nginx 的二进制文件拷贝到 $nginx/sbin 目录:

1
cp ~/works/nginx-1.22.1/objs/nginx ~/nginx/sbin/ -f

给正在运行的Nginx的 master 进程发送信号,通知它我们要开始进行热部署:

1
kill -USR2  4376

这时候 Nginx master 进程会使用新的二进制文件,启动新的 master 进程。新的 master 会生成新的 worker,同时,老的worker并没有退出,也在运行中,但不再监听 80/443 端口,请求会平滑的过度到新 worker 中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ ps aux | grep nginx
mazhen      4376  0.0  0.0   9896  2536 ?        Ss   16:47   0:00 nginx: master process ./sbin/nginx
mazhen      4402  0.0  0.0  10324  2104 ?        S    16:50   0:00 nginx: worker process
mazhen      4403  0.0  0.0  10324  2104 ?        S    16:50   0:00 nginx: worker process
mazhen      4404  0.0  0.0  10324  2104 ?        S    16:50   0:00 nginx: worker process
mazhen      4405  0.0  0.0  10324  2104 ?        S    16:50   0:00 nginx: worker process
mazhen      4454  0.0  0.0   9768  6024 ?        S    16:59   0:00 nginx: master process ./sbin/nginx
mazhen      4455  0.0  0.0  10216  1980 ?        S    16:59   0:00 nginx: worker process
mazhen      4456  0.0  0.0  10216  1980 ?        S    16:59   0:00 nginx: worker process
mazhen      4457  0.0  0.0  10216  1980 ?        S    16:59   0:00 nginx: worker process
mazhen      4458  0.0  0.0  10216  1980 ?        S    16:59   0:00 nginx: worker process
mazhen      4461  0.0  0.0  12184  2436 pts/0    S+   16:59   0:00 grep --color=auto nginx

向老的 Nginx master 发送信号,让它优雅关闭 worker 进程。

1
kill -WINCH 4376

这时候再查看 Nginx 进程:

1
2
3
4
5
6
7
8
$ ps aux | grep nginx
mazhen      4376  0.0  0.0   9896  2536 ?        Ss   16:47   0:00 nginx: master process ./sbin/nginx
mazhen      4454  0.0  0.0   9768  6024 ?        S    16:59   0:00 nginx: master process ./sbin/nginx
mazhen      4455  0.0  0.0  10216  1980 ?        S    16:59   0:00 nginx: worker process
mazhen      4456  0.0  0.0  10216  1980 ?        S    16:59   0:00 nginx: worker process
mazhen      4457  0.0  0.0  10216  1980 ?        S    16:59   0:00 nginx: worker process
mazhen      4458  0.0  0.0  10216  1980 ?        S    16:59   0:00 nginx: worker process
mazhen      4475  0.0  0.0  12184  2292 pts/0    S+   17:07   0:00 grep --color=auto nginx

老的 worker 已经优雅退出,所有的请求已经切换到了新升级的 Nginx 中。

老的 master 仍然在运行,如果需要,我们可以向它发送 reload 信号,回退到老版本的 Nginx。

# 日志切割

首先使用 mv 命令,备份旧的日志:

1
mv access.log  bak.log

Linux 文件系统中,改名并不会影响已经打开文件的写入操作,因为内核 inode 不变,这样操作不会出现丢日志的情况。

然后给运行中的 Nginx 发送 reopen 信号:

1
./nginx -s reopen

Nginx 会重新生成 access.log 日志文件。

一般会写一个 bash 脚本,通过配置 crontab,每日进行日志切割。

comments powered by Disqus