Nginx默认端口正常,指定端口却报错?排查指南
你有没有碰到过这样怪异的状况呢, 网站通过80这一端口去访问的时候, 是十分顺畅流利的, 然而假如换成8080这个端口, 就马上弹出“连接被拒绝”的提示? 此类问题在服务器配置当中是极为常见的,特别是当你去部署多个Web服务的时候。今天, 作为技术博主的我, 带领你进行一次全程完整的排查以及修复, 确保是有实际价值、可以操作的干货。
一、基础知识:端口与防火墙
Web服务器, 其默认监听80端口, 也就是HTTP对应的端口, 还有443端口, 即HTTPS对应的端口。当你指定了其他端口, 比如说8080、3000这样的端口, 在客户端发起连接的时候, 服务器必须要确保, 该指定的端口是对外开放的, 并且服务正在监听此端口。核心的疑问在于, 为什么默认的端口能够通畅, 而指定的端口就不行呢? 答案往往是藏在防火墙规则以及服务配置当中的。
二、评测与排查:四大核心步骤
我对最常出现的Nginx与云服务器场景做了模拟, 按照优先级给出了下面这些排查方法。
1. 防火墙规则的“漏网之鱼” ⭐⭐⭐⭐⭐(满分)
现象:80端口通,8080端口不通。
由于, 云服务商安全组, 或者, 本地iptables/firewalld, 准许了默认HTTP端口, 然而, 却没有放行自定义端口。
解决方案:
云服务商的控制台, 像阿里云、腾讯云这类的, 于“安全组”里添加进方向规则, 将TCP协议的特定端口, 比如8080予以放行。
本地防火墙(CentOS):
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload
本地防火墙(Ubuntu):
ufw allow 8080/tcp
ufw reload
2. Nginx配置监听端口 ⭐⭐⭐⭐
现象:防火墙已放行,但仍无法访问。
缘故是: 针对Nginx的server块来讲, 其并未对该端口进行监听。
解决办法是这样的, 去编辑Nginx配置文件, 也就是那个位于/etc/nginx/conf.d/your.conf的文件, 然后再进行添加, 添加什么, 添加如下内容 , 有标点符号。
server {
listen 8080;
server_name your_domain.com;
# ... 其他配置
}
然后重载Nginx:
nginx -t && systemctl reload nginx
3. SELinux安全上下文 ⭐⭐⭐
情形是这样的, 防火墙配置是正确无误的, Nginx配置同样也是正确无误的, 然而端口却依然处于没有打通的状态。
缘由在于, SELinux 默认状况下对非标准端口实施了限制。
步骤是这样的, 去查看SELinux的状态, 要使用getenforce这个命令, 要是看到状态是这样的enforcing, 那就需要进行这样的操作, 把端口添加到httpd的上下文。
semanage port -a -t http_port_t -p tcp 8080
4. 服务未启动或端口冲突 ⭐⭐⭐
现象:以上步骤均验证无误。
缘由是, Nginx处于未启动的状态, 或者说8080这个端口已经被别的进程给占据使用了。
解决方案:
查看服务所处状态, 方式为: 运用systemctl, 对nginx进行状态查看。
去查看端口是否被占用, 执行这样的操作, 运用netstat -tulpn命令, 然后通过管道符grep去查找8080。
若端口冲突,可更换端口或停止占用进程。
三、结论:从现象到本质
大多情形下, 防火墙规则遗漏乃是罪魁祸首, 建议于配置新端口之后, 先运用telnet你的IP端口或者nc -zv你的IP端口迅速测试连通性, 若依旧报错, 那就依照上述步骤逐条予以检查。
否玩代码编辑 https://www.fouwan.com


