端口被 SELinux 禁用
问题
报错日志如下:
2024/03/19 15:32:54 [emerg] 3874#0: bind() to 0.0.0.0:8081 failed (13: Permission denied)
原因
SELinux 默认是启动的,SELinux 影响端口的开放。SELinux 只使用标准的端口,非标准的端口被 SELinux 禁用。
解决方法
端口小于 1024。例如:端口为 80。
[emerg] 3874#0: bind() to 0.0.0.0:80 failed (13: Permission denied)
Nginx 用 1024 以下端口启动时需要 root 用户权限,所以使用 root 启动 Nginx 服务即可。
此次端口为 8081 大于 1024,使用以下方法解决。
解决方法 1
关闭 SELinux。此方法对端口小于 1024 也有用。
临时配置,重启后失效
sudo setenforce 0写入配置文件,永久生效
sudo sed -i 's/\(^SELINUX=\).*/\SELINUX=disabled/' /etc/selinux/config
解决方法 2
semanage 命令安装
semanage 命令用于管理 SELinux。
安装 semanage 命令:
sudo yum install -y semanage
返回 Error: Unable to find a match: semanage 错误,表示找不到此包,使用 sudo yum provides semanage 命令查看 semanage 此命令在哪个软件包中:
sudo yum provides semanage
policycoreutils-python-utils-2.9-24.el8.noarch : SELinux policy core python utilities
Repo : baseos
Matched from:
Filename : /usr/sbin/semanage
安装 policycoreutils-python-utils-2.9-24.el8.noarch 此包,即可使用 semanage 命令:
sudo yum install -y policycoreutils-python-utils-2.9-24.el8.noarch
semanage 命令常用选项:
- -a:添加端口
- -t:添加端口到哪个端口列表
- -p:添加端口到哪个协议
- -m:修改端口
- -l:查看所有端口
查看 http 允许访问的端口:
sudo 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
将要启动的端口加入到 http_port_t 端口列表中:
sudo semanage port -a -t http_port_t -p tcp 8081
返回 ValueError: Port tcp/8081 already defined 错误,表示 tcp/8081 端口已定义,两种解决方法:
更换没有使用过的端口添加
查看已使用过的端口:
sudo semanage port -l添加没有使用过的端口:
sudo semanage port -a -t http_port_t -p tcp 8085提示
使用此方法,不要忘记修改 Nginx 的监听端口
重新定义 8081 端口
sudo semanage port -m -t http_port_t -p tcp 8081
重启 Nginx 服务:
sudo systemctl restart nginx
再次访问 http://localhost:8085 地址:

报错日志如下:
2024/03/19 16:16:26 [crit] 13490#0: *1 connect() to 10.1.1.10:8088
failed (13: Permission denied) while connecting to upstream, client: 10.1.1.1,
server: localhost, request: "GET /favicon.ico HTTP/1.1",
upstream: "http://10.1.1.10:8088/favicon.ico", host: "10.1.1.10:8085",
referrer: "http://10.1.1.10:8085/dashboard/self"
SELinux 拒绝 httpd 网络访问。设置 SELinux 允许 httpd 连接到网络。
临时配置,重启后失效
sudo setsebool httpd_can_network_connect=1写入配置文件,永久生效
sudo setsebool -P httpd_can_network_connect 1
再次访问 http://localhost:8085 地址即可。
