AWS Amazon Linux 2上systemd服务启动失败排查求助
问题背景
在Amazon Linux 2的AWS EC2实例上部署Node.js应用,手动执行server.js完全正常:
[ec2-user@ip-*********** portfolio_v3]$ nvm use 16 Now using node v16.19.1 [ec2-user@ip-*********** portfolio_v3]$ MAIL_JET_API_KEY_PRIVATE="..." NYT_API_KEY="..." node server.js ...
创建systemd服务配置文件/etc/systemd/system/portfolio-v3.service:
[Unit] Description=portfolio-v3 After=multi-user.target [Service] Environment=MJ_API_KEY_PRIVATE=1234567890 Environment=NYT_API_KEY=1234567890 ExecStart=/home/.nvm/versions/node/v16.19.1/bin/node /home/ec2-user/portfolio-v3/server.js Restart=always RestartSec=10 StandardOutput=syslog StandardError=syslog SyslogIdentifier=portfolio-v3 User=ec2-user [Install] WantedBy=multi-user.target
执行以下命令后服务启动失败:
sudo chmod 644 /etc/systemd/system/portfolio-v3.service sudo systemctl daemon-reload sudo systemctl enable portfolio-v3.service sudo systemctl start portfolio-v3.service
服务状态显示:
$ sudo systemctl status portfolio-v3.service ● portfolio-v3.service - portfolio-v3 Loaded: loaded (/etc/systemd/system/portfolio-v3.service; enabled; vendor preset: disabled) Active: activating (auto-restart) (Result: exit-code) since Thu 2023-03-16 04:55:42 UTC; 8s ago Process: 7067 ExecStart=/home/.nvm/versions/node/v16.19.1/bin/node /home/ec2-user/portfolio-v3/server.js (code=exited, status=203/EXEC) Main PID: 7067 (code=exited, status=203/EXEC) Mar 16 04:55:42 ip-172-31-18-127.us-west-2.compute.internal systemd[1]: portfolio-v3.service: main process exited, code=exited, status=203/EXEC Mar 16 04:55:42 ip-172-31-18-127.us-west-2.compute.internal systemd[1]: Unit portfolio-v3.service entered failed state. Mar 16 04:55:42 ip-172-31-18-127.us-west-2.compute.internal systemd[1]: portfolio-v3.service failed.
排查思路
检查Node路径的存在性与权限
status=203/EXEC核心原因是systemd无法执行指定二进制文件,先确认Node路径有效性:- 切换到
ec2-user,执行ls -l /home/.nvm/versions/node/v16.19.1/bin/node,确认文件存在且ec2-user拥有执行权限(权限位含x) - 若路径错误,通过
nvm use 16 && which node获取正确路径,修正ExecStart中的Node路径
- 切换到
补充工作目录配置
手动执行时在项目目录下运行,systemd默认工作目录为根目录,可能导致应用找不到依赖/配置:
在[Service]段添加WorkingDirectory=/home/ec2-user/portfolio-v3,确保应用在正确目录启动对齐环境变量名称
配置文件中环境变量名为MJ_API_KEY_PRIVATE,但手动执行时用的是MAIL_JET_API_KEY_PRIVATE,变量名不匹配会导致应用启动失败,修正Environment行的变量名与手动执行一致查看详细日志定位错误
仅靠status信息不足以排查,执行sudo journalctl -u portfolio-v3.service -f实时查看服务日志,获取具体启动报错;同时检查应用自身日志,确认是否存在依赖缺失、端口占用等问题直接测试ExecStart命令
切换到ec2-user,直接执行ExecStart中的完整命令:su - ec2-user /home/.nvm/versions/node/v16.19.1/bin/node /home/ec2-user/portfolio-v3/server.js若执行失败,根据报错信息修复(如依赖未安装、文件权限不足等)
处理nvm环境加载问题
nvm是用户级环境变量,systemd启动服务时不会加载用户bash配置(如.bashrc/.bash_profile),可通过两种方式解决:- 改用全局安装的Node(
sudo yum install nodejs) - 修改
ExecStart先加载nvm环境再启动应用:ExecStart=/bin/bash -c 'source /home/ec2-user/.nvm/nvm.sh && nvm use 16 && node /home/ec2-user/portfolio-v3/server.js'
- 改用全局安装的Node(
内容的提问来源于stack exchange,提问作者Aaron Parisi

