news 2026/9/3 16:17:09

linux系统小白部署c#程序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
linux系统小白部署c#程序

https://www.kimi.com/share/1a05541b-b1f2-8f4d-8000-00006a957e17

User: c#在windows 系统上的 开发的signalr 服务端 9001端口,webapi接口 9002端口,vue开发的项目9003端口 怎么部署到麒麟服务器,,服务器无法联网,,是一个全新的服务器,好多基础的环境都没有安装,完全小白linux系统小白,怎么搞定这件事情
Kimi: 我帮你整理了一份零基础、手把手、完全离线的部署方案。核心思路是:越简单越好,不编译、不装依赖、复制粘贴就能跑


📋 总体思路(3 大步)

┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ ① Windows上 │ ──→ │ ② 传到服务器 │ ──→ │ ③ 服务器启动 │ │ 打包三个项目 │ │ MobaXterm拖拽 │ │ 复制粘贴命令 │ └─────────────────┘ └─────────────────┘ └─────────────────┘

为什么这样设计?

  • SignalR + WebAPI:用「自包含发布」,自带 .NET 运行环境,服务器不需要装任何 .NET 相关东西
  • Vue 前端:用Python3内置的静态文件服务器托管,不需要 Nginx,不需要编译
  • 你只需要在服务器上复制粘贴命令,不需要懂 Linux

第一步:在 Windows 上准备文件(30 分钟)

1.1 打开你的 SignalR 项目,发布

在项目文件夹内,打开PowerShellCMD,执行:

dotnet publish-cRelease-rlinux-x64 --self-containedtrue-o./publish-signalr

等待完成后,项目文件夹里会出现一个publish-signalr文件夹。

怎么确认成功了?打开publish-signalr文件夹,里面应该有一个没有后缀名的文件(名字和你的项目名一样,比如MySignalR),还有很多.so文件。这个无后缀的文件就是可执行程序。

1.2 打开你的 WebAPI 项目,发布

同样执行:

dotnet publish-cRelease-rlinux-x64 --self-containedtrue-o./publish-webapi

完成后也有publish-webapi文件夹,里面也有一个无后缀名的可执行文件。

1.3 修改 Vue 项目的 API 地址

找到 Vue 项目里的.env.production文件(如果没有就新建一个),内容改成:

VUE_APP_API_URL=http://你的服务器IP:9002 VUE_APP_SIGNALR_URL=http://你的服务器IP:9001

你的服务器IP换成实际 IP,比如http://192.168.1.100:9002

然后构建:

npmrun build

完成后会出现一个dist文件夹,里面就是前端静态文件。

1.4 新建一个文件夹,整理要上传的内容

在 Windows 桌面新建文件夹,命名为deploy,里面建 3 个子文件夹:

deploy/ ├── signalr/ ← 把 publish-signalr 里的所有文件复制进来 ├── webapi/ ← 把 publish-webapi 里的所有文件复制进来 └── vue/ ← 把 dist 里的所有文件复制进来

最终效果:

  • deploy/signalr/里有你的 SignalR 可执行文件(无后缀)
  • deploy/webapi/里有你的 WebAPI 可执行文件(无后缀)
  • deploy/vue/里有index.htmlstatic文件夹

第二步:用 MobaXterm 上传到服务器(10 分钟)

