CentOS7上部署ASP.Net Core 2.2应用
阅读原文时间:2020年09月21日阅读:3

  在CentOS7上部署ASP.Net Core应用是我的技术路线验证的一部分,下一个产品计划采用ASP.Net Boilerplate Framework开发。因此需要求提前进行一下技术验证,在这次验证过程中采坑较多。所以决定对采坑过程做一个仔细记录,以便今后备查。

  如果你的CentOS7是最小安装模式安装的,那么在部署ASP.Net Core应用前,需要为CentOS7安装以下功能模块。

  1. Wget功能包

  2. Nginx服务

  3. yum功能包

  4. ASP.Net Core运行环境

  5. lsof功能包

      同时建议你最好准备一个FTP工具,这样在上传ASP.Net程序时比较方便。推荐使用Xshell+Xftp这套组件,可以方便实现SSH管理与文件上传功能。同时这套软件还对家庭及学校提供免费版本。

      应用发布可以使用DotNet SDK中的dotnet命令进行发布,也可以通过Visual Studio进行发布。在发布前先要了解发布中的两个发布的概念,“框架依赖”和“独立”。如果你部署的服务器上没有安装ASP.Net Core Runtime,那么你可以选择“独立模式”,如果已经部署了ASP.Net Core Runtime,使用“框架依赖”模式。“独立”模式就是打包了ASP.Net Core Runtime的应用程序。但从性能角度来说“框架依赖”的性能更高。

  6. 使用Visutal Studio发布ASP.Net程序,选择中要发布的项目,右键-》选择发布。

  7. 进发布管理功能界面,可以参赛过“配置”按钮对发布参数进行调整。

  8. 如果要修改发布位置及发布模式,可以单击“配置”按钮。

    调整参数后,保存设置。

  9. 配置确认后,即可发布应用了。

      在Linux上运行的ASP.Net Core应用是通过Kestrel服务器解析与处理的,但因为Kestrel服务器的安装性与重写功能都不是很完善。因此通常我们需要将Apache或Nginx配置为反向代理服务器来为Kestrel提供服务。这里需要补充一点Kestrel服务器是ASP.Net Core Runtime的一部分,并不需要单独安装。这里也要说一下,使用反向代理服务器的好处。 反向代理服务器可以卸载 HTTP 服务器的工作负载,如提供静态内容、缓存请求、压缩请求和 HTTPS 终端。 反向代理服务器可能驻留在专用计算机上,也可能与 HTTP 服务器一起部署。如果只需要反向代理服务,推荐使用Nginx作为反向代理服务器。Nginx本身就是为反向代理服务而开发的,其实代理性能及资源消耗上都比Apache小得多。如果你的服务器资源比较紧张,那么Nginx是不二的选择。但如果你面要在服务器上提供PHP服务的话,那么还是使用Apache服务器更好一点。Apache对于PHP支持更简单一些。

      在CentOS7上安装Nginx有两种方法,一种是使用yum进行安装,别一种是从官方下载Nginx服务器压缩包,手动安装。推荐使用yum进行安装,但CentOS7本身的资料库中是没有Nginx服务器包的,因此如果你需要在CentOS7上部署Nginx的话,更新服务器上的yum源。最近Nginx官方yum源“http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm”。

  10. 添加源

    sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

  11. 安装Nginx前,可以通过“yum search nginx”命令查看源是否已经添加成功。如果已经成功则执行以下命令。

    sudo yum install -y nginx

  12. Nginx安装成功后需要先修改nginx.conf & default.conf配置文件才能保证Nginx可正确启动。可以对通过“vim /etc/nginx/nginx.conf”命令来打开文件。

    注:使用“I”启动“插入”模式,修改完成后使用“:wq”命令进行保存。

  13. 使用“vim /etc/nginx/conf.d/default.conf”命令打开默认配置文件,使用以下内容替换文件全部内容。

    server {
    listen default_server;
    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;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }

    注:如果Nginx需要同时对Signalr进行WebSockets代理的话,需要增加新的配置小节。

    server {
    listen default_server;
    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;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /signalr {  
        proxy\_pass         http://localhost:5000;  
        proxy\_http\_version 1.1;  
        proxy\_set\_header   Upgrade $http\_upgrade;  
        proxy\_set\_header   Connection upgrade;  
        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;  
    }  

    }

  14. 配置文件修改完成后,选择使用“nginx -t”命令验证配置文件是否正确。如果看到以下结果即代表配置文件修改正确。

  15. 启动Nginx并设置开机自动运行

    sudo systemctl start nginx.service
    sudo systemctl enable nginx.service

    注:如果在启动Nginx过程中出现端口占用问题,可以先使用“lsof -i :80"命令查看占用端口的应用,然后通过”kill [pid]“命令杀掉相应的进程。然后再重新启动Nginx。如果遇到”找不到nginx.pid“的问题,可通过在/etc/nginx/目录下运行nginx即可。

      如果不需要在服务器上开发的话,是不需要安装ASP.Net Core SDK的,只需要安装ASP.Net Core Runtime即可。当前最新的发布版本是.Net Core 2.2,下载地址:https://dotnet.microsoft.com/download/dotnet-core/2.2。
      

      选择Linux版本的完整包选项后,再选择CentOS对应的版本。

      

      按照说明执行即可,执行过程中询问过程时选择”y“。

      在这时就要用到一开始提到的FTP工具,通常应用都部署以/var目录中。在var目录中新建/www/cdpmapp/目录 ,并使用FTP将本地发布的应用上传至此处。

      

      文件上传完成后,在应用程序目录中运行”dotnet “测试应用,看到以下信息即代表应用可正常启动。
      

      测试应用完成后,请在命令提示符处按Ctrl+C关闭应用。

      注:dotnet 这条命令一定要在应用程序所在的目录中运行,否则你就会看到以下的错误:  

