本文已参与「新人创作礼」活动.一起开启掘金创作之路。
二、服务器网络
1、查看服务器内网 IP
ip a
ip a 是 ip address 的缩写,可以查看服务器的内网 IP 地址。服务器默认网卡一般是 eth0,所以 eth0 的 inet 地址就代表内网 IP 地址,一般是 10.x.x.x 或 172.x.x.x 或 192.x.x.x 这 3 类私有地址格式。如果服务器上有 docker 容器,应该还能看到一个叫 docker0 的(虚拟)网卡,其 inet 地址可以作为宿主机的 IP 地址被容器所使用。
ifconfig
ifconfig 命令也可以查询服务器内网 IP 地址,包含本身的 IP 地址和 docker 容器的 IP 地址。
2、查看服务器公网出口 IP
curl cip.cc
或
curl myip.ipip.net
curl,是 command url 的缩写,通过命令行访问 url 的意思。有些服务器的公网出口 IP 可能不固定,所以最好是用这两个命令都查一下,以便比对结果是否一致。另外要注意,服务器的公网出口 IP 和公网入口 IP 并不总是一致的。
3、查看服务器防火墙状态
systemctl status firewalld
firewalld 是 CentOS7 系列使用的防火墙(作为系统服务),取代了 CentOS 6 系列的 iptables 防火墙。上面这个命令执行后如果显示 running,表示防火墙已开启,显示 dead,则表示防火墙已关闭。
4、firewalld 防火墙添加规则/重载规则/查看开放的端口
sudo firewall-cmd --add-port=13120/tcp --permanent
firewalld 防火墙添加规则,允许到本机 13120 端口的 TCP 连接,永久生效。想加其他端口修改 13120 即可。不允许某个端口的话,把 add 换成 remove 即可。
sudo firewall-cmd --reload
firewalld 防火墙重载规则,--reload 就是重载的意思。重载之后,添加、删除等操作,才能真正生效。
sudo firewall-cmd --list-ports
查看 firewalld 防火墙已开放的所有端口。
当然,如果是云服务器,在修改完自身的 firewalld 之后,从公网访问那些放行的端口,一般还会受到云服务器安全组策略的限制,可能会访问不通,但这不代表 firewalld 修改失败了,如果在内网里去 telnet 放行的端口能 telnet 通,就足以说明 firewalld 修改成功了。
5、DNS 与 hosts
cat /etc/resolv.conf
/etc/resolv.conf 是服务器的 DNS 配置文件,我们只需要关注它里面的 nameserver 关键字。nameserver 后面要跟上一个 IP 地址,两者之间以一个空格分隔开来。IP 一般要配成公网 IP 地址,比如 114.114.114.114 或 223.5.5.5(阿里的)或 119.29.29.29(腾讯的)。如果在服务器上 ping 这些 IP 能通,但 curl 某某域名却显示「未知的名称或服务」,那就可以在这份配置文件的最下面追加一行,比如 nameserver 114.114.114.114 。
/etc/hosts 是服务器的 hosts 配置文件,服务器在访问某个域名时,会先到这个文件里查找有没有配置该域名及对应的 IP,如果有,就直接跟对应的 IP 建立连接。如果没有,才会访问 DNS 服务器( /etc/resolv.conf 文件里配置的 nameserver)以确定对应的 IP。所以,如果在 /etc/hosts 文件里配置了我们的项目域名,就会省去一次查询 DNS 服务器解析记录的时间,因此配置服务器的 hosts 解析记录是十分有必要的。
通常来说,我们需要在应用服务器上的 hosts 配置文件里(Windows 的 hosts 文件路径是 C:\Windows\System32\drivers\etc\hosts),添加一条项目域名到 nginx 服务器内网 IP 地址的解析记录,比如 10.0.4.15 hlwyy.abc.com ,其中 10.0.4.15 是 nginx 服务器的内网 IP,hlwyy.abc.com 是项目域名,中间以空格分隔,要注意应用服务器与 nginx 服务器,内网间必须双向互通。
当然,不只是给项目域名配置 hosts 解析就够了,项目里用到的其他域名(比如项目的配置文件里用到的那些中间件域名),都是要配到 hosts 文件里的,一方面加快解析速度,另外一方面也方便维护(如果域名对应的 IP 地址有变动,只需要修改 hosts 文件里的 IP 地址即可,项目上继续使用域名,完全不需要改动)。
6、ping 与 telnet
首先重点说明一下,ping 是基于 ICMP 协议(Internet Control Message Protocol,互联网控制消息协议)的,属于 OSI 模型的网络层,它既可以 ping 域名(ping 域名可以用来测试这个域名解析的 IP 地址是多少),也可以 ping IP,但是跟端口没任何关系,请不要在 ping 域名或 ping IP 后面加任何端口!ping 通常用来测试网络连通性,如果目标地址关闭了 ICMP 协议就 ping 不通它,大家不要大惊小怪认为这个有问题,这是很正常的情况。
telnet 属于应用层,是 TCP/IP 协议族的其中之一,既然是应用层就跟端口有关系了,所以 telnet 域名或 telnet IP 后面要跟上端口(用空格分隔开来,注意不是用英文的冒号来分隔),比如——
telnet open.zwjk.com 443
或
telnet 115.159.1.60 443
telnet 通常用来测试应用是否还在运行,比如测试 nginx 服务是否还在运行,在本机上可以用 telnet 127.0.0.1 443,在其他服务器上可以用 telnet 10.0.4.15 443(假设 10.0.4.15 是 nginx 服务器的内网 IP)。
说几个常用协议及中间件的端口——
- FTP,21
- SSH,22
- HTTP,80
- NETBIOS,137/138/139(医院只要做安全测评,通常都会要求我们关闭这些端口)
- HTTPS,443
- SQL Server,1433
- Oracle,1521/1526/2030/2483/2484/3872
- MySQL,3306
- Windows 远程桌面,3389
- PostgreSQL,5432
- Redis,6379
- Memcached,11211
- Consul,8300/8301/8302/8500/8600
- Nacos,8848/8849/9848/9849
- Apollo,8070/8080/8090
- RabbitMQ,5672/15672
- RocketMQ,9876/10909/10911/10912
- Dubbo,20880/20888
- Zookeeper,2181/2888/3888
7、查看服务器的实时网速
iftop
在类 Unix 系统中可以使用 top 查看系统资源、进程、内存占用等信息,查看网络状态可以使用 netstat、nmap 等工具,若要查看实时的网络流量,则可以使用 iftop。
iftop 需要在服务器上自行安装(yum install -y iftop,如果下载不到包,需要添加下对应的 yum 源,请自行百度),安装完成后,使用 root 权限运行 iftop 命令,即可查看服务器实时的出方向流量和入方向流量,推荐在 Nginx 服务器上安装 iftop。
三、服务进程与网络连接
1、进程
ps -ef|grep xxx
ps,是 process status 的缩写,用来列出系统中当前运行的那些进程,它提供的结果并不动态连续,如果想对进程实时监控,应该用 top 命令。
我们可以根据进程名称去搜索进程,也可以根据进程 ID 去搜索进程,所以上面的 xxx 既可以是名称,也可以是 ID。
Linux 上的进程有 5 种状态,运行、中断、不可中断、僵死、停止,对应的状态码是 R、S、D、Z、T。
2、网络连接
lsof
lsof,list open files,是一个列出当前系统打开文件的工具(服务器上可能没有这个工具,需要用 yum install -y lsof 命令安装一下),通常我们使用此命令来查看是否有对应端口被占用,以及连接到此端口上的网络连接有哪些,比如——
lsof -i:443
就表示查看本机上是否有进程在使用 443 端口。如果在结果里能看到 (LISTEN) ,就表示本机有进程正在占用 443 端口。如果还能看到 (ESTABLISHED) 或 (CLOSE_WAIT) 这样的,就表示有其他目标主机有到本机 443 端口的连接。
如果我们用 lsof -i:xxx 找到了一个状态是 LISTEN 的进程,假设它的进程 ID(也就是 PID 那一项)是 4937,那可以用以下命令查看该进程的当前工作目录(cwd)与执行文件路径(exe),这样可以有助于我们分析该进程到底是什么进程(当然用 ps -ef|grep PID 也是完全可以的)——
ll /proc/4937|grep cwd
与
ll /proc/4937|grep exe
除了 lsof,我们通常还会使用 netstat 命令(服务器上可能没有这个工具,需要用 yum install -y net-tools 命令安装一下),用于显示各种网络相关信息,如网络连接等。
netstat -tuanlp|grep 443
上面这个命令可以查看当前所有连接到 443 端口(不管是本地的 443 还是远程的 443,不管是 TCP 还是 UDP)、且正处于监听状态的进程(会显示出进程 ID 和进程名称),这对我们确认服务器当前的网络连接情况是否健康是很有用的。
比如我们可以用下面的命令来查看服务器当前各个状态的网络连接数——
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'
它会显示例如下面的信息:
TIME_WAIT 814
CLOSE_WAIT 1
FIN_WAIT1 1
ESTABLISHED 634
SYN_RECV 2
LAST_ACK 1
其中 ESTABLISHED 表示正在通信,TIME_WAIT 表示主动关闭,CLOSE_WAIT 表示被动关闭。服务器上出现大量 TIME_WAIT 状态的连接时,需考虑优化一下系统内核参数(修改 /etc/sysctl.conf 文件里 net.ipv4 开头的相关参数),否则服务器将无法与外面的客户端成功建立起连接,出现大量 CLOSE_WAIT 状态的连接时,需要从代码层面去排查连接没有关闭的原因,总之这两种状态的连接过多时,会有很大的问题。