3、ASP.NET Core 部署Linux 第二篇(Core SDK 2.1)

1、項目整理

 

 2、寶塔搭建

一、寶塔的搭建

一、更新yumphp

sudo yum update

二、刪除dotnet core sdknginx

sudo yum erase libunwind libicu

三、刪除連接web

sudo rm -rf /usr/local/bin

四、寶塔搭建瀏覽器

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

3、搭建Core SDK環境

 在安裝.NET Core以前,您須要註冊Microsoft產品Feed。 這隻須要作一次。 首先,註冊Microsoft簽名密鑰,而後添加Microsoft產品Feed。命令以下:websocket

一、註冊 Microsoft 簽名密鑰 

sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc

二、而後添加Microsoft產品Feed

sudo sh -c 'echo -e "[packages-microsoft-com-prod]\nname=packages-microsoft-com-prod \nbaseurl=https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/dotnetdev.repo'

三、安裝依賴

yum install libunwind libicu -y

四、安裝版本Core SDK 2.1

sudo yum install dotnet-sdk-2.1

五、驗證:執行 dotnet --version

或者

一、.net core 2.1安裝(添加產品祕鑰與yum源)

sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm

二、安裝依賴

yum install libunwind libicu -y

開始安裝:

sudo yum install dotnet-sdk-2.1

查看版本號:

dotnet --version

 

 4、搭建Web環境

一、站點搭建

 

 

 二、上傳源碼

一、找到寶塔爲你的網站建立號的WWW站點目錄而後你在裏面建立一個存放Core項目的站點目錄 好比(Pulish文件夾-意味發佈)cookie

(在頂級目錄www/wwwroot    具體 一、cd  ../    二、ls查看是否有www目錄     三、cd  www/wwwroot  四、mkdir Pulish -建立文件夾裏面就是最終放入Core項目源碼)網絡

二、壓縮Core項目源碼爲rar格式, Pulish.rar 上傳到wwwroot 內(以前建立的Pulish文件夾就能夠刪除,直接解壓就替換掉了)curl

順便刪除默認index文件socket

三、運行命令: dotnet  Ban.dlljsp

 

 測試

跑起來了 可是出問題了

Unable to bind to http://localhost:5000 on the IPv6 loopback interface: 'Cannot assign requested address'.

'沒法分配請求的地址'。

dotnet Ban.dll --server.urls http://*:8001

 仍是不行

-------------------------------------

而後我看了看

改變

 

 更改

 

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseKestrel()
                .UseUrls("http://127.0.0.1:8001")  //更改啓動端口
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseStartup<Startup>();
    }

仍是不行,最終我新建項目測試了一下,能夠了(具體緣由是個人項目問題)

新建空Core項目測試

而後,猜測是什麼緣由致使下面的問題

猜測個人項目curl http://127.0.0.1 請求是否是路由的問題,測試了下:(果真是路由的問題)

 

 

 

 

3、反向代理

 

 

 而後訪問網址,就直接進入Login頁面(此步驟完成部署)

分析緣由:剛纔查看的是網頁的源碼,不是瀏覽的Web界面,內部程序並未運行,到瀏覽器才攔截登陸Login登陸

 5、訪問頁面(Signalr Nginx代理出現的緣由)

用Nginx代理登陸出現

以及刷新出現

 

 

 

 通過分析是nginx 代理的問題,我就直接經過網址訪問,

猜想一更改,不指定127.0.0.1以*代替

 

 

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseKestrel()
                .UseUrls("http://*:8005") //更改啓動端口
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseStartup<Startup>();
    }

二、經過直接訪問(不通過代理) 阿里雲防火牆打開8005,寶塔打開端口8005,經訪問

 

 並登陸

 而後我用域名訪問

總結緣由是:Nginx代理出現的問題

 

 解決方案:

除了ws標識的請求,都轉到fast_cgi上了

 

 

 寶塔的處理方式

 

 

 配置文件:

