ASP.NET Core 一步步搭建个人网站(7)_Linux系统移植

摘要

考虑我们为什么要选择.NET Core?
因为它面向的是高性能服务器开发,抛却了 AspNet 的臃肿组件,非常轻量,加上微软的跨平台战略,对 Docker 的亲和性,对于开发人员也非常友好,所以整体环境来说是健康发展的,未来技术决策时 .Net Core 也有很大的优势。那既然.NET Core 本身具有跨平台 (Windows、Mac OSX、Linux) 特性,而之前我们的网站一直是部署在 Windows Server 服务器上,这个章节我们不妨学习在生产环境下,怎么将我们的网站应用程序切换部署在Linux系统上。

环境说明

  • CentOS / 7.1 (64bit) (Linux操作系统)
  • MySQL5.7(网站应用数据库)
  • .NET Core SDK 2.0.0(网站应用环境)
  • Nginx(反向代理服务器)
  • Supervisor(管理网站应用守护进程)
  • Symantec SSL(域名型证书,提供https协议服务)

这里数据库由SQL Server改为MySQL,因为SQL Server 2017对运行环境要求的配置比较高,我这1G内存的低端云服务器伤不起,o(╥﹏╥)o

工具介绍

  • Xshell 5(终端模拟软件)
  • WinSCP(图形化SFTP客户端)

安装 Centos

首先将云服务器,重新安装操作系统,选择CentOS / 7.1 x86_64 (64bit)版本的镜像,并设置访问用户名和密码,系统会帮我们自动安装好Centos系统。接下来我们配置一下Xshell和WinSCP,使得这2个工具能正常访问并管理操作系统,相关的配置和使用方法,请大家自行百度。
完成上述操作后,首先查看一下硬盘情况:

fdisk -l


发现我们的第二块磁盘云磁盘(/dev/vdb)并没有被加载。
在挂载之前,首先要格式化这块硬盘。我们选择的是ext4格式:

mkfs.ext4 /dev/vdb

硬盘格式化后,创建一个挂载目标目录,并将磁盘挂载该目录上:

mkdir /data
mount /dev/vdb /data

这时候,我们再查看下系统磁盘情况:

df -h


可以看到,云磁盘可以正常的被挂载了。但是如果重启系统的话,磁盘仍旧会丢失,我们还必须在每次启动的时候将磁盘挂载。
修改/etc/fstab文件,需要在该文件的最后添加一行,具体如下:

至此,我们重启系统,发现磁盘可以正常挂载使用了。

安装 .NET Core

参考官方文档:Prerequisites for .NET Core on Linux
第1步,注册Microsoft签名密钥,然后添加Microsoft产品Feed:

sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
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'

第2步,更新可用于安装的产品列表,安装.NET Core所需的组件,然后安装.NET Core SDK:

sudo yum update
sudo yum install libunwind libicu
sudo yum install dotnet-sdk-2.0.0

第3步,设置环境变量:

export PATH=$PATH:$HOME/dotnet

以上,.NET Core环境已配置完成,可以新建一个项目HelloWorld,执行命令:dotnet run,正常运行,并使用localhost:5000正常访问,这里就不再多述。

安装 MySQL

第1步,下载MySQL Yum仓库的RPM安装包:
在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo/yum/
第2步,安装MySQL RPM安装包:

yum localinstall mysql57-community-release-el7-11.noarch.rpm

第3步,安装MySQL服务器:

yum install mysql-community-server

安装完毕后,我们启动MySQL,并查看运行状态,并设置开机启动:

service mysqld start
service mysqld status
systemctl enable mysqld


mysql安装完成之后,在/var/log/mysqld.log文件中给root生成了一个默认密码。通过下面的方式找到root默认密码:

grep 'temporary password' /var/log/mysqld.log

我们获取了默认密码,就可以进行一些安全设置,输入命令:

mysql_secure_installation

最后设置远程访问权限:

mysql -u root -p mysql
mysql> grant all privileges on *.* to 'root'@'%' identified by 'password' with grant option;

默认情况,MySQL的字符集为lanti,考虑我们使用中文的习惯,修改mysql配置文件/etc/my.cnf,增加如下一行,把默认的字符集改成utf8:

[mysqld]
character-set-server=utf8

程序移植

因为.NET Core本身就是支持跨平台,所以程序逻辑不用进行任何调整,但是我们已将数据库切换成MySQL,所以针对这块,稍微调整下。
首先,将appsettings.json中的数据库连接字符串修改为新的连接;
然后,Startup.cs文件启动配置修改如下:

