tnblog
首页
视频
资源
登录

.net6 Signalr+Vue3 配合Ingress Nginx的运用

7032人阅读 2023/2/27 12:57 总访问:3467185 评论:0 收藏:0 手机
分类: .net后台框架

.netcore

.net6 Signalr+Vue3 配合Ingress Nginx的运用

项目打包


我们需要将项目进行打包成容器镜像。

后端打包


首先我们为项目添加Docker的支持,内容如下:

  1. FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
  2. WORKDIR /app
  3. EXPOSE 80
  4. FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
  5. WORKDIR /src
  6. COPY ["signalrtest/signalrtest.csproj", "signalrtest/"]
  7. RUN dotnet restore "signalrtest/signalrtest.csproj"
  8. COPY . .
  9. WORKDIR "/src/signalrtest"
  10. RUN dotnet build "signalrtest.csproj" -c Release -o /app/build
  11. FROM build AS publish
  12. RUN dotnet publish "signalrtest.csproj" -c Release -o /app/publish /p:UseAppHost=false
  13. FROM base AS final
  14. WORKDIR /app
  15. COPY --from=publish /app/publish .
  16. ENTRYPOINT ["dotnet", "signalrtest.dll"]


然后我们找到项目目录的上级,在这里打开cmd。


执行如下命令将项目打包成镜像容器。

  1. # 镜像打包
  2. docker build -t signalrtest:v1 -f signalrtest/Dockerfile .
  3. # 贴标签
  4. docker tag signalrtest:v1 aidasi/signalrtest:v1
  5. # 上传到dockerhub
  6. docker pull aidasi/signalrtest:v1

前端打包


