重新整理 .net core 實踐篇 ———— linux 上線篇 [外篇]

前言

簡單整理一個linux 簡單上線。 這個是該系列的外篇,該系列繼續更新。獻給剛學的人。

正文

安裝實例

dotnet new webapp -n AspNetCoreDemo -o firstwebapp

編譯並運行:

dotnet run

查看網絡情況:

netstat -anpl

將項目發佈到指定位置:

dotnet publish -o /var/testdotnet/

將打包好的運行起來:

dotnet /var/testdotnet/AspNetCoreDemo.dll 

配置nginx

這個時候是外面是訪問不了的,原因如下:

這裡綁定的是127.0.0.1,這個是內網的,所以無法訪問到。

然後這裡解釋一下為什麼localhost可以訪問哈:

因為host: localhost 127.0.0.1 這個是默認的。

當然我們可以改成0.0.0.0 去啟動,但是一般不會這麼干。

這裡說明一下,為什麼我們一般有一個nginx 代理一個應用程序。

那是因為nginx 做的不僅僅是代理,nginx 有安全模塊,有限流模塊,這樣我們就不用再應用程序中寫了。

大大減少了項目的複雜度。

那麼安裝一下nginx:

yum install nginx -y

然後啟動一下:

sudo systemctl start nginx

然後配置文件改成這樣:

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        location / {
         proxy_pass         //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;
         proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header   X-Forwarded-Proto $scheme;
        }

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }

然後nginx 重新加載配置一下:

nginx -s reload

然後我這裡訪問一下:

這樣就ok了。

創建服務文件

什麼是服務文件?

在 Linux 中,還有具有「.service」擴展名的單元配置文件,用於在進程退出時控制守護程序的行為。 這些文件也稱為 服務文件、 單元文件和 服務單元文件。

這些服務文件位於以下目錄之一:

/usr/lib/systemd/system:存儲已下載應用程序的服務文件
/etc/systemd/system/:存儲由系統管理員創建的服務文件

這兩個分別放什麼呢?

比如這種nginx 一般是第三方的程序,就放在/usr/lib/systemd/system下面。

一般yum安裝都在裏面。

然後/etc/systemd/system/ 這裡放的是我們自己的應用程序。

這裡就可以在這個目錄下寫一個:

[Unit]
Description= AspNetCoreDemo
[Service]
WorkingDirctory:/var/testdotnet/
ExecStart=/usr/bin/dotnet /var/testdotnet/AspNetCoreDemo.dll
Restart=aways
RestartSec=10
SyslogIdentifier=AspNetCoreDemo
User=root
Environment=ASPNETCORE_ENVIRONMENT=Development
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target

簡單解釋一下:

WorkingDirectory 是發佈應用程序的目錄。
ExecStart 是啟動應用程序的實際命令。
Restart=always 是自言自明的。 如果由於某種原因(無論是手動還是由於崩潰)而停止,則始終會啟動此過程。
RestartSec=10 也是自言自明的。 進程停止後,將在經過 10 秒後啟動。
SyslogIdentifier 很重要。 它表示「系統日誌標識符」。 有關守護程序的信息記錄在此名稱下的系統日誌中。 還可以使用此標識符查找進程的 PID。
User 是管理服務的用戶。 它應存在於系統中,並具有相應的應用程序文件所有權。
可以在服務文件中設置任意數量的環境變量。

然後查看一下:

然後這裡有一個disable,這個意思是系統重啟後不會去啟動這個。

設置enable:systemctl enable AspNetCoreDemo

這裡就會創建一個鏈接過去。 這裏面的就是開啟啟動的。

這樣就ok了。

安全

說到安全就要說下iptable 了。

這個就是一個輕量的防火牆了,比較實用。

但是這裏面有一個問題,那就iptable 配置很複雜,有多複雜呢? 可以看下我的linux 系列。

所以就有個開發了配置工具,可以理解為iptable的客戶端吧。

這裡解釋一個ufw這個,市面上有很多,可以找到適合自己的。

安裝很簡單:

yum install ufw
  1. 運行命令檢查 ufw 的 sudo ufw status verbose 狀態。 默認情況下,ufw 未啟用且處於非活動狀態。

  2. 運行 sudo ufw default allow 命令。 由於除了默認的「allow」規則之外,沒有其他規則,因此 VM 上的每個端口都將被視為已打開。

為什麼ufw 有這個設置allow 的東西呢? 這跟iptable 的模式有關,iptable 兩種模式,一個是allow 一種是 reject,如果設置了allow,那麼就配置不允許的,就是規則裏面沒有的就允許,反之亦然。

  1. 可以通過運行 sudo ufw default deny 命令將默認規則更改為拒絕來實現此操作。 僅允許 SSH 和 HTTP 協議。 其他協議將被拒絕。

  2. 通過運行 sudo ufw allow http允許 HTTP 協議。 TTP 是在 /etc/services 文件中定義的已知協議。 因此,可以使用協議名稱,並且可以運行該 sudo ufw allow http 命令。 運行 sudo ufw allow 80 也完全有效。

測試一下哈: sudo ufw deny http

這裡設置http為不允許:

這樣就可以了,然後就訪問不了了。

多實例

如果想部署多個在同一台機器的話,那麼創建另外一個service,然後配置一下環境:

Environment=ASPNETCORE_URLS=//localhost:6001

這樣就啟動的是另外一個端口了。

那麼nginx 做負載均衡,這個已經在nginx 系列了,就不羅嗦了。

下一結利用一些工具在nginx 排查和監控netcore的運行情況。