CentOS下Nginx报80端口绑定权限被拒绝且端口被占用如何解决
问题根因
你遇到的问题由两个核心原因导致:
- 80属于1024以下的Linux特权端口,默认仅root用户有权限绑定,你用普通用户执行
nginx -t自然会触发权限拒绝报错 - netstat查询结果中进程栏显示为
-,是因为普通用户没有权限查看其他用户(比如root)启动的进程PID,说明80端口仍然被你之前没杀干净的残留Nginx进程占用
解决步骤
- 第一步:清理80端口占用的残留进程
如果你有sudo执行权限,执行以下命令查询占用80端口的真实PID:
拿到PID后直接杀掉对应进程:# 优先用ss命令,查询结果更准确 sudo ss -tulpn | grep :80 # 也可以用你习惯的netstat sudo netstat -tulpn | grep :80
如果你没有sudo权限,联系服务器管理员帮忙查询并杀掉占用80端口的进程,普通用户默认没有权限结束其他用户启动的进程。sudo kill -9 <查询到的PID> - 第二步:配置普通用户启动Nginx绑定特权端口的权限
残留进程清理完成后,要让你指定的普通用户可以正常启动Nginx绑定80端口,需要给新编译的Nginx二进制文件开放端口绑定权限:
该操作仅开放Nginx绑定特权端口的权限,不会给Nginx授予多余的root权限,安全性更高。# 路径替换为你实际的Nginx二进制文件路径 sudo setcap 'cap_net_bind_service=+ep' /home1/irteam/apps/nginx/sbin/nginx - 第三步:验证并启动Nginx
权限配置完成后,执行配置校验命令:
提示配置测试成功后,启动Nginx即可:~/apps/nginx/sbin/nginx -t
再次查询端口占用,确认80端口已经被新启动的Nginx进程正常监听即可。~/apps/nginx/sbin/nginx
后续操作建议
- Nginx平滑升级不要直接覆盖运行中的程序目录,正确操作流程为:编译好新的Nginx二进制文件后,先重命名旧的二进制文件,把新文件放到原路径,执行
kill -USR2 <旧Nginx主进程PID>,旧主进程会自动拉起新的子进程处理请求,验证服务正常后给旧主进程发送kill -QUIT <旧主进程PID>即可完成无中断升级。 - 不要用root用户直接运行Nginx worker进程,配置文件中指定普通用户运行worker进程即可,避免服务被入侵后攻击者拿到服务器root权限。
内容的提问来源于stack exchange,提问作者mozzi
相关产品推荐
相关产品推荐

