CentOS7上部署ASP.Net Core 2.2应用

前言

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

ASP.Net Core部署CentOS7的必备条件

  如果你的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的应用程序。但从性能角度来说“框架依赖”的性能更高。

  1. 使用Visutal Studio发布ASP.Net程序,选择中要发布的项目,右键-》选择发布。
  2. 进发布管理功能界面,可以参赛过“配置”按钮对发布参数进行调整。
  3. 如果要修改发布位置及发布模式,可以单击“配置”按钮。

    调整参数后,保存设置。

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

配置反向代理服务器

  在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”。

  1. 添加源
    sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
  2. 安装Nginx前,可以通过“yum search nginx”命令查看源是否已经添加成功。如果已经成功则执行以下命令。

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

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

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

    server {
        listen        80 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        80 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;
        }
    }
  5. 配置文件修改完成后,选择使用“nginx -t”命令验证配置文件是否正确。如果看到以下结果即代表配置文件修改正确。

  6. 启动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运行环境

  如果不需要在服务器上开发的话,是不需要安装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 <app_assembly.dll>“测试应用,看到以下信息即代表应用可正常启动。
  

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

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

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 37
--- 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 10
已放弃

防火墙配置及安全配置

  1. 配置防火墙,打开80端口,并应用配置。
    sudo firewall-cmd --zone=public --add-port=80/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://<serveraddress>: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 2016-10-18 04:09:35 NZDT; 35s ago
Main PID: 9021 (dotnet)
    CGroup: /system.slice/kestrel-helloapp.service
            └─9021 /usr/local/bin/dotnet /var/www/helloapp/helloapp.dll

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

 

 

posted @ 2019-02-21 16:05  安逸竹  阅读(1455)  评论(0编辑  收藏  举报