菜的像徐坤
排名
7
文章
192
粉丝
15
评论
16
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

linux +docker +nginx +mssql 部署NetCore Mvc 多站点项目

6182人阅读 2022/11/11 18:13 总访问:1019105 评论:1 收藏:2 手机
分类: Docker

前言

通过一个星期的踩坑,终于。终于。终于。将项目部署成功!
接下来分享一些实际项目中遇到的坑。也算是自己的工作积累吧。
注意:Linux 中路径是严格区分大小写的哦,多检查一下项目的文件路径
先提前在Linux 服务器上先把net core 的依赖,docker 和 nginx 都装好

项目

工作需求是将一个多站点项目部署到docker  

单站点发布倒是简单,多站点这可咋整?DockerFile放在哪儿?应该一个站点一个站点发还是一起发?静态文件和配置文件又该怎么处理?等等。。。。。。。
接下来开始第一步
先测试站点是否能够在本地跑起来(所有站点,如果有站点跑不起来现在本地检查,保证每个站点能够单独自依赖运行)
最重要的一点:项目中绝对不能出现绝对地址,例如   D:/微信文件/WeChat Files/All Users  只能用相对路径  ../WeChat Files/All Users 


所有站点都能运行了,在本地运行一下,发现还是不行,因为站点与站点之间存在互相依赖关系,所以打开地址之后发现是404
后面检查发现,项目中的请求都是以  站点/控制器/页面   这种方式请求的,因为站点与站点之间存在互相依赖关系,站点信息已经明确了,所以在请求中多加了一个站点所以请求地址不对了



该怎么解决呢?改项目中的代码的话,工作量会不会太大了,而且你也不知道那些东西改了会不会出一些不可预料的错误
来说说解决办法吧
中间件中将 pattern 将路由处理一下,这样再有请求进来,所有的请求地址将会被路由处理:例如 :/BasicApplication/Retrieval/index  将会变成  /Retrieval/index

  1.         /// <summary>
  2.         /// 添加Endpoint并Area路由支持
  3.         /// </summary>
  4.         public static IEndpointRouteBuilder MapControllersWithAreaRoute(this IEndpointRouteBuilder endpoints, bool area = true)
  5.         {
  6.             if (area)
  7.             {
  8.                 endpoints.MapControllerRoute(
  9.                     name: "area-route",
  10.                     //areaName:"area",
  11.                     pattern: "{site:}/{area:exists}/{controller=Home}/{action=Index}/{id?}"
  12.                     );
  13.                 endpoints.MapControllerRoute(
  14.                    name: "viewName",
  15.                    pattern: "{site:}/{area:exists}/{controller}/{*viewName}",
  16.                    defaults: new { action = "DisplayAnyView" }
  17.                 );
  18.             }
  19.             endpoints.MapControllerRoute(
  20.                 name: "default",
  21.                 pattern: "{site:}/{controller=Home}/{action=Index}/{id?}"
  22.                 );
  23.             endpoints.MapControllerRoute(
  24.                 name: "viewName",
  25.                 pattern: "{site:}/{controller}/{*viewName}",
  26.                 defaults: new { action = "DisplayAnyView" }
  27.                 );
  28.             return endpoints;
  29.         }

本地的地址的问题解决了,接下来再启动就发现问题解决啦
接下来把发布文件拷贝到 linux 服务器上(文件中有站点发布文件,静态文件和配置文件)




拷贝过去之后在用命令运行一下单站点(window上能跑,linux上一般都能跑,注意多检查静态文件的路径)

站点没问题之后就可以将文件打包成镜像了,这里是打包到docker

应该一个站点一个站点发还是一起发?这肯定是要一个站点一个站点的发的。

需要在每个站点下新增DockerFile(我这里使用的是centOS 8 数据库链接上需要处理一下协议问题)为了防止出现这个错误  provider: TCP Provider, error: 35 - An internal exception was caught

在.NET Core/.NET 5的容器镜像中的OpenSSL的最低协议版本要求为TLSv1.2,而我们的MS SQL Server所用的版本较低,不支持TLSv1.2只支持TLSv1

可参考 https://blog.csdn.net/farway000/article/details/124441124 或者在 dockerfile中 加上 这一句  RUN sed -i 's/TLSv1.2/TLSv1/g' /etc/ssl/openssl.cnf  

我先例出一个站点的示例,其他站点类似
dockerfile 示例

  1. FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
  2. WORKDIR /app/Basicapplication
  3. EXPOSE 80
  4. COPY  . .
  5.  
  6. ENV TZ=Asia/Shanghai
  7. RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
  8. RUN sed -i 's/TLSv1.2/TLSv1/g' /etc/ssl/openssl.cnf
  9. ENV ASPNETCORE_URLS=http://+:80
  10. ENTRYPOINT ["dotnet", "BasicApplication.dll","--server.urls","http://*:80"]

每个站点一个dockerfile ,因为要把每个站点部署在不同的容器中

建议不要将多余文件也build到镜像,包括静态文件,配置文件。(建议建立一个镜像,检查一下是否创建成功,避免重复创建后面花时间一个一个删)

创建镜像:docker build -f /home/zhangweifeng/公共/linux/BasicApplication/Dockerfile -t basic:v1 .      (镜像image 不能用大写名称命名否则会报错)

将所有镜像创建好(再次确认你的镜像是能运行的,不然放进容器会报错,而且容器也起不来)


镜像建立好之后,还不能忘了还有静态文件和配置文件需要挂载到容器里。不然容器启动时会提示文件路径找不到。

怎么挂载静态文件呢?可参考 https://www.tnblog.net/aojiancc2/article/details/7723 

