GVKun编程网logo

aspnetcore 2.1 发布到树莓派 3linux 的艰辛路程(.net5 树莓派)

33

在本文中,我们将为您详细介绍aspnetcore2.1发布到树莓派3linux的艰辛路程的相关知识,并且为您解答关于.net5树莓派的疑问,此外,我们还会提供一些关于.NetCore结合AspNetC

在本文中,我们将为您详细介绍aspnetcore 2.1 发布到树莓派 3linux 的艰辛路程的相关知识,并且为您解答关于.net5 树莓派的疑问,此外,我们还会提供一些关于.Net Core 结合 AspNetCoreRateLimit 实现限流、.Net Core 项目发布到Linux - CentOS 7(一)、.Net Core 项目发布到Linux - CentOS 7(二)用Supervisor守护netcore进程、.net core入门-发布及部署_异常(处理程序“aspNetCore”在其模块列表中有一个错误模块“AspNetCoreModuleV2")处理的有用信息。

本文目录一览:

aspnetcore 2.1 发布到树莓派 3linux 的艰辛路程(.net5 树莓派)

aspnetcore 2.1 发布到树莓派 3linux 的艰辛路程(.net5 树莓派)

发布至 docker for windows.

提示:

image operating system "windows" cannot be used on this platform

解决:

网上查了,说是运行环境不对,要在 win 虚拟机上执行,都是把 docker 的环境切换成 windows。

不过我们如果在创建项目的时候,选择 docker 文件是 “linux” 版本,就不需要 windows 版本,所以我们保持 docker 默认的 linux 版本,只需要确保新建项目时生成的 DockerFile,不是基于 windows 就好。

 

由于是树莓派,这里准备把 aspnetcore2.1 项目,发布为 linux-arm 方式。

# 首先,定位到要发布的项目根目录,也就是csproj文件所在位置,按住shift键右击,选择在此处打开命令行/powershell,两个选项差不多这个看系统设定。
# 以 linux-arm 方式发布
dotnet publish -c Release -r linux-arm

之后,我们将目光放到树莓派上,我用的是三代,也就是 ARMv7,所以 core sdk 是没法装的,只能使用 runtime 的方式,所以最简单的 DockerFile 如下:

# 添加基础镜像:docker会从网络下载这个镜像
FROM microsoft/dotnet:2.1-sdk-stretch-arm32v7 AS build
MAINTAINER suntai
#容器中系统的工作空间
WORKDIR /app
#拷贝当前文件夹下的文件到容器中系统的工作空间(注意:“.”后面有空格)
COPY . /app

#设置程序要侦听的端口
EXPOSE 80
# 下面这里是dotnetcore runtimez执行方式
ENTRYPOINT ["./WebCoreHost"]

之后就可以通过树莓派开启 ssl,用 sftp 从微软平台传文件到树莓派的 linux 平台了。当然要传输的目录就是刚才生成的目录,则你可能要拷贝的目录就是

bin\Release\netcoreapp2.1\linux-arm\publish\

先直接运行下试试,进入我们程序所在位置。

# 我们先把程序入口点设置为可运行,当然你可以设置权限为755,也可以用+x方式
sudo chmod +x ./WebCoreHost
# 然后我们基于runtime执行
./WebCoreHost
# aspnetcore runtime会执行程序,如果什么都不管的话,是启用5000端口。

当然,之后如果你想结束程序测试,或者端口被占了,可以 kill 掉程序

# 显示占用端口的程序
sudo netstat -ltp
# 结束指定程序,比如说程序标识是233
sudo kill 233

在树莓派上创建容器并运行程序,注意句点的位置,表示操作当前目录(linux docker for aspnetcore)

# 将当前目录添加到为docker镜像,起一个别名叫做aspnetapp。
docker build
-t aspnetapp .
# 以关闭后自动销毁的方式,启动一个容器,侦听外部的8000端口,并转发至程序内部的80端口 docker run
--rm -it -p 8000:80 aspnetapp

提升当前操作用户操作 Docker 的权限,不需要 sudo,也能解决 permission denied

# 如果还没有 docker group 就添加一个
sudo groupadd docker

# 将用户加入该 group 内。然后退出并重新登录就生效啦
sudo gpasswd -a ${USER} docker

# 重启 docker 服务
sudo service docker restart

# 切换当前会话到新 group 或者重启 X 会话
newgrp - docker

常用的 Docker 容器和镜像操作

# 停用全部正在运行的容器
docker stop $(docker ps -q)

# 删除全部容器
docker rm $(docker ps -aq)

# 一条命令实现停用并删除容器
docker stop $(docker ps -q) & docker rm $(docker ps -aq)

# 删除所有镜像
docker rmi $(docker images -q)

# 停止并删除none镜像
docker stop $(docker ps -a | grep "Exited" | awk ''{print $1 }'')
docker rm $(docker ps -a | grep "Exited" | awk ''{print $1 }'')

 

.Net Core 结合 AspNetCoreRateLimit 实现限流

.Net Core 结合 AspNetCoreRateLimit 实现限流

OSC 请你来轰趴啦!1028 苏州源创会,一起寻宝 AI 时代

前言

  相信使用过 WebApiThrottle 的童鞋对 AspNetCoreRateLimit 应该不陌生,AspNetCoreRateLimit 是一个 ASP.NET Core 速率限制的解决方案,旨在控制客户端根据 IP 地址或客户端 ID 向 Web API 或 MVC 应用发出的请求的速率。AspNetCoreRateLimit 包含一个 IpRateLimitMiddlewareClientRateLimitMiddleware,每个中间件可以根据不同的场景配置限制允许 IP 或客户端,自定义这些限制策略,也可以将限制策略应用在每​​个 API URL 或具体的 HTTP Method 上。

实践

   起初是因为新做的项目中,有天查询日志发现,对外的几个公共接口经常被 “恶意” 调用,考虑到接口安全性问题,增加限流策略。

  AspNetCoreRateLimit GayHub:https://github.com/stefanprodan/AspNetCoreRateLimit

根据 IP 进行限流

  通过 nuget 安装 AspNetCoreRateLimit,当前版本是 3.0.5,因为实际项目中用的都是分布式缓存,在这里不用内存存储,而是结合 Redis 进行使用,内存存储直接参考官方的 Wiki 就可以了。

Install-Package AspNetCoreRateLimit 

Install-Package Microsoft.Extensions.Caching.Redis

  在 Startup.ConfigureServices 中将服务和其他依赖注入

public void ConfigureServices(IServiceCollection services)
        {
            #region MVC
            services.AddMvc(
              options =>
              {
                  options.UseCentralRoutePrefix(new RouteAttribute("api/"));
              }
              ).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            #endregion

            services.AddDistributedRedisCache(options =>
            {
                options.Configuration = "127.0.0.1:6379,password=123456,connectTimeout=5000,syncTimeout=10000"; 
                options.InstanceName = "WebRatelimit";
            }); 
            //加载配置
            services.AddOptions();
            //从appsettings.json获取相应配置
            services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));
            
            //注入计数器和规则存储
            services.AddSingleton<IIpPolicyStore, DistributedCacheIpPolicyStore>();
            services.AddSingleton<IRateLimitCounterStore, DistributedCacheRateLimitCounterStore>();
            
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            //配置(计数器密钥生成器)
            services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
        }

  在 Startup.Configure 启用

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }
            //启用限流,需在UseMvc前面
            app.UseIpRateLimiting();
            app.UseMvc();
        }

  为了不影响 appsettings.json 的美观吧,可以新建一个 RateLimitConfig.json,并 Program 中启动加载中增加

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>().ConfigureAppConfiguration((host,config)=> 
                {
                    config.AddJsonFile($"RateLimitConfig.json", optional: true, reloadOnChange: true);
                });

  RateLimitConfig.json 配置如下:

