查看端口是否已监听(被占用)的3种方法
方法一:使用netstat
netstat
是network statistics的意思,network是网络的意思,这个应该谁都知道,而statistics是统计数据的意思,所以netstat这个命令的意思就是用于显示网络接口的统计数据信息。
安装netstat
一般最小化安装的Linux(比较VPS)可能没有netstat
这个命令,这时我们就要安装,但安装包却不叫netstat
,而是叫net-tools
。
对于centos系统(或者centos8里把yum
改为dnf
,DNF stands for Dandified yum
)
yum -y install net-tools
对于debian系列(debian,ubuntu等等),个人猜测是这么安装(未实践过)
apt install net-tools
macOS的话,在以前貌似不自带,但是现在貌似已经自带了。
使用netstat查看端口
比如nginx启动后,假设你监听的是443(https默认端口),你想确定端口是否已被正常监听
# Linux
netstat -tulnp | grep 443
# macOS
netstat -an | grep 443
# Windows
netstat -ano | findstr 443
以下选项为Linux选项,Windows选项几乎与Linux选项完全不同,一般用-ano
即可。
-t
= --tcp
显示tcp的端口
-u
= --udp
显示udp的端口(tcp和udp是不同的协议,它们端口相同并不会冲突)
-l
= --listening
显示处于监听状态的连接(即状态为LISTENING的连接,否则会显示已建立的连接,状态为ESTABLISHED)
-n
= --numeric
显示数字地址(ip用数字显示,否则会显示域名,主机名等,就比如127.0.0.1
,如果没有-n
它就不会显示成127.0.0.1
,可以自己试试)
-p
= --program
显示程序PID及名称
-a
= --all
相当于设置了前面所有选项(并且还不止,因为我这里没有列出它的全部选项)
更多macOS/Linux选项请自行man netstat
查看,Windows请使用netstat --help
(当然这个Linux也能用)。
方法二:使用ss
据我查询资料,ss
应该是socket statistics的意思,中文可以叫“socket统计数据”。
而什么是socket?socket其实就是接口,比如电脑里的网卡(是电脑与互联网数据交互的接口),又比如“Unix domain socket”就是通过.sock
文件来通信(同一主机可以用这种方法,它比走127.0.0.1
虚拟环回网卡速度快)。
比如配置nginx+php-fpm,一般会有这一段:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
它的意思是,当遇到php文件时,使用fastcgi_pass
指令把它转交给php-fpm来处理,这里是用“ip+端口”的方式来指定php-fpm的,其实我们也可以用“Unix domain socket”来指定
location ~ \.php$ {
fastcgi_pass unix:/path/to/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
但这要求php-fpm那边监听一个sock文件而不是监听网卡端口,在php-fpm.conf的[www]
模块里listen
要指向本地的一个sock文件
[www]
; 监听sock文件
listen = /dev/shm/php-cgi.sock
; 监听本地环回网卡的9000端口
; listen = 127.0.0.1:9000
该文件是什么后缀都可以,只不过为了让我们人方便知道它是什么,所以用了.sock
作为后缀,另外文件本身是不存在的,启动php-fpm的时候它会自动生成。
使用ss
据我ss貌似最小化安装的系统都自带,所以就不需要安装了。据我所知,ss
命令输出的信息比较多,没有netstat
输出信息那么纯粹,个人不太喜欢用这个命令,如果需要详细查看信息的,可以用它。
使用方法
ss -lnp | grep 443
# 加个column -t可以让它显示的更紧凑一点(-t表示以table形式显示)
ss -lnp | grep 443 | column -t
其它用法请自行查看帮助,对了macOS也没有这个命令。
方法三:使用lsof
macOS自带的查看端口占用信息的命令,但Linux也可以安装使用,Windows没了解过。
lsof
的ls是list,o是open,f是files,即list open files的意思,显示的信息会更加详细。
安装lsof
这个命令Linux默认没有,需要安装(centos,其它系统请自行用对应的包管理软件安装)
yum -y install lsof
使用lsof
一般情况下都是用-i
指定要查看的端口
lsof -i:443
但这样会比较慢,因为它会自动转换端口为端口名和转换ip为域名/主机名。
使用以下方式可以快一点
lsof -n -P -i:443
-P
(注意是在大写P) P是port的首字母,跟端口相关,但这里并不是指定端口,而是指“不把端口转成端口名”(其实我不太明白这个,因为端口貌一般似没有端口名)。
-n
显示数字ip地址(即阻止它转换成域名/主机名)
-i
个人认为是Internet的首字母,后面用冒号分隔,可跟端口号或ip。
不推荐在linux上使用lsof
这个命令来查端口。