services.AddDbContext<ApplicationDbContext>(options =>
    options.UseMySQL(Configuration.GetConnectionString("DefaultConnection")));

重新编译发布到目录:/data/wwwroot/MyWebSite
进入该目录,执行:

dotnet MyWebSite.dll


现在我们的项目就正常的部署并运行在localhost:5000上了。

安装 Nginx

Nginx是一个高性能的HTTP和反向代理服务器,在Centos中很容易安装和配置,接下来进行如下操作:

yum install nginx

安装完成后,我们启动Nginx,并将它设置为开机启动:

service nginx start
systemctl enable nginx.service

要使得Nginx代理外网80端口,访问我们内部5000端口监听的网站程序,需要修改Nginx配置文件/etc/nginx/nginx.conf:

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;
}

最后,我们重新启动restart nginx.service,并通过外网链接,发现可以正常访问我们的网站了。

安装 Supervisor

其实,经过以上的步骤,已经完成基本的移植和部署,网站访问也没有问题了。但是,.NET Core应用程序运行在shell之中,如果shell关闭,.NET Core应用程序也随之关闭,导致应用无法访问。而且.NET Core进程意外终止或者服务器宕机或重启,都会导致服务不可用,这是我们不想看到的。
为了解决这个问题,我们需要有一个守护进程来监听ASP.NET Core 应用程序的状况,在应用程序停止运行的时候立即重新启动。
这里利用Supervisor工具帮我们创建这样的守护进程,先安装:

easy_install supervisor

安装完毕后,如下操作

mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf

修改supervisord.conf文件,将文件尾部的配置修改:

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

再创建一个/etc/supervisor/conf.d/ MyWebSite.conf文件,内容大致如下:

[program:MyWebSite]
command=dotnet .dll ; 运行程序的命令
directory=/data/wwwroot/MyWebSite/ ; 命令执行的目录
autorestart=true ; 程序意外退出是否自动重启
stderr_logfile=/var/log/MyWebSite.err.log ; 错误日志文件
stdout_logfile=/var/log/MyWebSite.out.log ; 输出日志文件
environment=ASPNETCORE_ENVIRONMENT=Production ; 进程环境变量
user=root ; 进程执行的用户身份
stopsignal=INT

运行supervisord,查看是否生效:

supervisord -c /etc/supervisor/supervisord.conf
ps -ef | grep MyWebSite


最后,我们要配置Supervisor开机启动,新建一个“/usr/lib/systemd/system/supervisord.service”文件

# dservice 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 shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target

执行命令,使得服务开机启动:

systemctl enable supervisord

配置 https 协议

为了实现数据信息在客户端和服务器之间的加密传输,防止数据信息的泄露,保证双方传递信息的安全性,我们需要HTTP下加入SSL层,我之前已经申请过Symantec免费的SSL证书,所以就简单说明一下怎么配置。
前面我们的网站应用程序,已经通过Nginx反向代理来访问,那其实只用通过配置Nginx来管理我们申请的证书文件。首先下载证书文件,包括.crt和.key两个文件,然后拷贝到目录:/etc/nginx/ssl下,接着编辑Nginx配置文件,找到相关地方做如下修改:

listen       80 default_server;
listen       [::]:80 default_server;
listen       443 ssl;    #如果硬性要求全部走https协议,这里去除ssl
server_name  _;
root         /usr/share/nginx/html;

#ssl on;   #如果硬性要求全部走https协议,这里开启ssl on
ssl_certificate /etc/nginx/ssl/www.lancel0t.cn.crt;
ssl_certificate_key /etc/nginx/ssl/www.lancel0t.cn.key;  

ssl_session_cache    shared:SSL:1m;
ssl_session_timeout  5m;  

ssl_protocols  SSLv2 SSLv3 TLSv1.2;   

ssl_ciphers  HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers  on;  

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

最后,我们重启一下Nginx,输入我们的网站地址:https://www.lancel0t.cn/,看到能够正常访问。

至此,网站应用程序移植到Linux环境中完美完成!当然,实施的过程中笔者也踩过不少的坑,这里希望能抛砖引玉,有什么问题欢迎给我博客留言,一起讨论。

原文地址:https://www.cnblogs.com/lizzie-xhu/p/8572616.html

时间: 2024-07-31 03:52:44

ASP.NET Core 一步步搭建个人网站(7)_Linux系统移植的相关文章

ASP.NET Core 一步步搭建个人网站(1)_环境搭建

