You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 03:09:03