服务器端口或服务无法访问解决办法

经常会遇到有些朋友来问我,为什么服务器有些服务比如MySQL、SSH、HTTP、HTTPS等为什么不能访问,明明是按照文档来操作的,到最后为什么就是无法访问想要访问的服务。为了帮助有同样问题的朋友,这里我想把我遇到这种问题的处理思路记录一下,希望能帮助到各位同样遇到各种服务器端口无法访问的问题。

解决思路

简单来说,解决问题的思路大概有以下几个:

  • 确定想要访问的服务器IP是否正确
  • 服务是否正常启动且监听在对应的端口
  • 云服务器的话,安全组端口是否放行
  • 服务器操作系统内的防火墙是否放行

下面来说说具体思路。

确定服务器IP是否正确

某些情况下,比如说内网机器,IP开头为192.168.x.x172.16.x.x10.x.x.x,如果没有在路由器固定IP或者没有设置静态IP的情况下,系统重启可能会导致IP变化,这种情况下,最好是确定下IP是否有变化。
而对于外网的服务器来说,如果是通过域名访问的,可以在命令行ping一下对应的域名或者IP,通过ping的方式可以确定域名是否解析到了正确的IP上,同时也可以确定对应的服务器是否在线,Windows打开CMD或者PowerShell,macOS和Linux打开终端,比如ping本站服务器:

ping cloudbool.com

服务是否正常启动且监听在对应的端口

如果域名解析出来的IP正确,且服务器在线,即可考虑下对应的服务是否已正确启动。
拿Linux服务器来说,如果没有设置程序开机启动,比如MySQL服务,如果系统重启,可能重启之后对应的MySQL服务并没有启动,这个时候需要手动启动,如果是Debian8/9/10,Ubuntu 16.04/18.04,CentOS 7/8等使用systemd的系统,常见的几个服务启动/重启/开机启动命令如下:
Nginx: systemctl start/restar/enable nginx
MySQL: systemctl start/restar/enable mysql/mysqld/mysql-server/mariadb
Apache: systemctl start/restar/enable apache2/httpd
SSH: systemctl start/restar/enable ssh/openssh/sshd
对应的几个服务默认监听的端口如下:
Nginx: HTTP:80 HTTPS:443
Apache: HTTP:80 HTTPS:443
MySQL/MariaDB: 3306
SSH: 22
MongoDB: 27017
Redis: 6379
此外,对于服务器来说,可能有些常年累月运行之后,有些服务会因为内存不足或者程序bug等原因导致经常崩溃或者异常退出等情况,如果是这种情况,建议是通过对应的日志文件进行查找原因,解决问题之后重启服务。

检查云服务器安全组是否放行

有些云服务厂商比如说国内的阿里云、腾讯云,默认开启了安全组,如果我们在购买之后没有在安全组放行对应的端口,即使配置好了具体服务,我们还是没办法访问的,因为请求在还没到达服务器就被安全组拦截了。
下面分别说说阿里云及腾讯云的安全组设置方法。

阿里云ECS服务器配置安全组端口放行

登录阿里云控制台,然后到对应的ECS地域找到想要配置的实例,点击实例右侧的“更多”,然后在弹出的菜单中点击网络和安全组,如图:
aliyun-ecs-config.png
然后点击后面的安全组配置。一般来说,这里会有个默认的安全组规则,这个在购买服务器的时候就会要求设置好,点击“安全组”tab中默认的那个默认规则右侧的配置规则,如图:
aliyun-ecs-config-rule.png
在进入的页面中可以查看已开放的端口,如果我们需要使用的端口没有开放,可以点击页面右上角的添加安全组规则或者快速创建规则进行添加,相应设置如下:
aliyun-ecs-quick-add-rule.png
常用端口及自定义添加只需要设置一个就行,不需要同时设置
除了ECS之外,轻量云AWS设置方式也类似。

腾讯云服务器配置安全组端口放行

和阿里云差不多,腾讯云放行操作大同小异。
登录腾讯云控制台,然后找到对应的需要操作的CVM服务器,点击右侧的更多,弹出下拉菜单,点击安全组,弹出的配置安全组点击,如图:
tencent-cloud-cvm-to-securitygroup.png
记住这个ins开头的安全组ID:
tencent-cloud-cvm-securitygroup-list.png
然后到左侧菜单找到安全组点击进去,在安全组页面找到上一步那个ins开头的ID,点击进入,如图是一些已开放的端口信息:
tencent-cloud-cvm-securitygroup-port.png
然后点击列表上方的入站规则下面的添加规则,如图,按照如下格式添加规则即可:
tencent-cloud-securitygroup-add-rule.png

服务器系统防火墙是否放行对应的端口

如果到上一步都没什么问题的话,这里建议检查一下服务器系统内部的防火墙是否放行,如果防火墙限制了外部的访问,即使程序正确监听在对应的端口,我们从外部也是无法访问的。
一般来说,如果使用的是云服务厂商的系统模板,防火墙默认是没有开启的,但是如果是使用ISO镜像自己安装的系统,比如说CentOS7,默认是开启防火墙的,且默认除了SSH监听的22端口外,其余默认禁止。
以CentOS7为例,查询端口是否放行:

firewall-cmd –zone=public –query-port=80/tcp

其中,80是对应的端口,tcp是协议,如果你不清楚是tcp还是udp,建议使用tcp查询先。
查看防火墙是否在运行:

systemctl status firewalld

关闭防火墙:

systemctl stop firewalld

禁止开机启动:

systemctl disable firewalld

当然,也可以添加对应的端口:

firewall-cmd –permanent –add-port=80/tcp
firewall-cmd –reload

注意上面的reload命令,如果不执行这句,可能会导致添加的firewall规则不生效。

其他情况

除了以上几种常见情况,访问不了对应的服务,也可能是服务本身或者操作系统其他的限制,比如说,Nginx在运行,但是报403、404、502等错误,或者MySQL在正常运行,但是从本地还是无法正常连接到MySQL服务器,这就需要从应用程序本身配置去入手,比如检查Nginx是否配置正确,MySQL是否开启了远程访问等。
特别的,对于CentOS7,如果确认服务配置正确,但仍旧无法正常访问,这个时候就应该考虑下是否是SELinux的问题了。简单地说,SELinux是一套安全增强程序,但是在没正确配置的情况下可能会出现权限问题。
查看SELinux状态:

sestatus

临时关闭SELinux:

setenforce 0

永久关闭SELinux:

vi /etc/selinux/config
SELINUX=disabled