ASP.NET Core : 九.从Windows发布到CentOS的跨平台部署(下)

简介: 本文聊一下如何在Windows上用VS开发并发布, 然后将其部署到CentOS上。对于我们一些常在Windows上逛的来说,CentOS用起来还真有些麻烦。MSDN官方有篇文章大概讲了一下(链接),按照MSDN上面的例子用vs创建个hellomvc项目,还是踩了好多坑,将整个过程和遇到的坑说一下,希望对有需要的朋友有所帮助。

四、项目运行测试

  执行命令运行上传后的项目:

dotnet /var/aspnetcore/hellomvc/hellomvc.dll

我们都知道,默认情况下,项目采用的事5000端口,我运行项目时遇到了端口冲突,可能是被占用了吧,VS中修改一下Program.cs, 将端口改为常用的8080

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
            .UseUrls("http://*:8080")
                .UseStartup<Startup>()
                .Build();

重新发布并上传,执行上面的命令成功,提示Kestrel开始监听8080端口。

  浏览器访问一下http://ip:8080

5.png

结果如上图很怪异,坑二出现,按F12查看一下提示找不到xxx.css  xxx.js等,通过FileZila确认对应的css和js文件都已成功上传在指定位置。


 第一感觉是没有执行UseStaticFiles(), 确认了一下已执行。接着又怀疑是目录大小写问题,一 一排除, 均正常。


 后来先cd到发布目录,再次执行,终于成功。

cd /var/aspnetcore/hellomvc

 结果如我们熟悉的下图:

6.png

五、安装并配置Apache

  安装Apache,并配置反向代理, 将80端口请求转给上面的8080端口由Kestrel处理。

  安装并启动Apache

sudo yum -y install httpd mod_ssl
sudo systemctl start httpd

访问一下http://ip ,页面是Apache的默认页面,安装成功。

7.png

 配置代理,创建并打开文件hellomvc.conf:

nano /etc/httpd/conf.d/hellomvc.conf

nano是一个文本编辑工具,如果提示  nano: command not found   可能nano没有安装

  执行   yum install nano  命令安装即可。

  hellomvc.conf文件内写入如下内容:

<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/
    ServerName www.example.com
    ServerAlias *.example.com
    ErrorLog ${APACHE_LOG_DIR}hellomvc-error.log
    CustomLog ${APACHE_LOG_DIR}hellomvc-access.log common
</VirtualHost>

重启Apache服务并将该服务设置为自动启动:

sudo systemctl restart httpd
sudo systemctl enable httpd

再次通过 dotnet /var/aspnetcore/hellomvc/hellomvc.dll 将项目运行起来后,访问 http://ip  或者 http://ip:8080 均访问正常。


 到现在可能有人比较疑惑, 既然之前的项目已经可以正常访问了,为什么还要用Apache?在项目中直接指定监听80端口不就已经OK?   因为这样做该服务直接占用了80端口, 但有些情况下,我们需要将来自不同域名的访问指定到不同的端口处理,例如可以将a.com的请求指定到8080,将b.com的请求指定到8081.  当然, 如果没有这样的需求,直接用Kestrel做服务而不用反向代理。


 另外每次通过命令 dotnet xxx.dll 的方式来启动也不是个很好的体验,我们可以创建个service来管理它, 这也有点向windows的service。


六.创建service管理应用

 再次用nano创建文件:

sudo nano /etc/systemd/system/kestrel-hellomvc.service

文件内容如下:

[Unit]
Description=Example .NET Web API App running on CentOS 7
[Service]
WorkingDirectory=/var/aspnetcore/hellomvc
ExecStart=/usr/local/bin/dotnet /var/aspnetcore/hellomvc/hellomvc.dll
Restart=always
# Restart service after 10 seconds if dotnet service crashes
RestartSec=10
SyslogIdentifier=dotnet-example
User=apache
Environment=ASPNETCORE_ENVIRONMENT=Production 
[Install]
WantedBy=multi-user.target

 保存并启动服务:

systemctl enable kestrel-hellomvc.service
systemctl start kestrel-hellomvc.service

 查看是否成功:

systemctl status kestrel-hellomvc.service

