在本文中,我们将为您详细介绍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 树莓派)
- .Net Core 结合 AspNetCoreRateLimit 实现限流
- .Net Core 项目发布到Linux - CentOS 7(一)
- .Net Core 项目发布到Linux - CentOS 7(二)用Supervisor守护netcore进程
- .net core入门-发布及部署_异常(处理程序“aspNetCore”在其模块列表中有一个错误模块“AspNetCoreModuleV2")处理
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 实现限流

前言
相信使用过 WebApiThrottle 的童鞋对 AspNetCoreRateLimit 应该不陌生,AspNetCoreRateLimit 是一个 ASP.NET Core 速率限制的解决方案,旨在控制客户端根据 IP 地址或客户端 ID 向 Web API 或 MVC 应用发出的请求的速率。AspNetCoreRateLimit 包含一个 IpRateLimitMiddleware 和 ClientRateLimitMiddleware,每个中间件可以根据不同的场景配置限制允许 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 是自定义返回的内容,所以必须设置 HttpStatusCode 和 StatusCode 为 200。
GeneralRules 是具体的策略,根据不同需求配置不同端点即可, Period 的单位可以是 s, m, h, d,Limint 是单位时间内的允许访问的次数;
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(一)
由于项目的需求,需要发布到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进程
简介
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")处理
备注:本人使用开发工具: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")处理的相关信息,请在本站查询。
本文标签: