在linux上不依赖于Nignx等服务器部署ASP.NET Core 7.0 WebAPI

笔者近期需要部署一款基于B/S架构的后端程序在linux的Debian发行版上,本文章以本次部署遇到的问题为线索,总结如何在Debian上部署ASP.NET Core7.0WebAPI应用程序。

在linux上不依赖于Nignx等服务器部署ASP.NET Core 7.0 WebAPI

  • 1.先决条件
  • 2.应用发布
  • 3.部署方式的选择
  • 4.部署步骤
    • (1)编写服务单元
    • (2)重新加载配置文件
    • (3)开启服务
    • (4)查看服务状态
  • 5.ip地址的选择
  • 6.参考文档

1.先决条件

  • 使用具有 sudo 特权的标准用户帐户访问linux
  • 在linux服务器上安装好支持将要部署的应用程序的.NET运行时

如果还没有安装.NET运行时,可以参考这篇文章在Linux上安装.NET。

2.应用发布

我们将应用的“目标运行时”发布为“可移植”,提高我们应用程序的“可移植性”,确保在部署时如果发生失败和错误,不是应用程序发布的问题。
在这里插入图片描述

3.部署方式的选择

可选择的部署方式:

  • 基于Nignx等反向代理服务器部署
  • 基于Linux服务管理器部署(如systemd)
  • 直接运行应用程序

第一种方式和第二种方式其实没有本质上的区别,只是二者在功能上各有侧重:
在这里插入图片描述

  • 如果更关注 ASP.NET Core 应用的系统管理、监控和自动启停,使用 Systemd Service 更为合适。
  • 如果需要反向代理、负载均衡等功能,或者希望将多个应用整合到同一域名或 IP 地址下,可以选择使用 Nginx 反向代理
  • 通常情况下,这两者结合使用能够充分发挥各自的优势。 Systemd Service 负责应用的启动和监控,Nginx 负责外部请求的处理和分发。

至于第三种方式,最为快捷和简单,直接启用应用程序:

root@xxxx:~# /usr/bin/dotnet /root/HuaWei/DotNetPublish/Test2/HuaWeiProject.dll --urls=http://192.168.1.xxx:监听端口
  • /usr/bin/dotnet是.NET运行时的根目录
  • /root/HuaWei/DotNetPublish/Test2/是应用程序发布后的目标目录根目录
  • HuaWeiProject.dll是应用程序发布根目录下与exe文件同名的dll文件

在这里插入图片描述

  • --urls=http://192.168.1.xxx:监听端口是我们指定监听的ip和端口,通过访问这个地址,我们可以进入调用我们WebAPI的其实页面

我这里开启了swagger,通过在远程或者本地的浏览器访问http://192.168.1.xxx:监听端口/swagger可以进入swagger调试页面
在这里插入图片描述

使用这第三种方式,在命令行键入命令后回车,我们可以成功运行应用程序,但是这个时候问题来了:
在这里插入图片描述

虽然我们可以运行成功,并且监听我们指定的地址和端口,但是我们只是运行了dll文件,可能会导致有些配置文件无法生效,笔者在使用这种方式时,就碰到了数据库配置失效的问题

