经常会遇到有些朋友来问我,为什么服务器有些服务比如MySQL、SSH、HTTP、HTTPS等为什么不能访问,明明是按照文档来操作的,到最后为什么就是无法访问想要访问的服务。为了帮助有同样问题的朋友,这里我想把我遇到这种问题的处理思路记录一下,希望能帮助到各位同样遇到各种服务器端口无法访问的问题。
解决思路
简单来说,解决问题的思路大概有以下几个:
- 确定想要访问的服务器IP是否正确
- 服务是否正常启动且监听在对应的端口
- 云服务器的话,安全组端口是否放行
- 服务器操作系统内的防火墙是否放行
下面来说说具体思路。
确定服务器IP是否正确
某些情况下,比如说内网机器,IP开头为192.168.x.x、172.16.x.x及10.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地域找到想要配置的实例,点击实例右侧的“更多”,然后在弹出的菜单中点击网络和安全组,如图:
然后点击后面的安全组配置。一般来说,这里会有个默认的安全组规则,这个在购买服务器的时候就会要求设置好,点击“安全组”tab中默认的那个默认规则右侧的配置规则,如图:
在进入的页面中可以查看已开放的端口,如果我们需要使用的端口没有开放,可以点击页面右上角的添加安全组规则或者快速创建规则进行添加,相应设置如下:
常用端口及自定义添加只需要设置一个就行,不需要同时设置。
除了ECS之外,轻量云AWS设置方式也类似。
腾讯云服务器配置安全组端口放行
和阿里云差不多,腾讯云放行操作大同小异。
登录腾讯云控制台,然后找到对应的需要操作的CVM服务器,点击右侧的更多,弹出下拉菜单,点击安全组,弹出的配置安全组点击,如图:
记住这个ins开头的安全组ID:
然后到左侧菜单找到安全组点击进去,在安全组页面找到上一步那个ins开头的ID,点击进入,如图是一些已开放的端口信息:
然后点击列表上方的入站规则下面的添加规则,如图,按照如下格式添加规则即可:
服务器系统防火墙是否放行对应的端口
如果到上一步都没什么问题的话,这里建议检查一下服务器系统内部的防火墙是否放行,如果防火墙限制了外部的访问,即使程序正确监听在对应的端口,我们从外部也是无法访问的。
一般来说,如果使用的是云服务厂商的系统模板,防火墙默认是没有开启的,但是如果是使用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