{
  "IpRateLimiting": {
    //false则全局将应用限制,并且仅应用具有作为端点的规则* 。 true则限制将应用于每个端点,如{HTTP_Verb}{PATH}
    "EnableEndpointRateLimiting": true,
    //false则拒绝的API调用不会添加到调用次数计数器上
    "StackBlockedRequests": false,
    "RealIpHeader": "X-Real-IP",
    "ClientIdHeader": "X-ClientId",
    "HttpStatusCode": 200,
    "QuotaExceededResponse": {
      "Content": "{{\"code\":429,\"msg\":\"访问过于频繁,请稍后重试\",\"data\":null}}",
      "ContentType": "application/json",
      "StatusCode": 200
    },
    "IpWhitelist": [ ],
    "EndpointWhitelist": [],
    "ClientWhitelist": [],
    "GeneralRules": [
      {
        "Endpoint": "*:/api/values/test",
        "Period": "5s",
        "Limit": 3
      }
    ]
  }
}

  重要配置说明:

       QuotaExceededResponse 是自定义返回的内容,所以必须设置 HttpStatusCodeStatusCode 为 200。

  GeneralRules 是具体的策略,根据不同需求配置不同端点即可, Period 的单位可以是 s, m, h, dLimint 是单位时间内的允许访问的次数;

  IpWhitelist 是 IP 白名单,本地调试或者 UAT 环境,可以加入相应的 IP,略过策略的限制;

       EndpointWhitelist 是端点白名单,如果全局配置了访问策略,设置端点白名单相当于 IP 白名单一样,略过策略的限制;

       其他配置项请参考 Wiki:https://github.com/stefanprodan/AspNetCoreRateLimit/wiki/IpRateLimitMiddleware#setup

