在Bluehost/IONOS Linux共享主机部署.NET 7 REST服务遇CoreCLR创建失败
别只看套餐总内存,查单个进程的内存配额:共享主机标的20GB总内存是整台机器的资源,但单个进程能分配到的内存可能被限制在几百MB甚至更低——这是共享主机的常规限制逻辑。去主机控制面板找进程资源限制的选项,或者直接问客服单个进程的内存上限。如果配额不够,要么申请提额,要么往下看优化方案。
给启动命令加内存优化参数:启动应用前设置两个环境变量,强制.NET使用更省内存的运行模式:
export COMPlus_GCHeapCount=1 COMPlus_GCServer=0 && ./YourAppName前者让GC只用单堆,后者切换到工作站GC模式,都能降低启动时的内存消耗。
重新编译时做裁剪优化:发布自包含包的时候加裁剪参数,砍掉没用的框架代码,减小包体积和内存占用:
dotnet publish -c Release -r linux-x64 --self-contained true -p:PublishTrimmed=true还可以试试单文件发布(
-p:PublishSingleFile=true),但要确认共享主机支持这种运行方式。核对主机的系统依赖版本:自包含部署虽然自带运行时,但还是依赖系统的基础库(比如libicu、libssl)。用SSH连主机跑
ldd --version和uname -r,对比你本地Ubuntu的版本,如果差太多,就换个和主机系统版本一致的环境编译(比如用对应版本的Docker镜像打包)。检查当前用户的资源限制:文件权限给够了不代表进程能用到资源。用
ulimit -a命令看当前用户的资源限制,重点看max memory size——要是这个值远低于.NET启动需要的内存,就得找主机方调整用户组的配额。换框架依赖部署试试:如果主机已经装了.NET 7运行时,别用自包含了,改成框架依赖部署,能大幅降低内存占用:
dotnet publish -c Release -r linux-x64 --self-contained false先确认主机上
dotnet --version输出的是7.x版本。
内容的提问来源于stack exchange,提问作者Nikolas