fail: Microsoft.AspNetCore.Server.Kestrel[13]
      Connection id "0HN1MKK48QQ2H", Request id "0HN1MKK48QQ2H:00000001": An unhandled exception was thrown by the application.
      Autofac.Core.DependencyResolutionException: An exception was thrown while activating Service.BusinessService.ProductInfoService -> DBModels.AgiletyDbContext -> λ:Microsoft.EntityFrameworkCore.DbContextOptions`1[[DBModels.AgiletyDbContext, DBModels, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].
       ---> MySqlConnector.MySqlException (0x80004005): Access denied for user ''@'localhost' (using password: NO)
         at MySqlConnector.Core.ServerSession.ReceiveReplyAsync(IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/Core/ServerSession.cs:line 894
         at MySqlConnector.Core.ServerSession.SendClearPasswordAsync(String password, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/Core/ServerSession.cs:line 743
         at MySqlConnector.Core.ServerSession.SwitchAuthenticationAsync(ConnectionSettings cs, String password, PayloadData payload, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/Core/ServerSession.cs:line 712

MySqlConnector.MySqlException (0x80004005): Access denied for user ''@'localhost' (using password: NO)表名我的user和password都是空的。

综上所述,第三种方式可以运行一些简单的配置少的程序,但并不适合我们的WebAPI,因为我们的API一般都是要访问数据库的。解决这个问题的方法是采用第一种或第二种方式。

4.部署步骤

笔者选择的是第二种方式基于Linux服务管理器部署,一方面是因为笔者不熟悉Nignx,另一方面,这是一个Linux系统集成的最佳实践,也被ASP.NET Core官方文档作为推荐之一。

(1)编写服务单元

在终端中,我们新建一个服务单元

vim /etc/systemd/system/webapi.service

文件将会建立在 /etc/systemd/system/目录下,服务单元的名称可以自定义,我这里取的是webapi,带有一些语义信息,webapi.service中的内容如下

[Unit]
Description=ASP.NET Core WebAPI Service

[Service]
User=root
Group=root
WorkingDirectory=/root/HuaWei/DotNetPublish/Test
Restart=always
RestartSec=10
Environment=ASPNETCORE_ENVIRONMENT=Production
ExecStart=/usr/bin/dotnet /root/HuaWei/DotNetPublish/Test/HuaWeiProject.dll --urls=http://192.168.1.xxx:xx64

[Install]
WantedBy=multi-user.target

上述内容可以作为模板,需要修改的只有4个地方:

  • WorkingDirectory=/root/HuaWei/DotNetPublish/Test替换为程序发布的目标目录在linux文件系统中的绝对位置
  • /root/HuaWei/DotNetPublish/Test/HuaWeiProject.dll替换为程序发布出的dll文件及文件路径
  • urls=http://192.168.1.xxx:xx64替换为你想要监听的ip和端口(如果需要远程访问,要确保此端口已经开启了防火墙规则)

举一个例子,你的应用程序发布后,与可执行文件(exe)同名的文件为“mydll.dll”,整个目标文件夹为mypublishapi,放在了linux服务器的root目录下,现在你要监听http:172.168.1.101:8080,那么你的webapi.service应当如下:

[Unit]
Description=ASP.NET Core WebAPI Service

[Service]
User=root
Group=root
WorkingDirectory=/root/mysqlpublishapi
Restart=always
RestartSec=10
Environment=ASPNETCORE_ENVIRONMENT=Production
ExecStart=/usr/bin/dotnet /root/mypublishapi/mydll.dll --urls=http:172.168.1.101:8080

[Install]
WantedBy=multi-user.target

在vim中编辑完上述内容后,保存退出

(2)重新加载配置文件

systemctl daemon-reload

(3)开启服务

systemctl start webapi.service 

(4)查看服务状态

systemctl status webapi.service

在这里插入图片描述

看到active则表示已经运行成功,可以远程访问
在这里插入图片描述

5.ip地址的选择

ExecStart=/usr/bin/dotnet /root/mypublishapi/mydll.dll --urls=http:172.168.1.101:8080

在编写webapi.service的配置代码时,除了端口,ip地址的选择也是值得考究的。

我们有3个选择:

  • linux服务器的公网ip
  • localhost
  • ifconfig命令查询出的ip地址

笔者因为购买的服务器对ip的限制而在很长一段时间内没有部署成功,下面给出选择方案:

  • 如果远程主机ping得通linux服务器的公网ip,linux服务器自己也ping得通公网ip,那么我们可以选择直接使用公网ip,这种方法允许我们远程访问

  • 如果远程主机ping得通linux服务器的公网ip,linux服务器自己ping不通公网ip,那我们可以选择使用ifconfigfig查询出来的ip,这种方式一般也允许我们远程访问
    在这里插入图片描述

  • 选择localhost,这种方式只能在本机访问

如果linux服务器配置了公网地址,服务器的网络配置包括公网IP地址,自己ping得通公网ip,就可以远程访问,这是最直接最简单的。

使用ifconfig命令提供了服务器操作系统能够识别的本机IPv4地址,该地址可用于在本地主机上运行应用程序,并且可能会通过反向NAT技术在互联网上映射到服务器。这样,即使是通过ifconfig查看的地址也可用于本地部署和远程访问。

而localhost(127.0.0.1)是一个回环地址,用于在本地主机上访问自身服务。因此,虽然应用程序在本地主机上运行成功,但由于localhost不会通过物理网络接口发送或接收数据包,因此无法从外部网络访问。

6.参考文档

ASP.NET Core 官方文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/424295.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

H12-821_108

108.路由器R1和R2分别使用GigabitEthernet0/0/0直连,并试图建立OSFP邻居,然而邻居关系并没有成功建立,排错过程如图所示。那么以下哪一个操作可以使R1和R2邻居管理正常建立? A. [R2] ospf 1 [R2-ospf-1]area 0 [R2-ospf-1-area-0.…

边缘计算网关的重要作用-天拓四方

随着物联网技术的迅猛发展,数据量的爆炸式增长对数据处理和分析提出了更高的要求。边缘计算网关作为连接物理世界和数字世界的桥梁,正逐渐受到各行业的重视。本文将从行业背景、功能特点以及带来的效益等方面,探讨边缘计算网关在当前及未来的…

政务信息化项目可行性研究报

第四章 总体建设方案 1 建设原则 本项目将在借鉴国内相关项目建设成功经验的基础上,充分利用现有先进、 成熟技术,并考虑长远发展需求,予以统一规划、统一布局、统一设计、规范标 准、突出重点、分步实施。 (1)标准…

【Datawhale组队学习:Sora原理与技术实战】AIGC技术基础知识

AIGC是什么 AIGC全称叫做AI generated content,AlGC (Al-Generated Content,人工智能生产内容),是利用AlI自动生产内容的生产方式。 在传统的内容创作领域中,PGC(Professionally-generated Content,专业生…

【论文阅读】Usenix Security 2023 你看不见我:对基于激光雷达的自动驾驶汽车驾驶框架的物理移除攻击

文章目录 一.论文信息二.论文内容1.摘要2.引言3.作者贡献4.主要图表5.结论 一.论文信息 论文题目: You Can’t See Me: Physical Removal Attacks on LiDAR-based Autonomous Vehicles Driving Frameworks(你看不见我:对基于激光雷达的自动驾驶汽车驾驶…

如何将一个远程git的所有分支推到另一个远程分支上

如何将一个远程git的所有分支推到另一个远程分支上 最初有 12 个分支 执行 git remote add 远程名 远程git地址 git push 远程名 --tags "refs/remotes/origin/*:refs/heads/*"之后就变成 26个分支

基于springboot+vue的医院挂号就诊系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

自学也能高效备考2025年AMC8数学竞赛:2000-2024年AMC8真题解析

如何通过自学提高小学和初中数学成绩?现在小学和初中有哪些可以参加的数学竞赛?有没有难度适中、兼具趣味性的数学竞赛?现在参与人数较多的小学、初中数学有哪些?...如果你也在关注以上问题,不妨看看AMC8美国数学竞赛&…

Jmeter 安装

JMeter是Java的框架,因此在安装Jmeter前需要先安装JDK,此处安装以Windows版为例 1. 安装jdk:Java Downloads | Oracle 安装完成后设置环境变量 将环境变量JAVA_HOME设置为 C:\Program Files\Java\jdk1.7.0_25 在系统变量Path中添加 C:\Pro…

【数据结构】知识点一:线性表之顺序表

内容导航 一、什么是线性表?二、什么是顺序表?1、顺序表的概念2、顺序表的结构a. 静态顺序表:使用定长数组存储元素。b. 动态顺序表:使用动态开辟的数组存储。 三、顺序表的接口实现精讲1.接口一:打印数据2.接口二&…

肿瘤相关巨噬细胞TAM综述及研究学习②

​​​​​​​肿瘤浸润性巨噬细胞的复杂作用(综述浏览)-CSDN博客 TAM 支持癌细胞的生长和转移,并对 TME 的适应性免疫细胞产生免疫抑制作用。(上一篇学习文献) 目录 综述① TAM在肿瘤中的作用 M1与 M2 TAM作用 …

图论 - 最小生成树(Prime、Kruskal)

文章目录 前言Part 1:Prim算法求最小生成树1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 Part 2:Kruskal算法求最小生成树1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 前言 本篇博客介绍两种求最小生成树的方法&#xff…

Linux笔记--Vim编辑器

一、vi和vim vi编辑器是所有Unix及Linux系统下标准的编辑器,类似于Windows系统下的记事本。很多软件默认使用vi作为他们编辑的接口。vim是进阶版的vi,vim可以视为一种程序编辑器。 复制/etc/passwd文件到自己的目录下(不要直接修改letc/passwd),后面使用…

k8s资源管理之声明式管理方式

1 声明式管理方式 1.1 声明式管理方式支持的格式 JSON 格式:主要用于 api 接口之间消息的传递 YAML 格式:用于配置和管理,YAML 是一种简洁的非标记性语言,内容格式人性化,较易读 1.2 YAML 语法格式: ●…

k8s 集群调度,标签,亲和性和反亲和性,污点和容忍,pod启动状态 排错详解

目录 pod启动创建过程 kubelet持续监听的原因 调度概念 调度约束 调度过程 优点 原理 优先级选项 示例 指定调度节点 标签基本操作 获取标签帮助 添加标签(Add Labels): 更新标签(Update Labels) 删除标…

基于springboot+vue的中国陕西民俗网

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

家政按摩上门服务小程序搭建

家政按摩上门服务小程序支持技师入驻申请,用户可以通过在线下单预约家政服务,并根据距离、价格、销量好评度等条件进行筛选和选择。用户可以选择技师进行预约,并填写自己的服务地点和时间,享受上门服务。同时,技师也可…

C++_数据类型_整形

数据类型 C规定在创建一个变量或常量时,必须要指定出相应得数据类型,否则无法给变量分配内存 整形 作用 整形变量表示的是整数型的数据 方式 越界

攻防世界-get_post

题目信息 相关知识 -G:表示GET请求,缺省POST -d参数用于发送 POST 请求的数据体 使用-d参数以后,HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法,因此可以省略-X PO…

跨站脚本攻击xss-labs(1-20)靶机练手

目录 一、跨站脚本攻击(XSS) 1.1 漏洞简介 1.2:类型 1.3 XSS危害 1.4XSS防御规则 二、环境搭建 三、xsst通关记录 Level 1:文本解析为 HTML Level 2:htmlspecialchars;input 标签 value 注入 定义和用法 字符过滤绕过 …