C#进阶-在Ubuntu上部署ASP.NET Core Web API应用

news2025/1/11 4:14:31

随着云计算和容器化技术的普及,Linux 服务器已成为部署 Web 应用程序的主流平台之一。ASP.NET Core 作为一个跨平台、高性能的框架,非常适合在 Linux 环境中运行。本篇博客将详细介绍如何在 Linux 服务器上部署 ASP.NET Core Web API 应用,包括部署准备、应用发布、配置反向代理(Nginx)、设置系统服务以及日志管理等步骤。


一、部署准备

在开始之前,请确保你具备以下条件:

  • 一台运行 Linux(如 Ubuntu 20.04)的服务器,具有 SSH 访问权限。
  • ASP.NET Core Web API 项目,并确保在本地能够正常运行。

二、安装 MySQL(如需)

1. 安装MySQL服务器

sudo apt install mysql-server -y

2. 启动并设置MySQL开机自启

sudo systemctl start mysql
sudo systemctl enable mysql

3. 验证MySQL安装

登录MySQL以确认安装成功。

sudo mysql -u root -p

MySQL默认密码是root,直接登录即可。

4. 修改初始密码

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password';

5. 创建库和表

这里我们用SQL语句把项目需要的数据库建好即可。


三、安装 .NET 运行环境

首先,需要在你的 Linux 服务器上安装 .NET 运行环境(如果选择框架依赖部署)或 .NET SDK(如果需要编译代码)。

1. 添加 Microsoft 包存储库

# 安装所需的依赖
sudo apt-get update
sudo apt-get install -y wget apt-transport-https software-properties-common

在这里插入图片描述

# 下载并安装微软的公钥
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb

# 更新包索引
sudo apt-get update

在这里插入图片描述

2. 安装 .NET 运行环境

# 安装 ASP.NET Core 运行时
sudo apt-get install -y aspnetcore-runtime-8.0

在这里插入图片描述

注意:根据你的应用所使用的 .NET 版本,调整安装的运行时版本。

3. 验证安装

dotnet --version

你应该会看到已安装的 .NET 版本号,如 8.0.x

在这里插入图片描述


四、发布 ASP.NET Core 应用

1. Visual Studio 发布应用

在本地开发环境中,使用 visual studio 发布应用。

在这里插入图片描述

选择框架依赖部署(FDD)或自包含部署(SCD):

  • 框架依赖部署(FDD):目标服务器需要预先安装 .NET 运行环境。
  • 自包含部署(SCD):应用程序包含了所有必要的运行时文件,无需在服务器上安装 .NET。

在这里插入图片描述

保存发布配置,点击发布。

在这里插入图片描述

发布成功。

在这里插入图片描述

发布后的项目在目标位置里:D:\DCO\dco_ll\bin\Release\net8.0

在这里插入图片描述

2. 复制发布后的内容到服务器目录

将文件夹内所有内容复制到服务器上的预发布项目目录上。

在这里插入图片描述

其中,应用涉及的配置信息一般在 appsettings.json 里。


五、启动项目

切换到项目目录,指定端口启动项目。

cd xxxx #你的项目在服务器上的部署路径
sudo dotnet DCOWebhook.dll --urls "http://0.0.0.0:80" 

在这里插入图片描述

到这里,程序已经用公网IP访问了。


六、配置 Nginx 作为反向代理(可选)

Nginx 将作为反向代理,将来自客户端的请求转发到 ASP.NET Core 应用,处理 SSL、负载均衡等任务。

如果你的项目端口监听的不是默认80端口(比如5000端口),那么可以通过 Nginx 监听80端口进行转发,访问80端口的请求会自动转发到5000端口上。

1. 安装 Nginx

sudo apt-get update
sudo apt-get install -y nginx

2. 配置 Nginx

创建一个新的 Nginx 配置文件,或修改默认配置。

sudo nano /etc/nginx/sites-available/default

在这里插入图片描述

修改为以下内容:

