美国CN2 VPS用着用着突然连不上,或者网站打开慢得离谱,很多人的第一反应是“CN2线路又抽风了”。这个判断有时候对,有时候错。CN2线路确实会因为跨境拥堵出问题,但同样常见的情况是——线路本身好好的,问题出在服务器内部,或者本地网络,或者应用配置。
排查这件事最忌讳的就是“一上来就找服务商理论”。正确的做法是按层级逐层排除:先确认物理链路通不通,再看网络路由对不对,然后查服务器内部服务状态,最后深入应用层日志。
第一层:物理链路与基础连通性
故障排查永远从最底层开始。在怀疑CN2线路之前,先确认数据包能不能到达服务器。
ping测试:最基础的判断
ping 你的VPS_IP
如果完全ping不通,有两种可能:服务器宕机了,或者ICMP被服务器防火墙拦截了。很多云服务商默认禁ping,所以ping不通不代表服务器一定有问题。
更可靠的判断方法是telnet测试端口:
telnet 你的VPS_IP 22
如果22端口能连上,说明服务器活着,只是ICMP被禁了。如果端口也连不上,继续往下查。
用traceroute/MTR看路由路径
mtr -n -c 100 -r 你的VPS_IP
MTR能显示数据包经过的每一跳。对于美国CN2 VPS,重点看两个东西:
- 去程是否走59.43节点。如果去程路由中出现了59.43.x.x,说明去程走了CN2。如果全是202.97,那去程走的是普通163骨干网。
- 在哪个节点开始出现高延迟或丢包。如果某一跳突然延迟从50ms跳到200ms,而且后续所有跳都保持这个高延迟,说明问题就出在那个节点。如果中间节点丢包但最后一跳正常,那是ICMP限速,不影响实际传输。
区分“去程问题”和“回程问题”
这是美国CN2 VPS排查的一个关键分界点。
去程是从你本地到VPS。在本地电脑上执行tracert 你的VPS_IP(Windows)或mtr 你的VPS_IP(Mac/Linux)。
回程是从VPS到你本地。登录VPS,执行mtr -n -c 100 -r 你的本地IP。
如果去程正常但回程绕路:说明VPS端的出口路由有问题。可能是商家调整了路由策略,或者CN2回程被切到了普通线路。
如果去程绕路但回程正常:这种情况对你访问网站影响相对小一些,因为网站数据主要是从VPS“回来”的。但如果你的业务需要大量上传数据到VPS,去程绕路同样会影响体验。
第二层:网络层——TCP/IP协议栈与防火墙
物理链路通了,端口也能连上,但连接不稳定或者速度上不去,问题可能在网络层。
1. 检查TCP重传和拥塞控制
登录VPS,查看当前的拥塞控制算法:
sysctl net.ipv4.tcp_congestion_control
如果是cubic,在跨境高延迟链路上表现可能不理想。换成BBR:
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p
检查TCP重传情况:
ss -ti
输出中的retrans字段显示重传次数。如果重传率持续高于1%,说明链路有丢包,BBR可以帮助缓解。
2. 检查防火墙和安全组
服务器内部防火墙:
# Ubuntu/Debian
ufw status
# CentOS/Rocky
firewall-cmd --list-all
云平台安全组:这是独立于系统防火墙的另一层过滤。登录VPS服务商的控制台,检查安全组的入方向规则是否放行了你的业务端口。系统防火墙和云安全组必须同时放行,缺一不可。
3. 检查MTU和分片
跨境链路有时会因为MTU不匹配导致大包被丢弃。用ping测试MTU:
ping -M do -s 1472 你的VPS_IP
如果提示“Frag needed”或“Message too long”,说明MTU有问题。可以在VPS上调整:
ip link set dev eth0 mtu 1400
第三层:服务器内部——系统资源与服务状态
网络层确认没问题后,问题大概率在服务器内部。
1. 检查系统负载和资源
uptime
free -h
df -h
负载:对比CPU核心数(nproc),如果1分钟负载远高于核心数,系统正在过载。
内存:看available列,如果低于总内存的10%,内存紧张。
磁盘:根分区使用率超过90%就要警惕,满了会导致服务无法写入。
2. 检查关键服务状态
systemctl status nginx
systemctl status mysql
systemctl status php-fpm
如果服务是failed或inactive,启动它:
systemctl start 服务名
systemctl enable 服务名
如果启动失败,查看详细日志:
journalctl -u 服务名 -n 50 --no-pager
3. 检查端口监听
ss -tlnp
确认你的业务端口(80、443等)处于LISTEN状态。如果端口没监听,说明服务没起来,或者绑定的IP不对。
第四层:应用层——Web服务与后端
网络通、服务在跑、端口在听,但网站还是有问题,就要深入应用层了。
1. 查看Web服务器错误日志
# Nginx
tail -f /var/log/nginx/error.log
# Apache
tail -f /var/log/apache2/error.log
常见错误关键词:
connect() failed (111: Connection refused):上游服务没启动,或者地址/端口配错了
upstream timed out:后端响应太慢,可能是PHP-FPM进程池满了
No such file or directory:Nginx配置的socket路径跟PHP-FPM实际监听的路径不一致
Permission denied:文件权限或SELinux问题
2. 检查PHP-FPM状态
systemctl status php-fpm
如果502错误频繁出现,检查PHP-FPM进程池是否被打满:
ps aux | grep php-fpm | wc -l
对比/etc/php/*/fpm/pool.d/www.conf里的pm.max_children值。如果实际进程数接近上限,需要调大,但前提是内存够用。
3. 检查数据库连接
mysql -u 用户名 -p -e "SHOW PROCESSLIST;"
如果看到大量Waiting for table lock或Sleep状态的连接,可能是慢查询或连接泄漏。
4. 检查应用日志
# 查看应用自己的日志文件
tail -f /var/www/你的应用/logs/app.log
应用层的错误往往比Web服务器日志更具体,能直接指向代码问题或业务逻辑问题。
第五层:DNS与CDN
如果前面四层都排查完了还是有问题,考虑DNS和CDN这两个“中间层”。
DNS解析是否正确
dig 你的域名.com +short
对比公共DNS的结果,如果两个结果不一致,说明本地DNS有缓存或污染。
CDN回源是否正常
如果你的网站前面有CDN,502错误可能出在CDN回源环节。检查CDN控制台的“回源IP”列表,确认源站安全组放行了这些IP。同时检查CDN的“回源超时”设置,如果设得太短,后端处理稍慢就会触发502。
排查流程总结
按顺序走一遍,每层确认后再进入下一层:
第1步:物理链路。ping和telnet测试,确认服务器活着、端口能连。
第2步:网络路由。MTR测试去程和回程,判断是CN2线路问题还是普通拥堵。
第3步:网络层配置。检查拥塞控制算法、防火墙、安全组、MTU。
第4步:系统资源。uptime、free、df,确认CPU/内存/磁盘没有过载。
第5步:服务状态。systemctl检查Nginx、MySQL、PHP-FPM是否运行。
第6步:应用层日志。Nginx错误日志、PHP-FPM状态、数据库连接、应用日志。
第7步:DNS和CDN。确认解析正确、CDN回源配置无误。
大部分故障在前三步就能定位。真正需要找服务商理论的,是第2步确认了路由绕路、第4步确认了宿主机超售——这两种情况你自己改不了,只能通过工单解决。其他层面的问题,登录服务器动手排查,基本都能找到答案。
推荐文章