本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws

一.Self-Host Kestrel

1. 在vs2017中新建dotnet core2.0 webapi项目 ApiService

2. 参照官方文档,https://docs.microsoft.com/en-us/aspnet/core/publishing/linuxproduction?tabs=aspnetcore2x 在Startup中增加

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

配置运行Url, 在Program.cs中

3. 发布项目文件,通过FTP上传到linux服务器。 一个core2.0 webapi新项目发布后只有几百kb

4. 切换目录,dotnet ApiService.dll

5. 运行成功,开放服务器端口,不过目前是运行于Kestrel 的selfhost 状态。

二. 需要一个代理

ASP.NET Core 的运行环境由新开发的 Kestrel Server 负责,IIS 退回到 HTTP 的侦听器的角色,微软也特别为了这个需求开发了 IIS Platform Handler,以处理 HTTP 与运行环境之间的信息转发工作,微软官方推荐在Linux服务器上使用Nginx,Haproxy等代理Kestrel Server

理解dotnet core host最重要的一点是,它独立运行。不在IIS中运行,也不需要IIS运行。它拥有独立的自宿主Web Server,在内部使用self-host server处理请求。

然而,你依然可以把IIS放在self-host server前面,作为一个前端代理,因为Kestrel是一个只拥有原始功能的web server,它并没有像iis那样完整的web server 功能,比如Kestrel不支持单个ip上,多个应用绑定80端口,IIS还可以提供静态文件服务,gzip压缩,静态文件缓存等其他高级功能,IIS在处理请求时效率非常好,,所以有必要利用这一点,您可以让iis处理它真正擅长的任务,并将动态任务传递到core应用程序。所以说在windows上,iis依然继续扮演着非常重要的角色。

在传统经典的Asp.Net应用中,所有内容都托管在iis工作进程中(w3wp.exe),这就是我们常说的应用程序池。并且应用由IIS内置托管功能加载实例化,经过工作者进程加载aspnet_isapi.dll,在用aspnet_isapi加载.Net运行时。IIS工作者进程中的应用程序池加载应用程序域。一系列工作结束后,由ISAPIRuntime对象调用PR方法,封装HttpWorkerRequest对象,传递给HttpRuntime 创建HttpApplication实例, 然后一系列HttpApplication初始化和管道事件执行。当然加载运行时,应用程序域等都只是第一个请求到达后做的事儿。

在dotnet core中很不同的是,core不会在iis工作进程中运行,而是在自己的Kestrel组件中。通过一个叫做AspNetCoreModule的原生的IIS module,执行外部的应用。Kestrel是一款针对吞吐量性能做了大量优化的dotnet web server的实现,它将网络请求快速传递给你的应用,但它仅仅是一个原始的web server,没有IIS那样全面的Web管理服务。

虽然IIS站点依然需要应用程序池,但是应该设置为无托管代码,由于应用程序池只作为转发请求的代理,因此不需要实例化.net 运行时。所以在linux上也一样,我们需要一个self-host的前端代理,在这里参考文档使用nginx。

三.nginx做代理

找到/etc/nginx配置nginx.conf

server {
listen 80;
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;
}
}

我将nginx 的user改为root 5000改成自己的10000

创建service file

nano /etc/systemd/system/apiservice.service

service file的内容,官方示例:

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

修改了 User为root。还修改了工作目录 就是我项目文件ftp上传后的目录,ExecStart的 dotnet这个目录不要修改 dll目录,改成目标要执行的dll的目录

然后enable service

执行 systemctl enable kestrel-hellomvc.service

start并验证service的状态

systemctl start kestrel-hellomvc.service

    systemctl status kestrel-hellomvc.service

访问监听中的80端口,证明服务成功。

四.做负载均衡

按照相同的方式 我们再部署一个10001,修改nginx,配置负载均衡。

访问证明我们配置成功。

五.创建Docker Image

官方提供的dotnet core镜像位 microsoft/dotnet。docker基础命令就不提了,刚开始用也是边学边记。下面基于microsoft/dotnet image创建自己的image。以便快速运行多个docker image,配置更多的负载均衡,而无需手动copy到各个服务器上再配置环境,也就是说无论我们创建几十个甚至上百个,有我们自己的docker hub的话,创建起来是很快的,也不会出现在这台服务器上可用,在另一台服务器上搞出什么其他问题。

下面只是一个学习过程中自己的范例,离最佳实践方式还差得很远,希望能对看随笔的朋友有所帮助。

由于还要在每个image的apiService前面 放置nginx,所以 core application在各个容器中都是使用self-host的形式,在Kestrel上运行。在前端通过nginx 对docker暴露出的端口号进行代理。

在发布的网站目录下 创建Dockerfile。

保存后 执行docker构建 使用当前目录的Dockerfile创建镜像。docker build -t image/apiservice-v3 . 注意结尾有个 . (使用当前目录)

docker images 查看镜像

我们可以发现 刚创建的docker image 比我们FROM的microsoft/dotnet 大小大一点。

下面运行下看看 四行命令 运行了四个我们刚创建的image

docker run -d -p :81:20000 image/apiservice-v3

docker ps -a 查看下运行中的image进程

下面配置nginx负载均衡然后service nginx reload,实验完成。

下面使用docker kill对docker container逐一停止,停止后访问,确认负载均衡成功。当四个container都停止后,nginx返回 502 error.

参考文章

https://weblog.west-wind.com/posts/2016/Jun/06/Publishing-and-Running-ASPNET-Core-Applications-with-IIS

http://www.cnblogs.com/shanyou/p/Jexus_Kestrel.html

https://docs.microsoft.com/en-us/aspnet/core/publishing/linuxproduction?tabs=aspnetcore2x

如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下加【推荐】按钮。
如果,您希望更容易地发现我的新博客,不妨点击下方红色【关注】的。
因为,我的分享热情也离不开您的肯定支持。

感谢您的阅读,我将持续输出分享,我是蜗牛, 保持学习,谨记谦虚。不端不装,有趣有梦。

利用Docker快速创建Nginx负载均衡节点的更多相关文章

  1. 使用Docker快速创建.Net Core2.0 Nginx负载均衡节点

    本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws 一.Self-Host Kestrel 1. 在vs2017中新建dotnet core2. ...

  2. docker Dockerfile学习---nginx负载均衡tomcat服务

    1.此过程在nginx的基础上,也就是上篇博客写的内容. 2.创建项目目录并上传包,解压 $ mkdir centos_tomcat $ cd centos_tomcat $ tar zxvf jdk ...

  3. docker容器配置nginx负载均衡 -----加权

    首先要准备三个nginx的容器: 第二个容器: 第三个容器: 进入第一个容器  要配置的容器(docker exec -it 容器名 /bin/bash) vi /usr/local/nginx/co ...

  4. docker上配置nginx负载均衡

    采用ubuntu系统,docker安装自行百度 1.安装tomcat docker run -d -p : tomcat docker run -d -p : tomcat 安装两个实例,端口分别为8 ...

  5. 企业级Nginx负载均衡与keepalived高可用实战(一)Nginx篇

    1.集群简介 1.1.什么是集群 简单地说,集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器. ...

  6. Nginx负载均衡中后端节点服务器健康检查的操作梳理

    正常情况下,nginx做反向代理,如果后端节点服务器宕掉的话,nginx默认是不能把这台realserver踢出upstream负载集群的,所以还会有请求转发到后端的这台realserver上面,这样 ...

  7. Nginx负载均衡中后端节点服务器健康检查的一种简单方式

    摘自:https://cloud.tencent.com/developer/article/1027287 一.利用nginx自带模块ngx_http_proxy_module和ngx_http_u ...

  8. Docker 安装 Nginx 负载均衡配置

    Docker 安装 # 1)安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 # 2)添加Docker软件包源(否则d ...

  9. docker 搭建 nginx负载均衡

    本文描述如何在一台机器上搭建nginx负载均衡,我将会启动3个nginx的docker,分别是1台前置nginx负责分发,后面2台负责处理请求. 首先我切换到/usr/local/docker/文件夹 ...

随机推荐

  1. 获取MVC中Controller下的Action参数异常

    我现在做的一个项目有一个这样的需求, 比如有一个页面需要一个Guid类型的参数: public ActionResult Index(Guid id) { //doing something ... ...

  2. RedHat 7 常用命令总结

    Linux RedHat 7常用命令总结... ----------------------- 征服Linux从终端开始 ------------------------------------- 在 ...

  3. 2_linux 常用基本命令

    相信当你看到此帖子时,你已不再是当年那个颓废的你,你一定也在追梦的路上奔跑,那么请留下你的“梦”,让我们用心去交流,好吗? 废话不多说,直接说正事! 一.查看磁盘分区 1.fdisk -l  查看磁盘 ...

  4. 一个小时学会Git

    一.版本控制概要 Git 是一种在全球范围都广受欢迎的版本控制系统.在开发过程中,为了跟踪代码,文档,项目等信息中的变化,版本控制变得前所未有的重要.但跟踪变化远远不能满足现代软件开发行业的协同需求, ...

  5. awk知识点全回顾

    本文目录:1.awk简介和基本语法格式2.print和printf格式化输出3.输入行的字段分隔符和行分隔符4.BGEIN和END5.数组6.流程控制语句 6.1 条件判断语句 6.2 while循环 ...

  6. 32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式

    32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式 一丶RadAsm的配置和使用 用了怎么长时间的命令行方式,我们发现了几个问题 1.没有代码提醒功能 2.编写代码很慢,记不住各 ...

  7. python 从视频中提取图片,并保存在硬盘上

    使用python的moviepy库来提取视频中的图片,按照视频每帧一个图片的方式来保存. extract images from video, than save them to disk from ...

  8. 聊聊click延迟和点击穿透

    博客原文地址:Claiyre的个人博客 https://claiyre.github.io/ 如需转载,请在文章开头注明原文地址 移动端click事件被延迟 移动端的开发经常需要监听用户的双击行为,所 ...

  9. .opt,frm,.MYD,.MYI文件如何转为.sql文件?

    假如你是网站测试人员,数据库管理员从服务器上导出数据库,如下图: 你会发现这不是.sql文件,需要将其转化. 其实很简单,只要你本地比如D盘有安装“phpstudy”和“SQLyog”就可以,你可以直 ...

  10. 使用github出了些问题?fatal: unable to access;Failed connect to github.com:8087;

    使用github出了些问题?fatal: unable to access;Failed connect to github.com:8087; No error 我今天使用git push orig ...