Perl Mojolicious服务部署后远程无法连接问题排查求助
Mojolicious服务无响应故障排查步骤
1. 确认Hypnotoad进程实际运行状态
你执行netstat时未加sudo权限,所以PID列无有效信息,首先要确认监听80端口的进程是否为Hypnotoad:
- 执行
sudo netstat -lntp或ss -lntp查看80端口对应的PID和进程名,确认不是Nginx、Apache等其他服务占用80端口导致冲突 - 执行
ps aux | grep hypnotoad检查Hypnotoad的主进程和Worker进程是否正常存活,有没有出现崩溃自动退出的情况
2. 本地优先测试,排除网络层问题
不要直接从宿主机浏览器访问,先在虚拟机内部验证服务可用性:
- 虚拟机内执行
curl http://127.0.0.1看能否正常返回接口内容,如果本地curl都无响应,说明是服务本身故障;如果本地访问正常,说明问题出在虚拟机网络配置上 - 本地访问正常但宿主机访问不通时,依次排查:
- 虚拟机防火墙规则:执行
sudo iptables -L -n查看是否有禁止80端口入站的规则,CentOS系列可额外检查firewalld配置,Ubuntu系列检查ufw配置 - 虚拟机网络模式:如果是NAT模式,需要在VMware/VirtualBox等虚拟机管理软件中配置宿主机到虚拟机的80端口映射;如果是桥接模式,确认宿主机和虚拟机在同一网段,能互相ping通
- 若为云服务器实例,检查云平台安全组是否放行了对应端口的入站规则
- 虚拟机防火墙规则:执行
3. 查看Hypnotoad日志定位报错
你当前的代码没有配置日志输出,无法定位服务内部异常,可修改代码添加日志配置:
use Mojolicious::Lite; use strict; use v5.18; app->config(hypnotoad => {listen => ['http://*:80']}); # 新增日志配置 app->log->level('debug'); app->log->path('/tmp/hypnotoad.log'); # 原有路由代码不变 get '/' => sub { my $c = shift; return $c->render(text => "At the index end point"); }; get '/foo' => sub { my $c = shift; return $c->render(text => "At the foo end point"); }; get '/bar' => sub{ my $c = shift; return $c->render(text => "At the bar end point"); }; app->start;
修改后重启Hypnotoad:sudo hypnotoad -s app2.pl && sudo hypnotoad app2.pl,访问服务后查看/tmp/hypnotoad.log中的报错信息即可定位问题。
也可以先用Morbo启动测试,Morbo会直接把日志输出到终端更便于排查:执行sudo morbo -l http://*:8080 app2.pl 用非特权端口测试,查看终端输出的报错内容。
4. 验证特权端口权限问题
80属于1024以下的特权端口,需要root权限才能绑定,你可以先修改监听端口为8080这类大于1024的非特权端口,不用sudo直接执行hypnotoad app2.pl启动测试,如果非特权端口访问正常,说明是特权端口的权限配置异常导致的问题。
内容的提问来源于stack exchange,提问作者Ricky
相关产品推荐
相关产品推荐

