# Nginx 操作命令

# 启动 Nginx 准备工作

安装 Nginx 之后,如果系统开启了防火墙,需要在防火墙中加入需要开放的端口。

#可以先查看防火墙的开启状态,如果显示 running 则是正在运行
systemctl status firewalld

#关闭防火墙,不用配置端口,但是不安全
systemctl  stop firewalld

#开启防火墙
systemctl start firewalld

#添加开启端口,--permanent表示永久打开,不加是临时打开重启之后失效
firewall-cmd --permanent --zone=public --add-port=8080/tcp
#重启防火墙,永久打开端口需要reload一下
firewall-cmd --reload
#查看防火墙,添加的端口也可以看到
firewall-cmd --list-all

# 启动 Nginx

# 配置 Nginx 全局可用

使用 yum 安装的 Nginx,可以直接使用 nginx 命令。但是编译安装的 Nginx 必须到安装后的目录下执行,例如当前我们安装的路径 /usr/local/nginx/sbin ,在这个目录下运行 ./nginx 加上需要的参数和指令才可以,否则会报错:-bash: nginx: command not found

通过编译安装的 Nginx,可以通过配置环境变量的方式,达到用 nginx 执行命令的目的。步骤如下:

#编辑 /etc/profile
vi /etc/profile

#在最后一行添加配置,:wq 保存
export PATH=$PATH:/usr/local/nginx/sbin

#使配置立即生效
source /etc/profile

# 端口 80 占用

报错信息:nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

# 场景一:有 Nginx 在运行

  1. 查找 Nginx 的主进程的进程 ID,然后使用 kill 关闭

第一种方法,使用 ps,可以看到 Nginx 主进程 ID 是 1124

#查看所有正在运行的 Nginx 进程
ps -ax | grep nginx | grep -v grep
#结果为:
#1124 ?        Ss     0:00 nginx: master process /usr/sbin/nginx
#1126 ?        S      0:00 nginx: worker process

第二种方法,因为 nginx 的主进程 ID 是写死在 nginx.pid 文件中的,该文件通常放在 /usr/local/nginx/logs或者 /var/run 目录下。

cat /var/run/nginx.pid
#结果为:1124

使用 kill 命令,后面跟要发送的信号和要关闭的 Nginx 进程 ID,信号会被发送给 Nginx 进程。通过上面的操作,我们看到了 Nginx 进程 ID 为 1124,发送 QUIT 信号使 Nginx 优雅退出:

kill -s QUIT 1124
  1. 使用 nginx 命令关闭
#等待当前子进程处理完正在执行的请求后,结束 Nginx 进程
nginx -s quit

# 场景二:服务占用(包括场景一)

不用管占用的服务是不是 Nginx,通过命令查看本机网络地址和端口等一些信息,找到被占用的 80 端口的 tcp 连接,直接 kill 掉进程。

netstat -ntpl

kill 进程PID

# 配置 Nginx 开机自启

# 利用 systemctl 命令

如果是用 yum install 命令安装的 Nginx,yum 命令会自动创建 nginx.service 文件,直接用以下命令就可以设置开机自启

systemctl enable nginx #设置开机启动 Nginx
systemctl disable nginx #关闭开机启动 Nginx

如果是源码编译安装的 Nginx,需要在系统服务目录里创建 nginx.service 文件。

#创建并打开 nginx.service 文件
vim /lib/systemd/system/nginx.service

#内容如下
[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

# :wq 保存
systemctl daemon-reload #使文件生效

这样就可以通过以下命令操作 nginx 了:

systemctl start nginx # 启动nginx服务
systemctl restart nginx # 重新启动服务
systemctl reload nginx # 重新加载 Nginx,用于修改配置后
systemctl enable nginx # 设置开机启动
systemctl is-enabled nginx #查询服务是否开机启动
systemctl disable nginx # 停止开机自启动
systemctl status nginx # 查看服务当前状态

还有一种通过开机启动命令脚本实现开机自启,点击查看 (opens new window)

# Nginx 常用命令

如果 Nginx 已经开启,就可以通过使用 -s 参数的可执行命令控制。

nginx -s stop #快速关闭
nginx -s quit #优雅关闭,等待工作进程处理完成后关闭
nginx -s reload #向主进程发送信号,重新加载配置文件,热重启
nginx -s reopen #重启 Nginx,重新开始记录日志文件,配合定时任务,用于日志切割

nginx -T #查看当前 Nginx 最终的配置
nginx -t -c <配置路径> #检查配置是否有问题,如果已经在配置目录,则不需要 -c,此命令也可以间接查看nginx的配置文件路径

nginx -v #查看 Nginx 的版本信息
nginx -V #查看 Nginx 的编译信息

另外 nginx -h 或者 nginx -?,可以列出所有的命令。

# 使用 kill 关闭 Nginx

Nginx 信号控制:

  • TERM,INT:快速关闭
  • QUIT:优雅关闭
  • HUP:平滑重启,重新加载配置文件
  • USR1:重新打开日志文件,在切割日志时用途较大,跟 nginx -s reopen 类似
  • USR2:平滑升级可执行程序
  • WINCH:从容关闭工作进程
#首先找到 Nginx 的 master 对应的进程ID
ps -ax | grep nginx | grep -v grep
#结果为:
#1124 ?        Ss     0:00 nginx: master process /usr/sbin/nginx
#1126 ?        S      0:00 nginx: worker process

kill -TERM 1124 #快速停止
kill -QUIT 1124 #优雅停止

#强制停止所有nginx进程
pkill -9 nginx

# 热部署 Nginx,进行版本升级

把之前的 /usr/local/nginx/sbin/nginx 二进制文件备份,然后把新编译好的 objs/nginx 二进制文件替换原来的。

然后执行:kill -USR2 1124,会平滑的将请求过渡到新的 Nginx 进程,会看到新开启了一个 Nginx master 进程,不过旧的 Nginx master 也在运行,不过已经已经不再监听 80 和 443 端口。

然后执行:kill -WINCH 1124,优雅的关闭所有旧的 Nginx worker 进程。

最后,虽然所有旧的 Nginx worker 进程都关闭了,但是旧的 Nginx master 进程还存在,这是为了便于回退。