首先添加两个配置文件:default.confnginx.conf

  1. server {
  2. listen 80;
  3. server_name localhost;
  4. large_client_header_buffers 4 32k;
  5. location / {
  6. try_files $uri $uri/ @router;
  7. root /usr/share/nginx/html;
  8. index index.html index.htm;
  9. }
  10. location /ChatHub {
  11. proxy_pass http://ws_url;
  12. proxy_read_timeout 300s;
  13. proxy_send_timeout 300s;
  14. proxy_redirect off;
  15. proxy_set_header Host $host;
  16. proxy_set_header X-Real-IP $remote_addr;
  17. proxy_set_header REMOTE-HOST $remote_addr;
  18. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  19. #升级http1.1到 websocket协议
  20. proxy_http_version 1.1;
  21. proxy_set_header Upgrade $http_upgrade;
  22. proxy_set_header Connection $connection_upgrade;
  23. }
  24. error_page 500 502 503 504 /50x.html;
  25. location = /50x.html {
  26. root html;
  27. }
  28. location @router {
  29. rewrite ^.*$ /index.html last;
  30. }
  31. }
  1. user nginx;
  2. worker_processes auto;
  3. error_log /var/log/nginx/error.log notice;
  4. pid /var/run/nginx.pid;
  5. events {
  6. worker_connections 1024;
  7. }
  8. http {
  9. map $http_upgrade $connection_upgrade {
  10. default upgrade;
  11. '' close;
  12. }
  13. include /etc/nginx/mime.types;
  14. default_type application/octet-stream;
  15. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  16. '$status $body_bytes_sent "$http_referer" '
  17. '"$http_user_agent" "$http_x_forwarded_for"';
  18. access_log /var/log/nginx/access.log main;
  19. sendfile on;
  20. #tcp_nopush on;
  21. keepalive_timeout 65;
  22. #gzip on;
  23. include /etc/nginx/conf.d/*.conf;
  24. }


然后再添加脚本用于替换链接。
container-start.sh

  1. #!/bin/bash
  2. for f in `ls /usr/share/nginx/html/js/ | grep app`
  3. do
  4. echo $f
  5. filepath=/usr/share/nginx/html/js/$f
  6. filemappath=/usr/share/nginx/html/js/$f
  7. sed -i 's#'http://localhost:5102'#'$BACK_API_URL'#g' $filepath
  8. sed -i 's#'http://localhost:5102'#'$BACK_API_URL'#g' $filemappath
  9. done
  10. nginxconfigpath=/etc/nginx/conf.d/default.conf
  11. sed -i 's#'http://ws_url'#'$WS_URL'#g' $nginxconfigpath
  12. echo "finish!!!"


注意这里编码格式可以改为LF,以防止容器不执行该脚本。

  1. FROM nginx
  2. RUN rm /etc/nginx/conf.d/default.conf
  3. RUN rm /etc/nginx/nginx.conf
  4. ADD ./default.conf /etc/nginx/conf.d
  5. ADD ./nginx.conf /etc/nginx
  6. COPY ./dist/ /usr/share/nginx/html/
  7. COPY ./container-start.sh /00-container-start.sh
  8. RUN chmod +x 00-container-start.sh
  9. RUN cp /00-container-start.sh /docker-entrypoint.d/


最后在vue的更目录下进行打包上传。

  1. # 镜像打包
  2. docker build -t signalrtestvue:v1 -f Dockerfile .
  3. # 贴标签
  4. docker tag signalrtestvue:v1 aidasi/signalrtestvue:v1
  5. # 上传到dockerhub
  6. docker push aidasi/signalrtestvue:v1

应用部署


编写wsdeploy.yaml文件

  1. apiVersion: networking.k8s.io/v1
  2. kind: Ingress
  3. metadata:
  4. name: wstestingress
  5. annotations:
  6. kubernetes.io/ingress.class: "nginx"
  7. nginx.org/websocket-services: "wsapi,spa"
  8. nginx.ingress.kubernetes.io/rewrite-target: /
  9. nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
  10. nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
  11. nginx.ingress.kubernetes.io/configuration-snippet: |
  12. proxy_set_header Upgrade "websocket";
  13. proxy_set_header Connection "Upgrade";
  14. spec:
  15. rules:
  16. - host: "www.signalrtest.com"
  17. http:
  18. paths:
  19. - path: /
  20. pathType: Prefix
  21. backend:
  22. service:
  23. name: spa
  24. port:
  25. number: 80
  26. - host: "ws.signalrtest.com"
  27. http:
  28. paths:
  29. - path: /
  30. pathType: Prefix
  31. backend:
  32. service:
  33. name: wsapi
  34. port:
  35. number: 80
  36. ---
  37. apiVersion: apps/v1
  38. kind: Deployment
  39. metadata:
  40. name: spa
  41. labels:
  42. name: spa
  43. spec:
  44. replicas: 1
  45. selector:
  46. matchLabels:
  47. name: spa
  48. template:
  49. metadata:
  50. labels:
  51. name: spa
  52. spec:
  53. containers:
  54. - name: spa
  55. image: aidasi/signalrtestvue:v1
  56. ports:
  57. - containerPort: 80
  58. imagePullPolicy: Always
  59. env:
  60. - name: BACK_API_URL
  61. value: "http://ws.signalrtest.com"
  62. - name: WS_URL
  63. value: "http://ws.signalrtest.com/ChatHub"
  64. ---
  65. apiVersion: apps/v1
  66. kind: Deployment
  67. metadata:
  68. name: wsapi
  69. labels:
  70. name: wsapi
  71. spec:
  72. replicas: 1
  73. selector:
  74. matchLabels:
  75. name: wsapi
  76. template:
  77. metadata:
  78. labels:
  79. name: wsapi
  80. spec:
  81. containers:
  82. - name: wsapi
  83. image: aidasi/signalrtest:v1
  84. ports:
  85. - containerPort: 80
  86. imagePullPolicy: Always
  87. ---
  88. kind: Service
  89. apiVersion: v1
  90. metadata:
  91. name: spa
  92. namespace: swprinter
  93. spec:
  94. ports:
  95. - port: 80
  96. protocol: TCP
  97. targetPort: 80
  98. selector:
  99. name: spa
  100. ---
  101. kind: Service
  102. apiVersion: v1
  103. metadata:
  104. name: wsapi
  105. spec:
  106. ports:
  107. - port: 80
  108. protocol: TCP
  109. targetPort: 80
  110. selector:
  111. name: wsapi
  112. ---
  1. kubectl apply -f wsdeploy.yaml


由于我们的域名是自定义的所以可能SPA的nginx解析不到代理。
所以我们可以在CoreDNS里面进行添加,将它的路径指向我们的Ingress svc即可。

  1. kubectl edit cm/coredns -n kube-system
  1. rewrite stop {
  2. name regex ws.signalrtest.com ingress-nginx-controller.ingress-nginx.svc.cluster.local
  3. answer name ingress-nginx-controller.ingress-nginx.svc.cluster.local ws.signalrtest.com
  4. }


然后我们将自定义域名添加到自己的主机hosts文件上。

  1. echo "www.signalrtest.com 10.211.55.230" >> /etc/hosts
  2. echo "ws.signalrtest.com 10.211.55.230" >> /etc/hosts


接下来我们访问前端并测试访问试试看。

HTTPS支持


添加证书。

  1. # 为www.signalrtest.com生成证书
  2. openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout www.signalrtest.com.key -out www.signalrtest.com.crt
  3. # 为ws.signalrtest.com生成证书
  4. openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout ws.signalrtest.com.key -out ws.signalrtest.com.crt
  5. # 添加到Kubernetes中
  6. kubectl create secret tls wsweb-tls-secret --key www.signalrtest.com.key --cert www.signalrtest.com.crt
  7. kubectl create secret tls wsapi-tls-secret --key ws.signalrtest.com.key --cert ws.signalrtest.com.crt
  8. # 生成PEM
  9. cat www.signalrtest.com.crt www.signalrtest.com.key > www.signalrtest.com.pem
  10. kubectl exec pod/spa-5bcb958b64-8s9zl -- mkdir /etc/nginx/cert/ -p
  11. kubectl cp www.signalrtest.com.pem default/spa-5bcb958b64-8s9zl:/etc/nginx/cert/
  12. kubectl cp www.signalrtest.com.key default/spa-5bcb958b64-8s9zl:/etc/nginx/cert/
  13. kubectl exec pod/spa-5bcb958b64-8s9zl -- nginx -s reload


修改wsdeploy.yaml文件,添加ingress TLS。

  1. apiVersion: networking.k8s.io/v1
  2. kind: Ingress
  3. metadata:
  4. name: wstestingress
  5. annotations:
  6. kubernetes.io/ingress.class: "nginx"
  7. nginx.org/websocket-services: "wsapi,spa"
  8. nginx.ingress.kubernetes.io/rewrite-target: /
  9. nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
  10. nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
  11. nginx.ingress.kubernetes.io/configuration-snippet: |
  12. proxy_set_header Upgrade "websocket";
  13. proxy_set_header Connection "Upgrade";
  14. spec:
  15. tls:
  16. - hosts:
  17. - www.signalrtest.com
  18. secretName: wsweb-tls-secret
  19. - hosts:
  20. - ws.signalrtest.com
  21. secretName: wsapi-tls-secret
  22. rules:
  23. - host: "www.signalrtest.com"
  24. http:
  25. paths:
  26. - path: /
  27. pathType: Prefix
  28. backend:
  29. service:
  30. name: spa
  31. port:
  32. number: 80
  33. - host: "ws.signalrtest.com"
  34. http:
  35. paths:
  36. - path: /
  37. pathType: Prefix
  38. backend:
  39. service:
  40. name: wsapi
  41. port:
  42. number: 80

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

bk

2020/7/14 20:56:13

日常踩

剑轩:@bk那我+1

2020/7/17 21:10:30 回复

C.net 配合小程序实现经过第三方服务器中转文件

某些时候,微信小程序前段上传文件的时候需要经过第三方服务器再将文件上传到客户的服务器;操作如下:1:(小程序内向中端服...

iframe自适应高度与配合net core使用

去掉iframe边框frameborder="0"去掉滚动条scrolling="no"iframe 自适应高度如果内容是固定的,那么就...

通过PlUpload控件配合WebApi接口完成压缩上传文件

最近一段时间都在使用PlUpload做文件上传的功能,研究过后感觉使用起来体验还是比较好的,不过网上的资料很多都记录的很简...

.net core配合qadmin简单使用

qadmin是使用vue和layui组合的一个前端模板把模板中的首页复制进来<!DOCTYPEhtml> <html> <head> &...

.net core3.1使用API网关Ocelot五:配合consul实现动态路由

真正的项目中我们的服务会很多,如果一一地配置到配置文件,将会是一个巨大的工程,这个时候我们就可以让Ocelot与我们的服...

.net core 3.1 URL 生成的使用,配合中间件

URL 生成:是指路由基于一系列路由值创建 URL 路径的过程。允许终结点与访问它们的 URL 之间存在逻辑分隔。常用方法GetPath...

elementui对话框Dialog使用,配合表单使用。vue-element-ui 弹窗,弹出层

Dialog 弹出一个对话框,适合需要页面元素更多的场景。需要设置visible属性,它接收Boolean,当为true时显示 Dialog。Dialo...

基础领域驱动DDD框架搭建,配合sqlsugar基础架构搭建。使用仓储。.net使用Autofac实现自动注入。通过特性封装事务,特性实现工作单元

[TOC]一:创建一个WebApi项目随便取名一个,比如TeacherCertificationAPI效果如下: 顺便在appsettings.json中配置一下...

一点flex布局的运用

水平分割:html:<divclass="flex-container"> <divclass="flex-item">flexitem1</div...

c 锁的运用

锁的一般分类:乐观锁、悲观锁、共享锁、排它锁、互斥锁锁的对象为什么要是私有的只读的因为防止被修改C#中Monitor和Lock以...

.net json序列化匿名类型jobject的运用

在反序列化的时候我们可以不用每次都添加一次实体,如果只是简单临时的用一下可以使用jobject即可解析方法一般有两种方法一...

grpc 在vs中的运用与proto同步

思 考 问 题 grpc 服务器当对 proto 文件进行修改时每次都去 Copy 到本地 Client 是比较麻烦的,有没有快捷的方法解决?Gr...

Weave Scope 的运用

Weave Scope 的运用[TOC] Weave Scope 的介绍 简介 Weave Scope 用于监控、可视化和管理 Docker 以及 Kubernetes...

Kubernetes Velero 备份的运用

Velero 的运用[TOC] Velero简介Velero是一个开源工具,可以安全地备份,恢复和迁移Kubernetes集群和持久卷。它既可以在本...
这一世以无限游戏为使命!
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术