ps:打开 MobaXterm 的 SFTP 文件浏览器​​
​​启动 MobaXterm​​,点击左上角的 ​​"Session"​​ → ​​"New Session"​​。
选择 ​​"SFTP"​​(或直接使用已打开的 SSH 会话,按 Ctrl+Shift+F 打开 SFTP 面板)。
输入服务器信息:
​​Remote host​​:服务器 IP 或域名(如 192.168.1.100)
​​Username​​:你的用户名(如 root)
​​Password​​:输入密码(或使用密钥认证)

  1. 用 MobaXterm 连接上你的麒麟服务器
  2. 左侧的 SFTP 文件浏览器(如果没有,点上方工具栏的「SFTP」按钮)
  3. 在左侧进入/opt目录(直接点..往上退到根目录,再双击opt
  4. 把 Windows 上的deploy文件夹,直接拖拽到 MobaXterm 左侧的/opt目录下
  5. 等待上传完成(右下角有进度)

上传完成后,在 MobaXterm 右侧终端输入:

ls/opt/deploy

应该能看到signalrwebapivue三个文件夹。


第三步:在服务器上部署(复制粘贴即可)

以下命令逐条复制粘贴到 MobaXterm 终端执行。你是 root 用户,不需要加sudo

3.1 创建专用用户和目录

# 创建一个专门跑程序的用户(安全规范,不用root跑应用)useradd-r-m-d/opt/app-s/bin/false appuser# 创建正式部署目录mkdir-p/opt/app/signalr /opt/app/webapi /opt/app/vuemkdir-p/var/log/app

解释:上面命令就是创建了一个叫appuser的虚拟用户,以后程序用这个用户身份运行,更安全。

3.2 把上传的文件移到正式位置

# 复制文件cp-r/opt/deploy/signalr/* /opt/app/signalr/cp-r/opt/deploy/webapi/* /opt/app/webapi/cp-r/opt/deploy/vue/* /opt/app/vue/# 给可执行文件添加运行权限(关键!)chmod+x /opt/app/signalr/*chmod+x /opt/app/webapi/*# 把所有文件归属给 appuserchown-Rappuser:appuser /opt/app /var/log/app

3.3 确认可执行文件名

执行下面命令,看看你的程序叫什么名字:

ls-F/opt/app/signalr|grep-v'/'|grep-v'\.'ls-F/opt/app/webapi|grep-v'/'|grep-v'\.'

会输出类似:

MySignalR MyWebApi

记住这两个名字,下面要用。

3.4 检查 Python3(用来跑 Vue)

python3--version

如果显示类似Python 3.9.x,说明有 Python3,继续下一步。
如果提示未找到命令,告诉我,需要换方案。


3.5 创建 3 个自启动服务(systemd)

下面 3 段命令,一段一段复制粘贴执行。注意把MySignalRMyWebApi换成你实际的名字。

① SignalR 服务(9001 端口)
cat>/etc/systemd/system/signalr.service<<'EOF' [Unit] Description=SignalR Server After=network.target [Service] Type=simple User=appuser Group=appuser WorkingDirectory=/opt/app/signalr ExecStart=/opt/app/signalr/MySignalR Environment=ASPNETCORE_ENVIRONMENT=Production Environment=ASPNETCORE_URLS=http://0.0.0.0:9001 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target EOF

⚠️注意:把上面ExecStart=后面的MySignalR换成你实际的可执行文件名!

② WebAPI 服务(9002 端口)
cat>/etc/systemd/system/webapi.service<<'EOF' [Unit] Description=WebAPI Server After=network.target [Service] Type=simple User=appuser Group=appuser WorkingDirectory=/opt/app/webapi ExecStart=/opt/app/webapi/MyWebApi Environment=ASPNETCORE_ENVIRONMENT=Production Environment=ASPNETCORE_URLS=http://0.0.0.0:9002 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target EOF

⚠️注意:把上面ExecStart=后面的MyWebApi换成你实际的可执行文件名!

③ Vue 前端服务(9003 端口,用 Python3 托管)
cat>/etc/systemd/system/vue.service<<'EOF' [Unit] Description=Vue Frontend After=network.target [Service] Type=simple User=appuser Group=appuser WorkingDirectory=/opt/app/vue ExecStart=/usr/bin/python3 -m http.server 9003 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target EOF

3.6 启动三个服务

# 重新加载系统服务配置systemctl daemon-reload# 启动并设置开机自启systemctl start signalr systemctl start webapi systemctl start vue systemctlenablesignalr systemctlenablewebapi systemctlenablevue

3.7 开防火墙(让外部能访问)

# 放行 9001、9002、9003 三个端口firewall-cmd--zone=public --add-port=9001/tcp--permanentfirewall-cmd--zone=public --add-port=9002/tcp--permanentfirewall-cmd--zone=public --add-port=9003/tcp--permanentfirewall-cmd--reload# 查看是否放行成功firewall-cmd --list-ports

应该显示:9001/tcp 9002/tcp 9003/tcp


3.8 处理 SELinux(麒麟高级版必须做)

# 允许程序绑定端口、对外通信setsebool-Phttpd_can_network_connect on

第四步:验证是否成功

在 MobaXterm 里执行:

# 查看三个服务是否都在运行systemctl status signalr webapi vue

看到Active: active (running)就是成功了。

再执行:

# 查看端口是否被监听ss-tlnp|grep-E'9001|9002|9003'

应该显示三个端口都在监听。


第五步:浏览器访问

地址用途
http://服务器IP:9001SignalR 服务
http://服务器IP:9002WebAPI 接口
http://服务器IP:9003Vue 前端页面

⚠️ 非常重要:CORS 跨域问题

因为 Vue 在 9003 端口,调用 9001 和 9002,浏览器会拦截(跨域)。你需要在 C# 代码里加允许跨域:

SignalR 项目的Program.cs

builder.Services.AddCors(options=>{options.AddPolicy("AllowAll",policy=>{policy.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();});});// 在 app.MapHub 之前加app.UseCors("AllowAll");

WebAPI 项目的Program.cs

builder.Services.AddCors(options=>{options.AddPolicy("AllowAll",policy=>{policy.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();});});// 在 app.MapControllers 之前加app.UseCors("AllowAll");

加完后,重新在 Windows 上发布、重新上传到服务器、重启服务:

systemctl restart signalr webapi

🔧 常用维护命令(收藏)

需求命令
重启 SignalRsystemctl restart signalr
重启 WebAPIsystemctl restart webapi
重启 Vuesystemctl restart vue
看实时日志journalctl -u signalr -f
看 WebAPI 日志journalctl -u webapi -f
看所有服务状态systemctl status signalr webapi vue

🔧 配置修改后怎么更新到服务上

最简单的方式是:在 Windows 上改好,重新上传覆盖。你不需要学 Linux 编辑器。


方式一:Windows 修改后重新上传(推荐,小白最友好)

步骤 1:在 Windows 上找到配置文件

去你之前发布出来的文件夹里找:

publish-signalr/appsettings.json

步骤 2:用记事本/VS Code 打开修改

改完后保存

步骤 3: 先在服务器上停止 WebAPI

systemctl stop webapi

步骤 4:重新上传到服务器

用 MobaXterm:

  1. 左侧 SFTP 进入/opt/app/signalr/
  2. 把 Windows 上改好的appsettings.json拖拽进去,覆盖原文件

步骤 5:重启服务生效

systemctl restart signalr
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 16:14:44

计算机学生如何通过网络安全技术提前布局职业发展

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/3 16:13:52

反激式开关电源CCM、DCM、BCM工作模式详解与设计选择

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/3 16:10:52

漏洞挖掘的快乐你想象不到

从前端信息泄露进行漏洞挖掘 前言 在漏洞挖掘中&#xff0c;比的不但是资产收集的本领&#xff0c;更多的是细心。往往毫不起眼的前端文件&#xff0c;却总能给人带来意想不到的惊喜。 开始 在某次漏洞挖掘中&#xff0c;由于本人一如既往的菜&#xff0c;即使肝了很长时间…

作者头像 李华
网站建设 2026/9/3 16:10:51

MoonShot AI长文本创作实战:从原理到应用,重构AI辅助写作流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/3 16:10:30

AI编程新范式:从代码生成到全栈自动化开发的工具链整合

随着大模型技术的深度参与&#xff0c;软件开发正在经历一场从“手工作坊”向“智能工业化”的深刻变革。2026年&#xff0c;AI编程已跨越了单纯的代码补全阶段&#xff0c;进化为能够自主理解需求、规划架构并执行测试的AI智能体&#xff08;Agent&#xff09;。这种从单点代码…

作者头像 李华
网站建设 2026/9/3 16:08:06

微信小程序蓝牙控制继电器:从BLE API到硬件通信的完整实践

简介&#xff1a;本资源是一套完整的微信小程序蓝牙控制继电器及串口调试实战项目源码&#xff0c;面向嵌入式开发初学者、物联网爱好者及微信小程序硬件交互实践者&#xff0c;解决蓝牙通信、STM32外设控制与小程序端调试工具集成等典型IoT开发痛点。压缩包共56个文件&#xf…

作者头像 李华