<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Loading

      基于.NetCore開發博客項目 StarBlog - (31) 發布和部署

      前言

      StarBlog 第一期規劃的功能基本完成了,我想著在春節前應該可以把第一期的系列文章完結掉,那么在差缺補漏階段就剩下開發項目的最后一個環節——部署了。

      PS: 事實上,還有一個很重要但又經常被略過的測試環節我們沒有提到,因為時間關系,第一期規劃我沒有寫單元測試和集成測試,在開發中,測試環節是必備的,我也立個flag會在之后補充這部分測試的代碼。

      關于 dotnet 的測試,可以看看我之前的這篇文章,有余力的同學可以先自行編寫測試代碼。

      文章傳送門: Asp-Net-Core學習筆記:單元測試和集成測試

      C# 現在已經全面擁抱云原生跨平臺,部署方式多種多樣,特別是 dotnet8 出來之后大大加強了 AOT 功能,可以獲得和 go 差不多的方便 AOT 能力,本文介紹幾種常見的部署方式,可供讀者靈活選擇。

      發布

      發布就是把程序編譯+打包成一個可執行文件的過程,一般使用 dotnet publish 或者 msbuild 命令,本文使用 dotnet publish

      然后編譯又有多種模式,一般分成這幾種

      • Framework dependent (框架依賴) - 需要先安裝對應版本的 runtime 才能執行,跟 Java 的 jar 包差不多
      • Self contained (自包含) - 自帶運行時,可以直接執行,但跟框架依賴相比沒有本質區別
      • AOT (Ahead of time) - 生成二進制文件,不需要運行時可以直接運行

      第三種 AOT 是跟隨著 dotnet8 退出新發布的(之前的不完善),目前對于 AspNetCore 項目來說還需要一些修改,本項目開發的時候還沒有 AOT ,所以我們只用前兩種方法,后續我會研究一下將 StarBlog 使用 AOT 方式發布。

      框架依賴發布

      使用命令

      dotnet publish -r linux-x64 -c Release -p:PublishSingleFile=true -p:PublishTrimmed=true --self-contained false
      

      參數說明:

      • -r linux-x64 - 表示使用 linux-x64 的 runtime ,如果要發布到其他平臺,需要修改為對應的運行時,比如 win-x64
      • -c Release - 使用 Release 配置生成,相對的還有 Debug 模式,但只有開發才用
      • -p:PublishSingleFile=true - 生成單個文件,如果沒有配置的話,會把項目里的依賴都帶上,一大堆dll文件
      • -p:PublishTrimmed=true - 裁剪生成的文件,雖然項目的依賴很多,但使用到的 class 和 method 沒有那么多,沒用到的這部分就可以去掉,但如果項目里面大量用到反射,就要慎用這個功能,編譯器可能沒法檢查到動態調用的方法

      自包含發布

      使用命令

      dotnet publish -r linux-x64 -c Release -p:PublishSingleFile=true -p:PublishTrimmed=true  --self-contained true
      

      會生成這些文件

       publish
       ├─ wwwroot
       ├─ words.json
       ├─ StarBlog.Web.xml
       ├─ StarBlog.Web
       ├─ SQLite.Interop.dll
       ├─ package.json
       ├─ package-lock.json
       ├─ Magick.Native-Q8-x64.dll.so
       ├─ Magick.Native-Q8-x64.dll.dylib
       ├─ Magick.Native-Q8-x64.dll
       ├─ libe_sqlite3.so
       ├─ appsettings.json
       ├─ appsettings.Development.json
       └─ appsettings-email.json
      
      1 directory, 13 files
      

      其中可執行文件就是 StarBlog.Web 這個,也就是我們的項目名稱。

      其他的都是一些配置啥的,然后還可以看到幾個 dll,前面不是說把 dll 都打包到可執行文件里了嗎,怎么還有?錯啦,打包到一起的是那些純 C# 實現的 dll ,里面是 IL 代碼,而這里的 SQLite.Interop.dllMagick.Native-Q8-x64.dll 實際上是 C/C++ 之類開發的第三方庫(native library),是二進制的形式,這部分默認不會包含到可執行文件里。

      當然也可以集成到一起,加個參數就行 -p:IncludeNativeLibrariesForSelfExtract=true

      本機部署 (supervisor)

      最直接的部署方式,把程序發布為可執行文件,直接在服務器上運行,搭配 supervisor 等進程監控工具,也是我的博客目前使用的部署方式。

      我之前已經寫過關于部署的文章,可以參考一下: Asp-Net-Core學習筆記:5.構建和部署

      使用 supervisor 來管理進程

      首先安裝

      pip install supervisor
      

      /etc/supervisord.d/ 下創建個配置,比如 star_blog.ini

      內容如下,可以參考一下,運行起來后在 8080 端口訪問

      [program:star_blog]
      # 腳本目錄
      directory = /home/apps/StarBlog
      # 腳本執行命令
      command = /home/apps/StarBlog/StarBlog.Web --urls "http://*:8080;"
      # supervisor啟動的時候是否隨著同時啟動,默認True
      # 當程序exit的時候,這個program不會自動重啟,默認unexpected,設置子進程掛掉后自動重啟的情況,
      # 有三個選項,false,unexpected和true。
      # 如果為false的時候,無論什么情況下,都不會被重新啟動,如果為unexpected,只有當進程的退出碼不在下面的exitcodes里面定義的autorestart = true
      autostart = true
      # 這個選項是子進程啟動多少秒之后,此時狀態如果是running,則我們認為啟動成功了。默認值為1
      startsecs = 1
      # 腳本運行的用戶身份
      user = hello
      

      然后啟動 supervisor

      systemctl start supervisord.service
      

      設置自啟動

      systemctl enable supervisord.service
      

      不同的Linux發行版命令有所差別,可以自行查閱文檔: https://github.com/Supervisor/supervisor

      docker 部署

      docker 部署的方式很靈活,可以在本地打包了鏡像之后上傳到倉庫,服務器上 docker pull 拉下來部署,后續搭配流水線也很方便;也可以用我這種方式,docker 作為 runtime 環境,然后本地打包個框架依賴的可執行文件上傳上去執行。

      這里參考官方的模板里的 docker 部署方式,具體可以看我之前寫的這篇文章: Asp-Net-Core開發筆記:FrameworkDependent搭配docker部署

      根據前面的框架依賴發布,然后準備好 docker 配置,以后每次更新只需要上傳可執行文件去覆蓋就行了。

      dockerfile

      FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
      WORKDIR /app
      EXPOSE 80
      EXPOSE 443
      
      FROM base AS final
      WORKDIR /app
      COPY . .
      ENTRYPOINT ["./StarBlog.Web"]
      

      docker-compose.yaml

      version: '3.6'
      
      services:
        web:
          image: ${DOCKER_REGISTRY-}web
          container_name: starblog
          restart: always
          environment:
            - ASPNETCORE_ENVIRONMENT=Production
            - ASPNETCORE_URLS=http://+:80
          build:
            context: .
          volumes:
            - .:/app
          ports:
            - "8080:80"
          networks:
            - default
      
      networks:
        default:
          name: starblog
      

      啟動

      docker compose up
      

      之后在 8080 端口可以訪問

      流水線部署

      流水線可以實現自動部署,解放雙手。

      關于這部分本文就不贅述了,具體的我之前也寫過文章,感興趣的同學可以看看

      其他注意事項

      使用 Nginx 反向代理或者在 docker 內部正確獲取 IP

      本項目具有訪問記錄功能,如果使用了 nginx 反向代理或者在 docker 部署且沒有正確配置的話,訪客的IP地址會是 127.0.0.1 ,需要配置一下。

      Nginx配置

      server {
          listen        80;
          server_name   example.com *.example.com;
          location / {
              proxy_pass         http://127.0.0.1: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;
              proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header   X-Forwarded-Proto $scheme;
          }
      }
      

      后端配置中間件

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

      搞定

      小結

      部署這塊老生常談了,多種方式各有優劣,這次急著收拾東西就不寫太多了~

      參考資料

      posted @ 2024-02-08 17:17  程序設計實驗室  閱讀(424)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 日韩少妇人妻vs中文字幕| 国产精品无遮挡一区二区| 日韩中文字幕有码av| 欧洲精品免费一区二区三区| 亚洲跨种族黑人xxxxx| 内射老阿姨1区2区3区4区| 在线高清免费不卡全码| 麻豆一区二区三区香蕉视频| 久久精品国产中文字幕| 波多野结衣乳喷高潮视频| 麻豆精产国品一二三区区| 久久精品免视看国产成人| 中文字幕亚洲综合久久青草| 亚洲一区二区av在线| 国产在线中文字幕精品| 日本少妇xxx做受| 日韩精品福利一区二区三区| 18禁免费无码无遮挡不卡网站| 亚洲春色在线视频| 99久久国产综合精品成人影院| 真实国产老熟女无套中出| 国产精品一码二码三码| 九九久久自然熟的香蕉图片| 五月天免费中文字幕av| 国产熟女一区二区五月婷| 青青草原国产AV福利网站| 平山县| 男人猛躁进女人免费播放| 国产欧美日韩精品第二区| 国产精品熟女一区二区三区| 日本一区二区三区在线 |观看| 人妻内射一区二区在线视频| 国产美女高潮流白浆视频| 久久精品国产亚洲av麻豆长发| 國產尤物AV尤物在線觀看| 综合激情网一区二区三区| 亚洲国产美女精品久久久| 欧美做受视频播放| 亚洲AV无码成人网站久久精品| 国产精品二区中文字幕| 国产精品夜夜春夜夜爽久久小|