#PROXY-START/
location /
{
    expires 12h;
    if ($request_uri ~* "(php|jsp|cgi|asp|aspx)")
    {
         expires 0;
    }
    proxy_pass http://127.0.0.1:8005;

    #持久化鏈接相關配置
    #proxy_connect_timeout 30s;
    #proxy_read_timeout 86400s;
    #proxy_send_timeout 30s;
    #proxy_http_version 1.1;
    #proxy_set_header Upgrade $http_upgrade;
    #proxy_set_header Connection "upgrade";
    add_header X-Cache $upstream_cache_status;
    
    #Set Nginx Cache
    add_header Cache-Control no-cache;
}
#signalr字母全小寫 http://www.logr.cn/signalr?id=TAdbYg8JM4oE2HfUVeV9uQ
location /signalr        
{
    expires 12h;
    if ($request_uri ~* "(php|jsp|cgi|asp|aspx)")
    {
         expires 0;
    }
    ##僅首字母小寫因Signalr連接必須首字母小寫
    proxy_pass http://127.0.0.1:8005/signalR; 
    #連接超時
    proxy_connect_timeout 4s;
    proxy_read_timeout 3600s; 
    proxy_send_timeout 12s; 
    #配置獲取真實ip
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    #升級http1.1到 websocket協議  
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    
    #持久化鏈接相關配置
    #proxy_connect_timeout 30s;
    #proxy_read_timeout 86400s;
    #proxy_send_timeout 30s;
    #proxy_http_version 1.1;
    #proxy_set_header Upgrade $http_upgrade;
    #proxy_set_header Connection "upgrade";
    add_header X-Cache $upstream_cache_status;
    
    #Set Nginx Cache
    add_header Cache-Control no-cache;
}
#PROXY-END/

 精簡配置

#PROXY-START/
location /
{
    expires 12h;
    if ($request_uri ~* "(php|jsp|cgi|asp|aspx)")
    {
         expires 0;
    }
    proxy_pass http://127.0.0.1:8005;
}
location /signalr        
{
    expires 12h;
    if ($request_uri ~* "(php|jsp|cgi|asp|aspx)")
    {
         expires 0;
    }
    proxy_pass http://127.0.0.1:8005/signalR; 
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}
#PROXY-END/

#SignalR 必須小寫 http://www.logr.cn/signalr?id=M6P_U4XjAl14CyHT-q8AHg

 狀況一:

 

 

 

 

請求的時候沒有攜帶cookie

 

 而後我看登陸正常的狀況

 

 不正常的狀況

 再次觀察,精簡版代理配置的區別

 登陸cookie就是沒有跳轉,可是我網址輸入Home是能夠進去的,說明域名是能夠登陸,就是沒有跳轉,而後ip是能夠登陸說明代碼沒有問題,說明仍是代理Nginx配置的問題

最終解決方案

本來寶塔三個配置文件分別爲(Nginx主配置文件,站點配置文件,代理配置文件)

我直接站點配置裏面寫代理配置了 整合後的

 

 

server {
        listen       80;
        server_name  www.logr.cn;
        location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
            #proxy_set_header Connection "";
            #proxy_http_version 1.1;
            proxy_pass   http://127.0.0.1:8005/;
        }
        location /signalr {
        proxy_pass http://127.0.0.1:8005/signalR; 
        proxy_set_header Host $host:$server_port;
        proxy_set_header Remote_Addr $remote_addr;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        }
}    

 可是 強刷新,還會出現問題:

 

 

 不代理,這種狀況就不會出現,我是放入signalr連接成功觸發獲取用戶列表的原理這種場景的,就仍是代理強刷新的問題。

得出結論 一、IP +8005沒有問題 二、代理80端口域名訪問有問題三、域名加8005 也有問題(這種問題概率僅僅小一些,可是會出現) 

猜想:若是是nginx未及時響應應該是報錯,    我這種狀況是原資源的連接被302了,302就是強制跳轉,應該是網絡傳輸的那個環節出的問題

整個網絡請求通過域名解析(在須要域名解析的時候),網絡傳輸,不肯定哪一個環節坑了你

解決代理問題localhost和從新加載的問題

查找問題

強刷新偶出現頁面加載 logr.cn強制跳轉localhost

 

 signalr加載也會出現localhost又強制跳轉localhost

 而後我測試了一下

 使用精簡代理測試了 一下

server {
        listen 80;
        server_name test.ffreader.cn;
        location / {
            proxy_pass   http://127.0.0.1:8005/;
        }
        location /signalr {
            proxy_pass http://127.0.0.1:8005/signalR; 
            
              #配置WS
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
}

強刷新,居然沒有問題,徹底沒有任何問題。

我準備問阿里雲客服

準備話術是(由於是域名有關係的):域名解析被污染(域名解析被污染是否是被污染了),當我刷新頁面的時候,整個網絡請求通過域名解析,網絡傳輸,出現302把我原資源強制跳轉了localhost的這種狀況。

 

狀況二:dotnet 未能正常關閉,省去守護運行dotnet(可是迭代版本須要kill此進程服務)

 等待一會,就斷開。

6、守護進程supervisor 

一、寶塔安裝supervisor 

 

 (手動添加配置文件會出錯)

 

 

 

 (我就本身建立配置文件,經過命令進行執行)

二、建立啓動配置文件

[program:ban]
directory=/www/wwwroot/www.logr.cn/publish
command=dotnet Ban.dll 
autostart=true
autorestart=true
[supervisord]

 

 

 

 

 

新手出現的錯誤

一、Error: .ini file does not include supervisorctl section

相關文章
相關標籤/搜索