server {
    listen 80 default_server;
    listen [::]:80 default_server; 
    
    root /var/www/html;
    
    index index.html index.htm index.nginx-debian.html;

	server_name dco021.atomgit.net; # 替换为你的域名或服务器IP

    location / {
        proxy_pass http://localhost:5000;  # 替换为你的应用监听的端口
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection keep-alive;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

3. 启用配置并重启 Nginx

# 创建符号链接以启用配置
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

# 测试 Nginx 配置是否正确
sudo nginx -t

# 重启 Nginx
sudo systemctl restart nginx

七、设置系统服务(可选)

使用 systemd 将你的 ASP.NET Core 应用配置为服务,确保应用在服务器启动时自动运行,并在崩溃后自动重启。

1. 创建 systemd 服务文件

sudo nano /etc/systemd/system/dcowebhook.service

添加以下内容:

[Unit]
Description=DCOWebhook ASP.NET Core Web API
After=network.target

[Service]
WorkingDirectory=/var/www/dco
ExecStart=/usr/bin/dotnet /var/www/dco/DCOWebhook.dll --urls "http://0.0.0.0:5000" #换成需要监听的端口
Restart=always
# 用户和组
User=www-data
Group=www-data
# 环境变量
Environment=ASPNETCORE_ENVIRONMENT=Production

[Install]
WantedBy=multi-user.target

在这里插入图片描述

注意

  • WorkingDirectory:你的应用所在的目录。
  • ExecStart:启动应用的命令。根据你的发布方式(FDD 或 SCD)调整路径和参数。
  • UserGroup:推荐使用非 root 用户(如 www-data)运行服务,提升安全性。

2. 重新加载 systemd 并启动服务

sudo systemctl daemon-reload
sudo systemctl start dcowebhook.service #如果是修改配置需要刷新则写restart
sudo systemctl enable dcowebhook.service

3. 检查服务状态

sudo systemctl status dcowebhook.service

你应该会看到服务正在运行,并监听指定的端口。

在这里插入图片描述


八、配置防火墙

确保服务器的防火墙允许 HTTP(80)和 HTTPS(443)端口的流量。

使用 UFW 配置防火墙。

sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status

注意Nginx Full 配置包括 HTTP 和 HTTPS 端口。

在这里插入图片描述


九、查看日志

如果项目依然无法访问,可以查看日志分析问题所在。

1. 查看 Nginx 错误日志

sudo tail -f /var/log/nginx/error.log

2. 查看 ASP.NET Core 应用日志

sudo tail -f /var/log/dcowebhook/log-*.txt

十、常见问题

1. 解决端口占用

偶尔会遇到端口被占用的问题,我们要先查看是哪个进程在占用这个端口。

sudo lsof -i 5000 #换成你需要查的端口

再来杀死这个进程。

sudo kill -9 76681 #换成上一步查到的进程的pid

在这里插入图片描述
这样这个端口就释放出来了。


十一、总结

通过本文的步骤,你已经成功在 Linux 服务器上部署了 ASP.NET Core Web API 应用。你不仅配置了应用的发布和运行,还设置了 Nginx 作为反向代理,确保了应用的高可用性和安全性。此外,配置日志记录帮助你更好地监控和维护应用。根据实际需求,你还可以进一步优化配置,如启用 HTTPS、配置负载均衡等。部署成功后,建议定期检查应用和服务器的性能,及时更新和维护,以确保应用的稳定运行。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式-结构型-桥接模式

1. 什么是桥接模式? 桥接模式(Bridge Pattern) 是一种结构型设计模式,它旨在将抽象部分与实现部分分离,使它们可以独立变化。通过这种方式,系统可以在抽象和实现两方面进行扩展,而无需相互影响…

python学习笔记—16—数据容器之元组

1. 元组——tuple(元组是一个只读的list) (1) 元组的定义注意:定义单个元素的元组,在元素后面要加上 , (2) 元组也支持嵌套 (3) 下标索引取出元素 (4) 元组的相关操作 1. index——查看元组中某个元素在元组中的位置从左到右第一次出现的位置 t1 (&qu…

基础算法--查找

一、线性枚举 1、线性枚举定义 线性枚举指的就是遍历某个一维数组(顺序表)的所有元素,找到满足条件的那个元素并且返回,返回值可以是下标,也可以是元素本身。 由于是遍历的,穷举了所有情况,所…

G1垃圾回收器的FullGC

如何确定GarbageFirst回收器发生的是FullGC ? 必须出现FullGC字样才算是FUllGC,例如下图:因为内存分配失败(Allocation Failure)导致 如果不出现FullGC的字样说明它不是FUllGC,并不像Serial GC、ParallelGC的在老年代…

Golang的代码压缩技术应用案例分析与研究实践

Golang的代码压缩技术应用案例分析与研究实践 一、介绍 是一种具有强大性能和便捷开发特性的编程语言,除了其优秀的语法和标准库外,它还拥有很多高级特性,其中之一就是代码压缩技术。本文将从常见的Golang代码压缩技术应用案例出发&#xff0…

【Uniapp-Vue3】image媒体组件属性

如果我们想要在页面上展示图片就需要使用到image标签。 这部分最重要的是图片的裁剪,图片的裁剪和缩放属性: mode 图片裁剪、缩放的模式 默认值是scaleToFill 我将用两张图片对属性进行演示,一张是pic1.jpg(宽更长&#xf…

【网络协议】交换机概念与配置(第一部分)

概述 本文将探讨交换机的概念以及交换机的基础配置,并以此引入对 VLAN 的讨论。 文章目录 概述CSMA/CD以太网通信单播(Unicast)多播(Multicast)广播(Broadcast) MAC 地址以太网中的双工设置半双…

oracle位运算、左移右移、标签算法等

文章目录 位运算基础与或非同或同或应用场景 异或异或应用场景 什么是真值表 oracle基础函数创建bitor(按位或)函数bitnot(按位非)函数bitxor(按位异或)函数左移函数BITSHIFT()函数(实测不可用,废弃掉该方案)右移函数(略,有此场景吗?) 实际应用资质字典…

(五)ROS通信编程——参数服务器

前言 参数服务器在ROS中主要用于实现不同节点之间的数据共享(P2P)。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据,关…

《零基础Go语言算法实战》【题目 1-18】切片的反转

《零基础Go语言算法实战》 【题目 1-18】切片的反转 请编写一个名为 reverse 的函数,采用整数切片并在不使用临时切片的情况下将切片反转。 【解答】 可以通过 for 循环交换切片中每个元素的值,使其从左向右滑动。最终,所有元素都将 被反转。…

Elasticsearch:搜索相关性

这里写目录标题 一、相关性的概述二、自定义评分策略1、TF-IDF算法2、BM25算法 三、自定义评分策略1、Index Boost:在索引层面修改相关性2、boosting:修改文档相关性3、negative_boost:降低相关性4、function_score:自定义评分5、…

【C++经典例题】求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏: 期待您的关注 题目描述: 原题链接: 求123...n_牛客题霸_牛客网 (nowcoder.com) 解题思路: …

淺談Cocos2djs逆向

前言 簡單聊一下cocos2djs手遊的逆向,有任何相關想法歡迎和我討論^^ 一些概念 列出一些個人認為比較有用的概念: Cocos遊戲的兩大開發工具分別是CocosCreator和CocosStudio,區別是前者是cocos2djs專用的開發工具,後者則是coco…

概率论与数理统计总复习

复习课本:中科大使用的教辅《概率论和数理统计》缪柏其、张伟平版本 目录 0.部分积分公式 1.容斥原理 2.条件概率 3.全概率公式 4.贝叶斯公式 5.独立性 6.伯努利分布(两点分布) 7.二项分布 8.帕斯卡分布(负二项分布&am…

el-table自定义按钮控制扩展expand

需求:自定义按钮实现表格扩展内容的展开和收起,实现如下: 将type“expand”的表格列的宽度设置为width"1",让该操作列不展示出来,然后通过ref动态调用组件的内部方法toggleRowExpansion(row, row.expanded)控…

大语言模型训练的数据集从哪里来?

继续上篇文章的内容说说大语言模型预训练的数据集从哪里来以及为什么互联网上的数据已经被耗尽这个说法并不专业,再谈谈大语言模型预训练数据集的优化思路。 1. GPT2使用的数据集是WebText,该数据集大概40GB,由OpenAI创建,主要内…

【C++习题】22.随机链表的复制

文章目录 题目:138. 随机链表的复制 - 力扣(LeetCode)代码: 题目:138. 随机链表的复制 - 力扣(LeetCode) 链接🔗:138. 随机链表的复制 - 力扣(LeetCode&…

C# 或 .NetCore 如何使用 NPOI 导出图片到 Excel 文件

今天在本文中,我们将尝试使用NPOI库将图像插入到 Excel 文件的特定位置。请将以下逻辑添加到您的写作方法中,在 Excel 文件中添加图像(JPEG、PNG),我已经有一个示例 jpeg 文件 - Read-write-excel-npoi.jpg ,我们将尝试…

Photon最新版本PUN 2.29 PREE,在无网的局域网下,无法连接自己搭建的本地服务器

1.图1为官方解答 2.就是加上这一段段代码:PhotonNetwork.NetworkingClient.SerializationProtocol SerializationProtocol.GpBinaryV16; 完美解决 unity 商店最新PUN 2 插件 不能连接 (环境为:本地局域网 无外网情况 ) …

Python 爬虫验证码识别

在我们进行爬虫的过程中,经常会碰到有些网站会时不时弹出来验证码识别。我们该如何解决呢?这里分享 2 种我尝试过的方法。 0.验证码示例 1.OpenCV pytesseract 使用 Python 中的 OpenCV 库进行图像预处理(边缘保留滤波、灰度化、二值化、…