asp.net core 託管與部署 supervisor Error: Another program is already listening

 

1、使用IIS在Windows上進行託管html

1,部署asp.net corepython

①檢查安裝最新的SDK和運行時linux

https://www.microsoft.com/net/download/windows#/runtimenginx

IIS須要跑asp.net core必需要安裝Runtimegit

②執行 dotnet publish 命令發佈程序github

③IIS添加網站web

④設置程序池shell

2, Asp.net Core 模塊的配置windows

①web.config的配置centos

如下 web.config 文件發佈用於依賴框架的部署,並配置 ASP.NET Core 模塊以處理站點請求:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="dotnet" 
                arguments=".\MyApp.dll" 
                stdoutLogEnabled="false" 
                stdoutLogFile=".\logs\stdout" />
  </system.webServer>
</configuration>

如下 web.config 發佈用於獨立部署

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath=".\MyApp.exe" 
                stdoutLogEnabled="false" 
                stdoutLogFile=".\logs\stdout" />
  </system.webServer>
</configuration>

aspNetCore 元素的屬性

特性 描述 默認
arguments

可選的字符串屬性。

processPath 中指定的可執行文件的參數。

 
disableStartUpErrorPage 「true」或「false」。

若是爲 true,將禁止顯示「502.5 - 進程失敗」頁面,而會優先顯示 web.config 中配置的 502 狀態代碼頁面。

false
forwardWindowsAuthToken 「true」或「false」。

 若是爲 true,會將令牌做爲每一個請求的標頭「MS-ASPNETCORE-WINAUTHTOKEN」,轉發到在 %ASPNETCORE_PORT% 上偵聽的子進程。 該進程負責在每一個請求的此令牌上調用 CloseHandle。

true
processPath

必需的字符串屬性。

爲 HTTP 請求啓動進程偵聽的可執行文件的路徑。 支持相對路徑。 若是路徑以 . 開頭,則該路徑被視爲與站點根目錄相對。

 
rapidFailsPerMinute

可選的整數屬性。

指定容許 processPath 中指定的進程每分鐘崩潰的次數。 若是超出了此限制,模塊將在剩餘分鐘數內中止啓動該進程。

10
requestTimeout

可選的 timespan 屬性。

指定 ASP.NET Core 模塊等待來自 %ASPNETCORE_PORT% 上偵聽的進程的響應的持續時間。

在 ASP.NET Core 2.1 或更高版本附帶的 ASP.NET Core 模塊版本中,使用小時數、分鐘數和秒數指定 requestTimeout

00:02:00
shutdownTimeLimit

可選的整數屬性。

檢測到 app_offline.htm 文件時,模塊等待可執行文件正常關閉的持續時間(以秒爲單位)。

10
startupTimeLimit

可選的整數屬性。

模塊等待可執行文件啓動端口上偵聽的進程的持續時間(以秒爲單位)。 若是超出了此時間限制,模塊將終止該進程。 模塊在收到新請求時嘗試從新啓動該進程,並在收到後續傳入請求時繼續嘗試從新啓動該進程,除非應用在上一回滾分鐘內沒法啓動 rapidFailsPerMinute 次。

120
stdoutLogEnabled

可選布爾屬性。

若是爲 true,processPath 中指定的 進程的 stdout 和 stderr 將重定向到 stdoutLogFile 中指定的文件。

false
stdoutLogFile

可選的字符串屬性。

指定在其中記錄 processPath 中指定進程的 stdout 和 stderr 的相對路徑或絕對路徑。 相對路徑與站點根目錄相對。 以 . 開頭的任何路徑均與站點根目錄相對,全部其餘路徑被視爲絕對路徑。 路徑中提供的任何文件夾都必須存在,以便模塊建立日誌文件。 使用下劃線分隔符,將時間戳、進程 ID 和文件擴展名 (.log) 添加到 stdoutLogFile 路徑的最後一段。 若是 .\logs\stdout 做爲值提供,則在示例 stdout 日誌使用進程 ID 1934 於 2018 年 2 月 5 日 19:41:32 保存時,將在 logs 文件夾中保存爲 stdout_20180205194132_1934.log。

aspnetcore-stdout

 ②設置環境變量

<aspNetCore processPath="dotnet"
      arguments=".\MyApp.dll"
      stdoutLogEnabled="false"
      stdoutLogFile="\\?\%home%\LogFiles\stdout">
  <environmentVariables>
    <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
    <environmentVariable name="CONFIG_DIR" value="f:\application_config" />
  </environmentVariables>
</aspNetCore>

ASPNETCORE_ENVIRONMENT:設置環境

CONFIG_DIR:用戶定義的環境變量的一個示例,其中開發人員已寫入可在啓動時讀取值的代碼以便造成用於加載應用配置文件的路徑

在不可訪問不受信任的網絡(如 Internet)的暫存服務器和測試服務器上,僅將 ASPNETCORE_ENVIRONMENT 環境變量設置爲 Development

 

3,app_offline.htm文件

將此文件放到程序根目錄(不是wwwroot下的目錄),存在 app_offline.htm 文件時,ASP.NET Core 模塊會經過發送回 app_offline.htm 文件的內容來響應請求。 刪除 app_offline.htm 文件後,下一個請求將啓動應用

 

2、CentOS7部署asp.net core

1,安裝Nginx

①添加Nginx存儲庫

要添加CentOS 7 EPEL倉庫,請打開終端並使用如下命令: sudo yum install epel-release 

若是出現如下錯誤:

解決方法,輸入一下兩個命令:

 yum clean all 

 yum makecache  

②安裝Nginx