Fiddler 开始测试

测试接口:http://127.0.0.1:5000/api/values/Test

        [HttpGet]
        public object test()
        {
            return "ok";
        }

调用结果:

 

 调用次数和剩余调用次数在 Head 可以看到,(吃我一个链接:https://www.cnblogs.com/EminemJK/p/12720691.html)

 

 如果调用超过策略后,调用失败,返回我们自定义的内容

 

 在 Redis 客户端可以看到策略的一些情况,

 其他

  通常在项目中,Authorization 授权是少不了了,加入限流后,在被限流的接口调用后,限流拦截器使得跨域策略失效,故重写拦截器中间件,继承 IpRateLimitMiddleware 即可:

public class IPLimitMiddleware : IpRateLimitMiddleware
    {
        public IPLimitMiddleware(RequestDelegate next, IOptions<IpRateLimitOptions> options, IRateLimitCounterStore counterStore, IIpPolicyStore policyStore, IRateLimitConfiguration config, ILogger<IpRateLimitMiddleware> logger)
            : base(next, options, counterStore, policyStore, config, logger)
        {
        }

        public override Task ReturnQuotaExceededResponse(HttpContext httpContext, RateLimitRule rule, string retryAfter)
        {
            httpContext.Response.Headers.Append("Access-Control-Allow-Origin", "*");
            return base.ReturnQuotaExceededResponse(httpContext, rule, retryAfter);
        }
    }

  然后修改 Startup.Configure

//启用限流,需在UseMvc前面
        //app.UseIpRateLimiting();
        app.UseMiddleware<IPLimitMiddleware>();
        app.UseMvc();        

  特别需要注意的坑是,在其他文章的教程中,他们会写成:

app.UseMiddleware<IPLimitMiddleware>().UseIpRateLimiting();//错误的演示 https://www.cnblogs.com/EminemJK/p/12720691.html

  这些写你测试的时候会发现,

X-Rate-Limit-Remaining 递减量会变成 2,也不是递减 1,举栗子,配置如下:

"Endpoint": "*:/api/values/test",
        "Period": "3s",
        "Limit": 1

表示 3 秒内可以访问的次数是 1 一次,当发生调用的时候会直接返回被限制的提示,而不能正常访问接口。

最后

  AspNetCoreRateLimit 还可以根据客户端 ID 进行配置策略,具体可以看一下官方的 Wiki 吧。

 

.Net Core 项目发布到Linux - CentOS 7(一)

.Net Core 项目发布到Linux - CentOS 7(一)

由于项目的需求,需要发布到Linux服务器上,在这里记录一下我发布的过程。

安装Linux

安装liunx系统很简单,网上也有很多教程,我是直接使用阿里云的CentOS 7.7 64位

部署环境

Linux - CentOS 7 安装 .Net Core 运行环境

发布项目

右键项目->发布->启动->选择文件夹

 

 点击高级设置目标运行时

然后保存发布

把发布好的publish文件放入Linux系统

我这里使用的是 Xshell6 + WinSCP 。Xshell 是一个终端模拟软件,WinSCP 主要功能是本地与服务器之间复制文件。

启动项目

用Xshell6 打开终端窗口,进入linux系统中publish文件夹下,输入命令:dotnet 项目的名称.dll

.NET Core默认使用5000端口,可以在Program.cs中创建WebHost对象的时候,使用UseUrls()方法,配置要使用的端口,如下所示:

public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

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

此时在浏览器中输入:http://ip:8080/(如果在本地访问远程,需要先开放项目使用端口)就能看到以下页面:

我们是打开终端窗口运行dotnet的,如果关闭终端窗口,那么相应服务也就关了,我们使用supervisor 守护dotnet进程。

下一篇: .Net Core 项目发布到Linux - CentOS 7(二)用Supervisor守护netcore进程

.Net Core 项目发布到Linux - CentOS 7(二)用Supervisor守护netcore进程

.Net Core 项目发布到Linux - CentOS 7(二)用Supervisor守护netcore进程

简介

supervisor可以保证程序崩溃后,可以重新把程序启动起来等相关功能。

安装

yum install -y supervisor

安装好后在/etc/会生成一个supervisord.conf文件及一个supervisord.d文件目录

查看supervisor是否安装成功

supervisord --version

启动

supervisord -c /etc/supervisord.conf

查看supervisor是否启动成功

ps -ef|grep supervisord

设置supervisor 开机启动

systemctl enable supervisord

检查是否是开机启动

systemctl is-enabled supervisord

启动服务

systemctl start supervisord

启动时可能回报错:Another program is already listening on a port that one of our HTTP servers is config...rvisord.

 解决方案:

执行命令 find / -name supervisor.sock  然后 unlink /路径/supervisor.sock 最后再执行启动命令 systemctl start supervisord 

查看状态

systemctl status supervisord.service

配置supervisor ,web管理页面

修改配置信息,supervisor 默认配置文件,放在 /etc/supervisord.conf 路径中:

[inet_http_server]         ; HTTP 服务器,提供 web 管理界面
port=*:9001                ; Web 管理后台运行的 IP 和端口
username=user              ; 登录管理后台的用户名
password=1234               ; 登录管理后台的密码

 [include]                     
 files = supervisord.d/*.ini ;配置文件夹

修改完之后重启:

supervisorctl reload

然后通过http://ip:9001/访问web界面,账户名密码就是你配置的,效果如下:

 

创建配置文件

创建一个.ini文件,放在目录supervisord.d下

[program:demo] ;程序名称
command=dotnet demo.dll ; 运行命令
directory=/web/publish;目录
environment=ASPNETCORE_ENVIRONMENT=Production;环境变量
user=root;用户
stopsignal=INT
autostart=true;如果是true的话,子进程将在supervisord启动后被自动启动
autorestart=true;进程死掉后自动重启的情况
stderr_logfile=/var/log/demo/demo.err.log;错误日志文件
stdout_logfile=/var/log/demo/demo.out.log;输出日志文件

 重启

systemctl restart supervisord

查看是否生效

supervisorctl status

然后把Xshell关了,浏览器中输入:http://ip:8080/api/values,也能看到以下页面:

supervisorctl 常用命令

查看任务状态:supervisorctl status

启动任务:supervisorctl start <name>

停止任务:supervisorctl stop <name>

重启任务:supervisorctl restart <name>

清除日志文件:supervisorctl  clear <name>

清除多个日志文件:supervisorctl  clear <name> <name> 

清除所有日志文件:supervisorctl  clear all 

移除任务:supervisorctl  remove <name>

Nginx代理配置

安裝nginx:Linux - CentOS 7 通过Yum源安装 Nginx 

修改nginx.conf

添加一个服务

  server {
     listen       80;
     server_name  47.106.98.252;

    location / {
          root   html;
          index  index.html index.htm;
          proxy_pass http://localhost:8080;
    }
 }

检查配置文件是否成功

nginx -t

 成功之后重启Nginx服务

systemctl restart nginx.service

测试

浏览器输入http://ip:/api/values,效果是一样的:

.net core入门-发布及部署_异常(处理程序“aspNetCore”在其模块列表中有一个错误模块“AspNetCoreModuleV2

.net core入门-发布及部署_异常(处理程序“aspNetCore”在其模块列表中有一个错误模块“AspNetCoreModuleV2")处理

备注:本人使用开发工具:VS2017,.NET Core 2.2,其中VS2017原本自带2.1,我单独从官网下载了2.2的程序集安装包,但是没有下配套的运行环境,运行项目时出了一个问题。

以下是我在发布Core项目后部署到IIS后运行时遇到的一个异常:处理程序“aspNetCore”在其模块列表中有一个错误模块“AspNetCoreModuleV2"

 

这里备注一下,如果仅仅是在IIS上运行发布好的项目,只需要安装AspNetCoreModuleV2模块就够了。不需要管模块:AspNetCoreModule 。

如果项目还运行不了,报HTTP Error 500.30 - ANCM In-Process Start Failure ,只需要检查应用程序池的配置是否是无托管代码版本。

 

先摆出微软Core的官方文档对IIS支持的描述吧:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/?view=aspnetcore-3.0

 

下载中心:https://dotnet.microsoft.com/download/dotnet-core/3.1   选择IIS支持中的IIS runtime support,里面的Hosting Bundle(托管捆绑包)链接下载

或者直接点击这个地址:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/?view=aspnetcore-3.1#install-the-net-core-hosting-bundle

 

1-发布设置:

 

 在发布过程中,项目一直还原nuget包没有结果?后来我转移了项目的位置,从C盘桌面挪到F盘,重新编译发布项目,居然可以了!   可能是在C盘还原的时候遇到了只读或权限不足的问题吧,贴图如下

发布成功后,在IIS配置网站到push发布目录中,应用程序池:.net framework版本设置成无托管代码(其实设置了v4.0貌似也没有毛病),

在运行项目时报错如下:处理程序“aspNetCore”在其模块列表中有一个错误模块“AspNetCoreModuleV2"

只需要在运行的服务器上下载一个捆绑运行程序包,就OK了:

下载地址:

https://dotnet.microsoft.com/download/dotnet-core/3.1

选择好版本后,点击去,找到Core运行时的支持:IIS runtime support,里面的Hosting Bundle(托管捆绑包)链接下载。

 

我们今天的关于aspnetcore 2.1 发布到树莓派 3linux 的艰辛路程.net5 树莓派的分享已经告一段落,感谢您的关注,如果您想了解更多关于.Net Core 结合 AspNetCoreRateLimit 实现限流、.Net Core 项目发布到Linux - CentOS 7(一)、.Net Core 项目发布到Linux - CentOS 7(二)用Supervisor守护netcore进程、.net core入门-发布及部署_异常(处理程序“aspNetCore”在其模块列表中有一个错误模块“AspNetCoreModuleV2")处理的相关信息,请在本站查询。

本文标签: