设为首页 收藏本站
查看: 1681|回复: 0

[经验分享] 使用Docker快速创建.Net Core2.0 Nginx负载均衡节点

[复制链接]

尚未签到

发表于 2017-12-5 18:38:18 | 显示全部楼层 |阅读模式
  本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws
DSC0000.png


一.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中
   DSC0001.png
  3. 发布项目文件,通过FTP上传到linux服务器。 一个core2.0 webapi新项目发布后只有几百kb
  4. 切换目录,dotnet ApiService.dll
  5. 运行成功,开放服务器端口,不过目前是运行于Kestrel 的selfhost 状态。
DSC0002.png


二. 需要一个代理
     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管理服务。
DSC0003.png

     虽然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的内容,官方示例:


DSC0004.gif DSC0005.gif


1 [Unit]
2 Description=Example .NET Web API Application running on Ubuntu
3
4 [Service]
5 WorkingDirectory=/var/aspnetcore/hellomvc
6 ExecStart=/usr/bin/dotnet /var/aspnetcore/hellomvc/hellomvc.dll
7 Restart=always
8 RestartSec=10  # Restart service after 10 seconds if dotnet service crashes
9 SyslogIdentifier=dotnet-example
10 User=www-data
11 Environment=ASPNETCORE_ENVIRONMENT=Production
12
13 [Install]
14 WantedBy=multi-user.target
View Code     修改了 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,配置负载均衡。
DSC0006.png

  访问证明我们配置成功。
   DSC0007.png
DSC0008.png


五.创建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。
DSC0009.png

     保存后 执行docker构建 使用当前目录的Dockerfile创建镜像。docker build -t image/apiservice-v3 . 注意结尾有个 . (使用当前目录)
   DSC00010.png
    docker images 查看镜像
  我们可以发现 刚创建的docker image 比我们FROM的microsoft/dotnet 大小大一点。
DSC00011.png

     下面运行下看看 四行命令 运行了四个我们刚创建的image
  docker run -d -p :81:20000 image/apiservice-v3
DSC00012.png

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

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

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

  参考文章
  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


  如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下加【推荐】按钮。
如果,您希望更容易地发现我的新博客,不妨点击下方红色【关注】的。
因为,我的分享热情也离不开您的肯定支持。
  感谢您的阅读,我将持续输出分享,我是蜗牛, 保持学习,谨记谦虚。不端不装,有趣有梦。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-420921-1-1.html 上篇帖子: Docker Machine 和 Docker Engine 的区别 下篇帖子: Docker可视化管理工具Shipyard安装与配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表