在 CentOS 7 系统上,配置 Nginx 开机自启动最标准的方法是借助 systemd 服务管理器,使用 systemctl enable 命令完成注册,前提是 Nginx 已正确安装并生成了对应的服务单元文件。对于反向代理场景,确保配置文件语法及上游服务连通性检查尤为关键,避免开机后因配置错误导致代理失效。
先说结论:CentOS 7 默认使用 systemd 管理服务,只要 Nginx 服务文件存在,一条 enable 命令即可实现自启动,无需手动编写 init 脚本。
- 适合:通过 yum 官方源安装或已手动配置 systemd unit 文件的 Nginx 环境
- 先看:确认 nginx 服务状态及配置文件语法是否正确,避免启动失败
- 建议:配置完成后务必重启服务器验证,而不仅仅是重启服务
命令速用版
如果确认 Nginx 是通过 yum 安装且服务名默认为 nginx,可直接执行以下命令:
systemctl enable nginx
systemctl start nginx
第一条命令用于设置开机自启,第二条用于立即启动服务。
为什么会这样
CentOS 7 废弃了传统的 SysVinit(/etc/init.d),全面转向 systemd。systemd 通过单元文件(unit file)管理服务,enable 操作的本质是在系统启动目标目录下创建服务文件的软链接,告诉系统在引导阶段加载该服务。如果 Nginx 安装时未注册服务文件(如源码编译未配置),systemd 就无法管理它,自然也无法设置自启动。
分步处理
1. 确认安装方式与服务状态
先检查 Nginx 是否被 systemd 识别。执行:
systemctl status nginx
如果显示 loaded 和 active 信息,说明服务文件存在。如果提示 Unit not found,可能是源码编译安装且未配置 service 文件。
2. 检查配置文件语法
在启用自启前,确保配置无误,否则开机启动会失败。特别是反向代理配置,需确保 upstream 语法正确。执行:
nginx -t
必须看到 syntax is ok 和 test is successful 字样。
3. 启用开机自启动
执行启用命令:
systemctl enable nginx
若提示 Created symlink,表示设置成功。
4. 源码编译的特殊处理
如果是源码编译安装且没有 service 文件,需要手动创建/etc/systemd/system/nginx.service文件,内容需指定 ExecStart 为 Nginx 二进制路径,完成后执行systemctl daemon-reload刷新配置。
源码编译 systemd 单元文件完整示例
以下是一个通用的 systemd 单元文件模板,请根据实际安装路径调整ExecStart和PIDFile:
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
创建完成后,执行systemctl daemon-reload使配置生效。
怎么验证是否生效
1. 检查启用状态
执行systemctl is-enabled nginx,返回 enabled 即为成功。
2. 重启服务器验证
这是最可靠的验收方式。执行reboot,服务器启动后登录,执行ps -ef | grep nginx或curl -I http://localhost,确认进程存在且服务可访问。
3. 查看启动日志
如有问题,可通过journalctl -u nginx -b查看本次启动过程中的日志记录。
常见坑
1. 配置错误导致启动失败
开机自启时,如果 nginx.conf 有语法错误,服务会启动失败。systemd 可能会重试几次后放弃,导致开机后服务不可用。务必先通过 nginx -t 测试。
2. 端口被占用
如果 80 或 443 端口被其他程序(如 Apache、另一个 nginx 实例)占用,Nginx 无法绑定端口而启动失败。检查netstat -tulpn确认端口占用情况。
3. 源码编译遗漏服务文件
很多教程只教编译安装,忘了配 systemd 文件。这种情况下 enable 命令会报错,需要手动编写 service 文件或改用 yum 安装。
4. 防火墙设置
服务启动了但外部访问不通,可能是 firewalld 未放行 HTTP/HTTPS 端口。执行firewall-cmd `--list-ports`检查。若未放行,执行以下命令开放端口:
firewall-cmd `--permanent` `--add-port`=80/tcp
firewall-cmd `--permanent` `--add-port`=443/tcp
firewall-cmd `--reload`