在此处我遇到了问题,提示出错,..........(code=exited, status=203/EXEC)..............  kestrel-hellomvc.service failed。坑三出现,又是各种搜索,后来发现msdn中提供的上面的kestrel-hellomvc.service文件内容中的 ExecStart=/usr/local/bin/dotnet 在我的CentOS系统中不存在,通过 which dotnet 查看我的系统中是在 /usr/bin/dotnet ,修改kestrel-hellomvc.service重新执行 systemctl start kestrel-hellomvc.service 提示成功。注意修改该文件后会提示先执行 systemctl daemon-reload 重新加载。


 至此,主要工作均已完成。


七.其他注意事项

 A.kestrel-hellomvc.service中的User=apache

   在安装Apache之前,通过 dotnet /var/aspnetcore/hellomvc/hellomvc.dll 已经可以将项目运行起来了, 那时候就想先创建Service,因为觉得这与Apache无关, 结果service总是启动失败,后来才注意到了这个User=apache,这里要求这个User存在并且拥有相应的权限。由于对CentOS不熟悉,这点也绕了好久。


 B.启用ForwardedHeaders中间件

   由于采用了反向代理,需要启用ForwardedHeaders中间件转发,在Startup的Configure中添加如下代码,注意UseForwardedHeaders要用在UseAuthentication之前。(MSDN上的详细说明)

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
app.UseAuthentication();

八.独立部署(SCD)

  下面说一下独立部署(包含依赖项)的发布方式。

  在VS中右击项目文件,注意是 .csproj 而不是 .sln ,选择编辑xxx.csproj,打开该文件:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.6" />
  </ItemGroup>
  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.3" />
  </ItemGroup>
</Project>

在PropertyGroup中添加RuntimeIdentifiers标签

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <RuntimeIdentifiers>win10-x64;centos.7-x64</RuntimeIdentifiers>
  </PropertyGroup>

win10-x64;centos.7-x64 叫做.NET Core RID, 是一些固定的内容, 具体可选项见.NET Core RID的目录。


 当我们再次发布的时候,在发布设置的目标运行时中就出现了这两个选项,我们可以根据需要部署的系统选择对应的RID后进行发布。


九.2018.5.8文章更新

 Visual Studio 2017 15.7版本的项目发布提供了部署模式(框架依赖和独立部署)和目标运行时(win、osx、linux)的选择功能

8.png

目录
相关文章
|
2月前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
60 5
|
1月前
|
C# Android开发 iOS开发
2025年全面的.NET跨平台应用框架推荐
2025年全面的.NET跨平台应用框架推荐
85 23
|
2月前
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
62 1
|
3月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
64 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
2月前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
57 3
|
3月前
|
开发框架 安全 .NET
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱。它不仅加速了应用开发进程,提升了开发质量和可靠性,还促进了创新和业务发展,培养了专业人才和技术社区,为软件开发和数字化转型做出了重要贡献。
57 5
|
3月前
|
开发框架 .NET C#
.NET 技术凭借高效开发环境、强大框架支持及跨平台特性,在软件开发中占据重要地位
.NET 技术凭借高效开发环境、强大框架支持及跨平台特性,在软件开发中占据重要地位。从企业应用到电子商务,再到移动开发,.NET 均展现出卓越性能,助力开发者提升效率与项目质量,推动行业持续发展。
55 4
|
3月前
|
机器学习/深度学习 人工智能 Cloud Native
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台。本文深入解析 .NET 的核心优势,探讨其在企业级应用、Web 开发及移动应用等领域的应用案例,并展望未来在人工智能、云原生等方面的发展趋势。
55 3
|
3月前
|
消息中间件 Linux iOS开发
.NET 高性能异步套接字库,支持多协议、跨平台、高并发
【11月更文挑战第3天】本文介绍了高性能异步套接字库在网络编程中的重要性,特别是在处理大量并发连接的应用中。重点讨论了 .NET 中的 Socket.IO 和 SuperSocket 两个库,它们分别在多协议支持、跨平台特性和高并发处理方面表现出色。Socket.IO 基于 WebSocket 协议,支持多种通信协议和跨平台运行,适用于实时通信应用。SuperSocket 则通过事件驱动的异步编程模型,实现了高效的高并发处理,适用于需要自定义协议的场景。这些库各有特点,可根据具体需求选择合适的库。
|
4月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架

热门文章

最新文章