阅读目录 一.部署环境 1.SQL Server安装与配置 2.服务器防火墙配置 3.测试远程访问数据库 4. IIS环境和.NET Core Windows Server Hosting配置 二. 创建Asp.net Core Web项目 三.发布网站到服务器 相关资源 在线演示 GitHub源码 欢迎大家前往我的个人博客,获取更好的阅读体验和更多分享文章~ ASP.NET Core2.0发布有一阵子了,这是.NET 开源跨平台的一个重大里程碑, 也意味着比1.0版本要更加成熟.目前.net

[ASP.NET Core 3框架揭秘] Options[7]: 与配置系统的整合

Options模型本身与配置系统完全没有关系,但是配置在大部分情况下会作为绑定Options对象的数据源,所以有必要将两者结合在一起.与<扩展与定制>演示的两个例子一样,针对配置系统的集成同样是通过定制Options模型相应的对象来实现的.具体来说,集成配置系统需要解决如下两个问题: 将承载配置数据的IConfiguration对象绑定为Options对象. 自动感知配置数据的变化. 第一个问题涉及针对Options对象的初始化问题,这自然是通过自定义IConfigureOptions<

[目录] ASP.Net Core 微服务搭建网站

我有一个心愿,可以用最优化的代码完成一个功能丰富的网站. 全文将围绕(1)设计模式  (2)敏捷开发 目的: 结构足够合理,代码足够优美,扩展性.可读性.易维护性做到最优. 以下目录仅为整体思路,后期逐渐完善补充. 1.配置linux环境实现持续集成 2.快速搭建 ASP.net core Web 应用 3.单元测试 4.数据库配置管理 5.服务注册中心 6.网站登录页面 7.用户管理 8.角色管理 9.租户(组织单位)管理(Saas) 10.模块管理 11.菜单(导航)管理 12.主题配置 1

vs2017rc asp.net core mvc angular2 搭建

原文地址: https://blogs.msdn.microsoft.com/webdev/2017/02/14/building-single-page-applications-on-asp-net-core-with-javascriptservices/ 1. 打开vs命令窗口运行下面命令 dotnet new --install Microsoft.AspNetCore.SpaTemplates::* 2.要新建项目空文件夹运行 dotnet new angular 3.用vs打开项目

Asp.Net Core 空白模板搭建Mvc架构

一 创建一个空白Mvc二 手动创建Controllers.Models.Views三 注册MVC服务 public void ConfigureServices(IServiceCollection ServiceCollection) { ServiceCollection.AddMvc(); } 四 注册MVC中间件,并配置路由规则 public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (en

58HouseSearch项目迁移到asp.net core

前言 58HouseSearch这个项目原本是基于ASP.NET MVC 4写的,开发环境是Windows+VS2015,发布平台是linux+mono+jexus,这样看来整个项目基本已经满足跨平台的需求. 这样一来,本来我是没什么动力去做迁移的,好好的东西闲着没事干才迁移呢. 不过,这不国庆了么?穷人不是在家穷游天下么?所以…真的有点闲着没事干了. 迁移可行性探讨 项目迁移前,我们还是先来讨论一下迁移可行性.为嘛要进行可行性探讨呢?原因是.NET CORE是一个跨平台的框架,和上一代的.NE

docker中运行ASP.NET Core Web API

在docker中运行ASP.NET Core Web API应用程序 本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Core以及docker的基本概念,网上已经有很多文章对其进行介绍了,因此本文不会再详细讲解这些内容.对.NET Core和docker不了解的朋友,建议首先查阅与这些技术相关的文档,然后再阅读本文. 先决条件 要完成本文所介绍的演练任

在docker中运行ASP.NET Core Web API应用程序

本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Core以及docker的基本概念,网上已经有很多文章对其进行介绍了,因此本文不会再详细讲解这些内容.对.NET Core和docker不了解的朋友,建议首先查阅与这些技术相关的文档,然后再阅读本文. 先决条件 要完成本文所介绍的演练任务,需要准备以下环境: Visual Studio 2015,或者Vi

[ASP.NET Core 3框架揭秘] Options[4]: Options模型[下篇]

六.IOptionsMonitorCache<TOptions> IOptionsFactory<TOptions>解决了Options的创建与初始化问题,但由于它自身是无状态的,所以Options模型对Options对象实施缓存可以获得更好的性能.Options模型中针对Options对象的缓存由IOptionsMonitorCache<TOptions>对象来完成,如下所示的代码片段是该接口的定义. public interface IOptionsMonitorC