Ubuntu+Apache部署ASP.NET Core服务报code=exited,status=150错误
错误原因
ASP.NET Core应用在systemd下返回status=150退出码,是进程启动阶段触发未捕获运行时异常直接终止导致的,结合给出的配置和Ubuntu+Apache反向代理的部署场景,常见诱因如下:
- service配置未显式指定应用监听地址,systemd运行环境不继承交互式shell的默认环境变量,易出现端口绑定失败问题
- 服务器未安装与应用编译版本匹配的ASP.NET Core运行时,仅安装了.NET基础运行时或SDK版本不匹配
- 应用目录、文件权限配置错误,进程无法读取dll、配置文件,或没有日志、临时文件的写入权限
- 现有service配置标注为CentOS 7环境,实际运行在Ubuntu上,启动用户、服务依赖顺序等参数不兼容
- 应用本身存在启动阶段报错(如数据库连接失败、配置文件缺失、依赖项找不到),systemd默认配置未捕获到具体错误输出
修复步骤
按以下顺序排查调整即可:
1. 手动运行应用定位根因
先切换到应用目录,用和service配置完全一致的命令手动启动,可直接看到具体报错,避免盲目改配置:
cd /var/www/serije /usr/bin/dotnet Serije.dll
- 如果手动运行可以正常启动,问题完全出在systemd配置上,按后续步骤调整即可
- 如果手动运行直接报错,根据输出对应修复:
- 提示找不到匹配版本的dotnet运行时:安装和项目编译版本一致的ASP.NET Core运行时包
- 提示文件格式无法识别:发布时未指定
linux-x64运行时标识,重新发布Linux版本的部署包 - 提示配置缺失、数据库连接失败等业务类错误:对应补全配置、调整网络/权限即可
2. 修正systemd服务配置
替换原有.service文件内容为适配Ubuntu环境的配置,示例如下(文件路径一般为/etc/systemd/system/app.service,和你之前的文件命名保持一致即可):
[Unit] Description=ASP.NET Core App running on Ubuntu After=network.target apache2.service Requires=apache2.service [Service] WorkingDirectory=/var/www/serije ExecStart=/usr/bin/dotnet /var/www/serije/Serije.dll --urls "http://127.0.0.1:5000" Restart=always RestartSec=10 KillSignal=SIGINT SyslogIdentifier=dotnet-serije User=www-data Group=www-data Environment=ASPNETCORE_ENVIRONMENT=Production Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target
配置调整点说明:
- 启动用户从root改为Ubuntu下Apache默认的运行用户
www-data,避免root权限带来的安全风险和文件权限冲突 - 显式添加
--urls参数指定应用监听127.0.0.1:5000,仅对本地Apache代理暴露端口,避免默认绑定地址/端口随机导致的代理失败 - 添加
After和Requires配置,保证网络、Apache服务就绪后再启动应用,解决启动顺序导致的依赖问题 - 配置标准输出、错误输出到journald,后续排查日志无需额外找文件
3. 修复应用目录权限
给应用目录配置正确的归属和权限,保证www-data用户可正常读写:
chown -R www-data:www-data /var/www/serije chmod -R 755 /var/www/serije
4. 重载配置启动服务
依次执行以下命令重载systemd规则、启动服务并设置开机自启:
systemctl daemon-reload systemctl enable app.service systemctl start app.service
启动后执行systemctl status app.service查看运行状态,如果仍启动失败,执行journalctl -u app.service -f查看实时日志,即可定位到具体错误点。
补充说明
如果应用采用独立部署模式发布,不依赖系统预装的dotnet运行时,ExecStart字段直接填写发布包内的Serije可执行文件路径即可,不需要加/usr/bin/dotnet前缀,同时要给该可执行文件添加执行权限。
内容的提问来源于stack exchange,提问作者xddssss
相关产品推荐
相关产品推荐