Unhandled Exception: System.ArgumentNullException: Value cannot be null.
Parameter name: value
at System.Boolean.Parse(String value)
at MobileWorkOrder.Web.Startup.AuthConfigurer.Configure(IServiceCollection services, IConfiguration configuration)
at MobileWorkOrder.Web.Startup.Startup.ConfigureServices(IServiceCollection services) in C:\My Project\WorkOrder\aspnet-core\src\WorkOrder.Web.Mvc\Startup\Startup.cs:line
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Hosting.ConventionBasedStartup.ConfigureServices(IServiceCollection services)
at Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureApplicationServices()
at Microsoft.AspNetCore.Hosting.Internal.WebHost.Initialize()
at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
at MobileWorkOrder.Web.Startup.Program.Main(String[] args) in C:\My Project\WorkOrder\aspnet-core\src\WorkOrder.Web.Mvc\Startup\Program.cs:line
已放弃

  1. 配置防火墙,打开80端口,并应用配置。

    sudo firewall-cmd --zone=public --add-port=/tcp --permanent
    sudo systemctl restart firewalld

  2. 关闭SELinux ,使用getenforce 查询

    临时关闭(不用重启机器):

          setenforce 0 ##设置SELinux 成为permissive模式

          ##setenforce 1 设置SELinux 成为enforcing模式

        修改配置文件需要重启机器:

          修改/etc/selinux/config 文件

          将SELINUX=enforcing改为SELINUX=disabled

          重启机器即可。

      服务器设置为将对 http://:80 发起的请求转接到在 http://127.0.0.1:5000 中的 Kestrel 上运行的 ASP.NET Core 应用。 但是,未将 Nginx 设置为管理 Kestrel 进程。 systemd 可用于创建服务文件以启动和监视基础 Web 应用。 systemd 是一个 init 系统,可以提供用于启动、停止和管理进程的许多强大的功能。

      建议在使得记录本或UltraEdit创建服务定义文件,以下是一个事例文件。  

[Unit]
Description=Example .NET Web API App running on Ubuntu

[Service]
WorkingDirectory=/var/www/cdpmapp
ExecStart=/usr/bin/dotnet /var/www/cdpmapp/cdpmapp.dll
Restart=always

Restart service after 10 seconds if the dotnet service crashes:

RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=root
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

  Linux 具有区分大小写的文件系统。 将 ASPNETCORE_ENVIRONMENT 设置为“生产”会导致搜索配置文件 appsettings.Production.json,而不是 appsettings.production.json。

  保存该文件并启用该服务

sudo systemctl enable kestrel-helloapp.service

  启用该服务,并确认它正在运行。

sudo systemctl start kestrel-helloapp.service
sudo systemctl status kestrel-helloapp.service

● kestrel-helloapp.service - Example .NET Web API App running on Ubuntu
Loaded: loaded (/etc/systemd/system/kestrel-helloapp.service; enabled)
Active: active (running) since Thu -- :: NZDT; 35s ago
Main PID: (dotnet)
CGroup: /system.slice/kestrel-helloapp.service
└─ /usr/local/bin/dotnet /var/www/helloapp/helloapp.dll

  在配置了反向代理并通过 systemd 管理 Kestrel 后,Web 应用现已完全配置,并能在本地计算机上的浏览器中从 http://localhost 进行访问。 也可以从远程计算机进行访问,同时限制可能进行阻止的任何防火墙。 检查响应标头,Server 标头显示由 Kestrel 所提供的 ASP.NET Core 应用。