如今Nginx存儲庫已經安裝在您的服務器上,使用如下yum命令安裝Nginx : sudo yum install nginx 

在對提示回答yes後,Nginx將在服務器上完成安裝

③啓動Nginx

Nginx不會自行啓動。要運行Nginx,請輸入: sudo systemctl start nginx 

若是您正在運行防火牆,請運行如下命令以容許HTTP和HTTPS通訊:

sudo firewall-cmd --permanent --zone=public --add-service=http 
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload

④若是想在系統啓動時啓用Nginx。請輸入如下命令:

 sudo systemctl enable nginx 

其餘命令:

systemctl disable nginx   #禁止開機啓動
systemctl status nginx     #查看運行狀態
systemctl restart nginx    #重啓服務

 nginx -s reload 重啓nginx

 

2,安裝asp.net core運行時 

https://www.microsoft.com/net/download/linux-package-manager/centos/runtime-current

 

3,配置nginx設置反向代理

①修改配置文件 /etc/nginx/nginx.conf 

server {
    listen 8054;
    location / {
        proxy_pass http://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;
    }
}

修改完成以後執行 nginx -s reload 重啓nginx

②因爲SELinux保護機制所致使,咱們須要將Nginx添加至SELinux的白名單,須要執行命令

yum install policycoreutils-python

sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx

sudo semodule -i mynginx.pp

③啓動

第一步 dotnet <項目程序集dll> 

第二步訪問http://ip:8054就能夠訪問到網站了

 

4,Supervisor配置守護進程

使用Supervisor首先咱們的asp.net core項目進程,實時監控進程狀態,異常退出時能自動重啓

①安裝Supervisor

 yum install python-setuptools 

 easy_install supervisor 請更換root用戶,執行以下命令安裝Supervisor:

②配置Supervisor

運行supervisord服務的時候,須要指定Supervisor配置文件,若是沒有顯示指定,默認會從如下目錄中加載:

$CWD/supervisord.conf  #$CWD表示運行supervisord程序的目錄
$CWD/etc/supervisord.conf
/etc/supervisord.conf
/etc/supervisor/supervisord.conf (since Supervisor 3.3.0)
../etc/supervisord.conf (Relative to the executable)
../supervisord.conf (Relative to the executable)

因此先要建立一個supervisor目錄 mkdir /etc/supervisor 

③加載目錄有了,而後經過echo_supervisord_conf程序(用來生成初始配置文件)來初始化一個配置文件: echo_supervisord_conf > /etc/supervisor/supervisord.conf 

④打開supervisord.conf文件,須要修改底部的配置,改成:

[include]
files = conf.d/*.conf

把註釋去除、設置/etc/supervisor/conf.d爲Supervisor進程配置文件加載目錄

⑥建立進程配置加載目錄: mkdir /etc/supervisor/conf.d 

⑦在 /etc/supervisor/conf.d 目錄下建立一個 netcore.conf 文件

⑧配置netcore.conf 文件

[program:SignalRDemo]                        ;自定義進程名稱
command=dotnet SignalRDemo.dll               ;程序啓動命令
directory=/usr/share/nginx/publish              ;命令執行的目錄
autostart=true                                  ;在Supervisord啓動時,程序是否啓動
autorestart=true                                ;程序退出後自動重啓
startretries=5                                  ;啓動失敗自動重試次數,默認是3
startsecs=1                                     ;自動重啓間隔
user=root                                       ;設置啓動進程的用戶,默認是root
priority=999                                    ;進程啓動優先級,默認999,值小的優先啓動
stderr_logfile=/var/log/SignalRDemo.log  ;標準錯誤日誌
stdout_logfile=/var/log/SignalRDemo.log  ;標準輸出日誌
environment=ASPNETCORE_ENVIRONMENT=Production   ;進程環境變量
stopsignal=INT                                  ;請求中止時用來殺死程序的信號

⑨啓動Supervisor服務,命令以下: supervisord -c /etc/supervisor/supervisord.conf 

這時,在會發現咱們部署的網站程序不在shell中經過dotnet xxx.dll啓動,一樣能夠訪問。

⑩設置Supervisor開機啓動

第一步:在 /usr/lib/systemd/system/ 目錄下建立 supervisor.service 文件

supervisor.service 文件內容以下:

# supervisord service for systemd (CentOS 7.0+)
# by ET-CS (https://github.com/ET-CS)
[Unit]
Description=Supervisor daemon

[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

第二步:設置開機啓動: systemctl enable supervisor 

第三部:驗證是否成功: systemctl is-enabled supervisor 

若是輸出enabled則表示設置成功,也可重啓服務器驗證。

 

5,Supervisorctl管理進程

進入supervisorctl交互終端: supervisorctl 

輸入help查詢幫助:

 

問題:1,"unix:///tmp/supervisor.sock no such file" 錯誤處理

 

 6,Supervisorctl錯誤

Error: Another program is already listening on a port that one of our HTTP servers is configured to use.  Shut this program down first before starting supervisord.

StackOverflow  http://serverfault.com/questions/114477/supervisor-http-server-port-issue

 

 

sudo unlink /tmp/supervisor.sock

sudo unlink /var/run/supervisor.sock

This .sock file is defined in /etc/supervisord.conf's [unix_http_server]'s file config value (default is /tmp/supervisor.sock or /var/run/supervisor.sock).

Hope this helps someone in the future.

 

 

6,nginx代理signalR站點

編輯/etc/nginx/nginx.conf文件

  map $http_upgrade $connection_upgrade{
        default upgrade;
        ‘’ close;
    } 
 server {
    listen 8054;
    location / {
        proxy_pass http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
相關文章
相關標籤/搜索