![AWS EC2 Ubuntu 实例启动了 WildFly(Java / Jakarta EE 服务器),但似乎无法通过浏览器访问](https://linux22.com/image/792701/AWS%20EC2%20Ubuntu%20%E5%AE%9E%E4%BE%8B%E5%90%AF%E5%8A%A8%E4%BA%86%20WildFly%EF%BC%88Java%20%2F%20Jakarta%20EE%20%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%89%EF%BC%8C%E4%BD%86%E4%BC%BC%E4%B9%8E%E6%97%A0%E6%B3%95%E9%80%9A%E8%BF%87%E6%B5%8F%E8%A7%88%E5%99%A8%E8%AE%BF%E9%97%AE.png)
我正在尝试为 JBoss WildFly 31.0.0.Final 设置 AWS,以启动并运行演示 Web 应用程序。因此,我找到了本教程:
https://kamalmeet.com/cloud-computing/amazon-ec2-step-by-step-guide-to-setup-a-java-application/
我创建了一个 Ubuntu 实例,并将密钥对设置为只读,并手动更改了本地 Windows 11 计算机上 PEM 文件的一些属性。然后,我使用 SSH shell 以 AWS 默认用户的身份连接到我的 Ubuntu 实例ubuntu
。
我最终得到:
(我知道发布这个截图可能不是最明智的做法,但为了这个问题,一旦问题解决,我会重复整个过程......)
因此,我基本上复制粘贴了教程中列出的命令,并做了一些“小”调整,例如apt upgrade
安装 Java 17 + JDK 17:
sudo apt update
sudo apt upgrade
sudo apt install openjdk-17-jdk openjdk-17-jre
我在此发表java -version
言论:
openjdk version "17.0.9" 2023-10-17
OpenJDK Runtime Environment (build 17.0.9+9-Ubuntu-122.04)
OpenJDK 64-Bit Server VM (build 17.0.9+9-Ubuntu-122.04, mixed mode, sharing)
现在添加用户和组wildfly
:
sudo groupadd -r wildfly
sudo useradd -r -g wildfly -d /opt/wildfly -s /sbin/nologin wildfly
获取最新的 WildFly,解压缩/解压它,将其放入/opt/
并创建一个符号链接/opt/wildfly/
以指向实际目录。
wget https://github.com/wildfly/wildfly/releases/download/31.0.0.Final/wildfly-31.0.0.Final.tar.gz -P /tmp
sudo tar xf /tmp/wildfly-31.0.0.Final.tar.gz -C /opt/
sudo ln -s /opt/wildfly-31.0.0.Final /opt/wildfly
sudo chown -RH wildfly: /opt/wildfly
现在创建一个放置 WildFly 配置的目录wildfly.conf
:
sudo mkdir -p /etc/wildfly
sudo cp /opt/wildfly/docs/contrib/scripts/systemd/wildfly.conf /etc/wildfly/
sudo nano /etc/wildfly/wildfly.conf
wildfly.conf
您在本地机器上进行开发时从未需要甚至注意到的文件如下所示:
# The configuration you want to run
WILDFLY_CONFIG=standalone.xml
# The mode you want to run
WILDFLY_MODE=standalone
# The address to bind to
WILDFLY_BIND=0.0.0.0
我不知道该在这里编辑什么。我保留原样,使其被standalone.xml
使用。绑定地址:IIRC0.0.0.0
是广播地址,因此 WildFly 接受来自世界任何地方的请求(??)。
现在将文件复制launch.sh
到 WildFlybin
目录并使*.sh
那里的所有脚本可执行:
sudo cp /opt/wildfly/docs/contrib/scripts/systemd/launch.sh /opt/wildfly/bin/
sudo sh -c "chmod +x /opt/wildfly/bin/*.sh"
该文件launch.sh
如下所示:
if [ "x$WILDFLY_HOME" = "x" ]; then
WILDFLY_HOME="/opt/wildfly"
fi
if [[ "$1" == "domain" ]]; then
$WILDFLY_HOME/bin/domain.sh -c $2 -b $3
else
$WILDFLY_HOME/bin/standalone.sh -c $2 -b $3
fi
WildFly 贡献脚本基本上会查找WILDFLY_HOME
环境变量,如果未设置,则假定/opt/wildfly
为 home,从而导致在/opt/wildfly/bin/standalone.sh
设置时执行launch.sh
。
现在配置启动器(注意,我对 Ubuntu 有绝对基本的了解)。据我所知,/etc/systemd/system/
Ubuntu 中的目录是一种更现代的方法,用于管理服务和会话(以摆脱相当过时的init.d
东西,据我所知)。因此,我们将另一个 WildFly contrib 脚本复制到/etc/systemd/system/
:
sudo cp /opt/wildfly/docs/contrib/scripts/systemd/wildfly.service /etc/systemd/system/
看起来wildfly.service
像这样:
[Unit]
Description=The WildFly Application Server
After=syslog.target network.target
Before=httpd.service
[Service]
Environment=LAUNCH_JBOSS_IN_BACKGROUND=1
EnvironmentFile=-/etc/wildfly/wildfly.conf
User=wildfly
LimitNOFILE=102642
PIDFile=/run/wildfly/wildfly.pid
ExecStart=/opt/wildfly/bin/launch.sh $WILDFLY_MODE $WILDFLY_CONFIG $WILDFLY_BIND
StandardOutput=null
[Install]
WantedBy=multi-user.target
所以在这里您可以看到这个服务文件从中获取配置/etc/wildfly/wildfly.conf
并且它实际执行/opt/wildfly/bin/launch.sh
(这是其他尚未设置的环境变量出现的地方)。
下一个命令似乎告诉 Ubuntu 重新加载服务配置(守护进程)并启动 + 启用 JBoss WildFly:
sudo systemctl daemon-reload
sudo systemctl start wildfly
sudo systemctl enable wildfly
发出最终判决书sudo systemctl status wildfly
将产生:
ubuntu@ip-172-31-19-16:~$ sudo systemctl daemon-reload
ubuntu@ip-172-31-19-16:~$ sudo systemctl start wildfly
ubuntu@ip-172-31-19-16:~$ sudo systemctl enable wildfly
ubuntu@ip-172-31-19-16:~$ sudo systemctl status wildfly
● wildfly.service - The WildFly Application Server
Loaded: loaded (/etc/systemd/system/wildfly.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-02-05 10:19:39 UTC; 16s ago
Main PID: 22971 (launch.sh)
Tasks: 127 (limit: 1121)
Memory: 386.1M
CPU: 15.964s
CGroup: /system.slice/wildfly.service
├─22971 /bin/bash /opt/wildfly/bin/launch.sh standalone standalone.xml 0.0.0.0
├─22972 /bin/sh /opt/wildfly/bin/standalone.sh -c standalone.xml -b 0.0.0.0
└─23093 java "-D[Standalone]" "-Djdk.serialFilter=maxbytes=10485760;maxdepth=128;maxarray=100000;maxrefs=300000" -Xms64m -Xmx512m -XX:Metaspac>
最后一条命令是:
sudo ufw allow 8080/tcp
它被称为“不复杂的防火墙”,似乎安装在大多数 Ubuntu 和 Debian 系统上。它显然向外界开放了 8080 端口。
问题:
无论我做什么,打开浏览器访问给定的公共 IP + 端口,我都无法访问刚刚设置的 WildFly:
上述错误信息的意思是“连接已超时”。
那么,我在这里做错了什么?AWS 是否从外部阻止了端口 8080?是否完全不允许使用 HTTP?