最近使用rc.local配置nginx开机自启动程序遇到了不少问题,在万能的网友帮助下(查资料),终于历经千辛万苦(资料不完整或者有问题),终于完美解决,特做此记录分享,以免时间长了会忘记,再次犯同样错误,同时也希望对遇到类似问题的网友有所帮助。
- 检查rc.local权限
使用rc.local前先检查rc.local是否有+x权限
[root@localhost ~]# ll /etc/rc.local
lrwxrwxrwx. 1 root root 13 5月 23 2019 /etc/rc.local -> rc.d/rc.local
[root@localhost ~]# ll /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 662 9月 22 14:58 /etc/rc.d/rc.local
如果没有权限,则会导致rc.local无法执行,执行命令:chmod +x /etc/rc.d/rc.local 即可;
- 配置开机启动项目
touch /var/lock/subsys/local
/usr/sbin/nginx
在这个案例中,配置到rc.local中,按理说到这里,保存退出,即可大功告成,重启后发现,nginx根本没有启动,以为是rc.local不执行,于是查看了下系统启动日志,发现并不是,而是nginx启动报错(权限被拒),错误日志如下:
rc.local: nginx: [emerg] bind() to 0.0.0.0:9080 failed (13: Permission denied)
报上错误的原因有两个种情况:
- 端口号小于1024:
运行的账号不是root
就会报这个错误,需要切换到root,即开机启动项目配置改为:
touch /var/lock/subsys/local
sudo /usr/sbin/nginx
2. 端口号大于1024:
检查一下selinux
是否开启了。如果开启了关闭selinux
试试,如果关了selinux
能正常说明端口可能与selinux
的端口冲突了或http_port_t
中没有开放对应的端口,检查http_port_t:
[root@localhost ~]# semanage port -l | grep http_port_t
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
发现我nginx配置里面的9080段端口确实没有开放,增加端口:
semanage port -a -t http_port_t -p tcp 9080
如果添加端口报如下错误:
ValueError: 已定义端口 tcp/9080
但是semanage port -l | grep http_port_t 检查的却看不到该端口存在,应该就是另一个服务具有TCP端口9080的已定义状态;
此时就需要使用修改端口命令:
semanage port -m -t http_port_t -p tcp 8080
如果没有semanage命令,安装:https://blog.csdn.net/runsnail2018/article/details/81185653
再次检查端口:
[root@localhost ~]# semanage port -l | grep http_port_t
http_port_t tcp 9080 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
重启系统,nginx自启动成功。