下边直接上代码:

  1. docker run 
  2. -v /home/zhangweifeng/公共/linux/WebResource:/app/WebResource/ 
  3. -v /home/zhangweifeng/公共/linux/ExcelTemplate:/app/ExcelTemplate/ 
  4. -v /home/zhangweifeng/公共/linux/TempFolder:/app/TempFolder/ 
  5. -v /home/zhangweifeng/公共/linux/share:/app/share/ 
  6. -v /home/zhangweifeng/公共/linux/NKConfig.json:/app/NKConfig.json 
  7. -v /home/zhangweifeng/公共/linux/nlog.config:/app/nlog.config 
  8. -v /home/zhangweifeng/公共/linux/web.config:/app/web.config 
  9. -v /home/zhangweifeng/公共/linux/WW_verify_k2C7T5PiccuF4fiZ.txt:/app/WW_verify_k2C7T5PiccuF4fiZ.txt 
  10. -p 9001:80 basic:v1

-p 9001:80 代表的就是    将容器内80端口 映射到宿主机的9001 端口。访问本机9001端口就等于访问到容器内的80端口
每个容器指定的端口不能重复,这里我有5个站点,配了5个端口分别为 9001,9002,9003,9004,9005,9006(后边需要做nginx代理的)
目录挂载上之后,运行还是行的话,还得检查一下容器内的路径映射的对不对了,容器内以项目文件为准,静态文件该放上级放上级,该放同级放同级。


把每个容器都跑起来

跑起来之后发现,每个项目都是独立的,他们之间的互相引用应该怎么处理呢。
这时候就需要用到 nginx 了


查看nginx所在目录

  1. which nginx


启动 nginx

  1. 转到nginx所在目录  ->  ./nginx


修改nginx 配置文件


要编辑nginx文件得用命令,因为它是只读的

新增如下端口配置

输入 i 进入编辑模式
按住 shift + : 退出编辑模式
输入 wq! 保存并退出


每个不同的请求标识转发到不同的端口,这个就需要根据自己的项目配置了。nginx配置比较简单,保存完成之后

重新加载nginx配置文件

nginx -s reload


我这里是用8011 端口代理的,在服务器访问发现没问题,但是我在自己电脑上发现访问不到8011,但是访问 9001 又是可以的
这也是一个小坑,因为服务器没有开放8011 端口,所以需要将8011端口开放,才能在自己电脑上访问到


开放端口命令:/sbin/iptables -I INPUT -p tcp --dport 8011 -j ACCEPT


查看防火墙所有开放的端口

firewall-cmd --zone=public --list-ports


开放端口

firewall-cmd --zone=public --add-port=8092/tcp --permanent

关闭端口

firewall-cmd --zone=public --remove-port=5672/tcp --permanent


配置立即生效

firewall-cmd --reload

 


评价

剑轩

2022/11/13 16:45:11

这个必须赞!

.net core3.0在Ubuntu 16.04上面的部署(Supervisor+nginx)(扩展docker)

前 言Linux 随着Linux越来越流行,本人一个.net程序员也多次研究linux与.net的相关产品,以及中间件的使用方式。So今天给...

k8s 结合 Service 与 Deployment 部署容器

前言最近看到了学习k8s的网站,在文章末尾分享给大家,所以我最近的教程也会根据上面的课程来进行一些总结Service:暴露容...

Mysql K8s部署Volume(hostPath)

Mysql K8s部署Volume[TOC] Mysql 与 Yaml 稍作修改这里提供的是官网的链接:https://kubernetes.io/docs/tasks/run-a...

Asp.net core webapi部署IIS过程详解,以及坑点介绍和解决坑点方法

这几天做了一个Asp.net core 3.0的webapi小练习,只有简单的增删改查,做好了以后又去对应的部署IIS,因为之前也发布过一些...

Elasticsearch 安装与部署

Elasticsearch 安装与部署[TOC] 环境准备 Java 8.0以上的环境本机环境为Mac,Java 14.0.2 获取 Elasticsearch 安装包 ...

Docker部署简单的mysql

Docker部署简单的mysql[TOC] 首先这玩意我是真不想写,网上写的太多了,但是又没有找到快速的创建方式。so…有疑问都可...

Docker 部署RabbitMq集群

Docker 部署RabbitMq集群[TOC] 镜像环境docker pull rabbitmq:3-management 镜像后面带management是带web管理界面...

OKD一键部署

OKD一键部署[TOC] OKD简介OKD 是Kubernetes 的一个发行版,针对持续应用程序开发和多租户部署进行了优化。OKD在 Kubernete...

OKD 部署.netcore项目

OKD 部署.netcore项目[TOC] 创建.netcore测试项目(Webapp)dotnet --version dotnet new webApp -o myWebApp --no-https ...

dotnet项目执行shell脚本实现简单的自动化部署

不要k8s、不要docker、不要Jenkins,只要一个部署脚本,只是一个小项目单台服务器,实现提交代码自动执行脚本,拉代码构建...

servlet 快速部署入门(继承GenericServlet类)1

一、介绍二、入门搭建1:。。。。。2、3:第2 步还可以通过实现servlet接口完成,但是通过接口完成的话,需要重新的方法就...

JavaWeb项目部署到tomcat

1、2、3、还可参考https://blog.csdn.net/qq_46079450/article/details/124036966

部署应用到k8s集群

部署一个简单的应用使用Deployment部署: 创建一个app.yaml apiVersion: apps/v1 kind: Deployment metadata: # 部...

k8s部署应用常见错误

network: open /run/flannel/subnet.env: no such file or directory1:在每个节点创建文件/run/flannel/subnet.env写入以...

kubadm部署k8s时service-cidr网络和pod-network-cidr的地址如何定义

在用kubadm安装k8s时出现一个疑问,service-cidr和pod-network-cidr这个地址如何配置参数说明--apiserver-advertise-addres...