历程2个多月的学习,我终于从PHP转.Net开发了。

从壹开始前后端分离【 .NETCore2.1 +Vue 2 +AOP+DI】框架

感谢老张的博客,我对asp.net core入门主要就是靠他的博客了,这里再说一次,微软的文档真的太难看了!

虽然网上已经有很多关于asp.net core在linux下的部署教程了,但我还是想写一篇,主要增强我自己的记忆,同时分享下我部署遇到的坑。

搭建的环境为Centos7 + .net core  + nginx + mysql5.7,我的网站是asp.net core后端,vue前端,数据据mysql;

第一次搭建时遇到不少的坑,我会在下面也说到

前提,你有一台可以联网,有root账号密码,有开通ssh的服务器(一般centos7安装默认都有开通了)

安装donet运行环境

用root登录服务器后,第一步就是安装dotnet运行库了

打开https://dotnet.microsoft.com/download,我写这篇博客时,还是net core2.2,3.0预览版也出了,不知到时会不会有什么变动。

只运行,不开发,只需安装runtime运行库。

选择Centos,然后运行以下红圈的命令,我没运行yum update,感觉没什么影响。

然后输入命令 dotnet --info,可看是否有运行库

恭喜你,已经安装成功了

然后把你的asp.net core发布后的文件上传到服务器上,我用的是WinSCP上传软件,用你的root账号密码登录,协议为SFTP

我上传到/var/www/dotnet,建议上传到/var目录,一开始我上传到root目录,后面会出现一些访问权限的问题

然后在linux中切换到.net目录上,cd /var/www/dotnet,然后运行dotnet xxxx.dll

请注意,要需分大小写!要需分大小写!要需分大小写!一开始我没注意大小写,结果一直提示要装sdk,害我以为不能只装runtimes,害我查了好多资料

dotnet xxxx.dll //一定要注意大小写  

出现以上画面,你就成功了,如果有误,你先在你本地window下dotnet  xxx.dll看看有没有错误,一般在你本地上没问题,在服务器也是没问题的。

对了,第一次运行时还出现什么XML的提示,不太懂,第二次运行就没有了。

请注意,现在外网还不能访问你的5000端口的,为什么?

第一,看我上面的listening on http://localhost:5000,我这个dotnet默认只监听本地的5000端口,所以外网无法访问,解决方法就是在命令后面加上参数urls

dotnet xxxx.dll --urls http://*:5000 

第二 Centos的防火墙默认是开启的,所以端口还得把防火墙关了,或在防火墙里添加个端口

//以下操作二选一
systemctl status firewalld // 查看防火墙状态
systemctl stop firewalld //关闭防火墙
firewall-cmd --zone=public --add-port=5000/tcp --permanent // permanent参数是永远存在,不然的话,重启后就没有了
firewall-cmd --reload // 重启防火墙 ,添加端口后记得执行此命令

一般来说,现在就你可以通过外网地址加5000的端口访问你的网站了。

安装Nginx

https://www.cnblogs.com/songxingzhu/p/8568432.html

我主要是参考这个博客,用的是yum安装,非常简单,网上有其它很多rpm的安装方法,比较麻烦,对于这个yum跟rpm的关系,我理解yum是网上应用商城,rpm是本地的软件管理系统。而yum如果找不到你需要的包的话,你可以通过给yum增加安装源(意思就是增加一个提供软件包的地址,让yum可以通过这个地址去获取软件包),下面第一条命令rpm xxxx的作用就是在/etc/yum/repo.d里面增加一个repo文件。

//以下第一句是给你的centos安装一个yum源,因为nginx没有yum的源,我的理解就是nginx没在yum的应用商城上发布
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install -y nginx //这句才是真正的安装nginx
systemctl start nginx //启动nginx,就是这么简单
systemctl enable nginx //将nginx设为开机启动

有没感觉这个跟安装net core运行库差不多,先rpm再yum。

现在用下你外网的地址访问下,nginx默认有开启一个80端口的服务了,如下图,(记得把防火墙关了或添加一个开放80的端口)

接下来把我的vue网站上传服务器上,我放在/var/www/vue 目录下,建议不要放在root下面,会涉及一些权限问题,还有SElinux记得关了(到/etc/selinux/config把SELINUX=enforcing改成SELINUX=disable,然后重启),不然很容易导致403错误,还有一些莫名奇妙的问题。

(如果你确实不想关SElinux的话,可以看我另一篇博客 Linux开启SELinux的情况下怎么解决nginx403跟502错误

然后在linux上切换到nginx的配置目录

cd /etc/nginx

如上图所示,nginx.conf是主配置文件,打开这个文件,下面有一句include /etc/nginx/conf.d*.conf,说明还有一些配置在conf.d目录里面,而我们主要要设置的都在conf.d里面

进到conf.d目录里,看到里面就一个default.conf文件

vi default.conf  //用vi编辑default.conf文件

如下图所示,主要把80端口改成1001端口,把 / 对应的网站目录改成vue的目录,匹配 /api 跟 /swagger 转发到 http://localhost:5000,就是我dotnet的网站

保存后,记得nginx -t,检查一下,比如我上图中proxy_pass中有一个字符打错了,它就会提示

然后重启下nginx

nginx -s reload  //重启nginx

然后用外网加端口1001访问一下,发现弹出错误了,这个错误窗口是我vue前端页面里面弹出了,也说明了进行我的vue网站了,这个错误是后端接口没有开启。

切换到dotnet 目录,dotnet xxx.dll 运行起来,再刷新一下,又弹出错误了,错误跟上次不同,说明成功访问我后端接口了,只是现在mysql还没装。

安装Mysql

安装的步骤跟安装nginx差不多,

到这里http://repo.mysql.com/找相关的rpm包,要用yum安装的话,找名称后面带noarch的,里面有好多rpm包,同个版本还分什么el、fc,这个我不太懂,但网上我看别人都是装el,那我就选个el7-11的,如下图

先切换到家目录 cd ~,先下载上面的rpm包到本地

wget http://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm

你可以看到已经下载到你的家目录了

然后步骤就跟安装net core运行库、nginx差不多了,先rpm,再yum

rpm -ivh mysql57-community-release-el7-10.noarch.rpm  
//我发现也可以用 yum install -y mysql57-community-release-el7-10.noarch.rpm,yum一样有安装功能
yum install -y mysql-server  //这句才是安装mysql,-y是全程yes,不用提示
systemctl start mysqld  //启动mysql服务,注意,是mysqld,有个d
systemctl enable mysql //将mysql设为开机启动
这样Mysql数据库就已经安装好了,接下来还得进行Mysql的配置
grep password /var/log/mysqld.log //先查看数据库的初始密码,记得复制下来
mysql -u root -p //然后登录mysql,输入刚才查看到的初始密码
set password for 'root'@'localhost' = password('newPassword!');//登录后,先重置密码,mysql默认的密码策略有点复杂,要大小写数字,还要8位以上 //可以先操作以下命令关闭密码复杂策略,再修改密码,
show variables like 'validate_password%'; //查看mysql关于密码的配置
set global validate_password_policy=0; //将密码策略改成低级,就只检查长度,不强制要求大小写
set global validate_password_length=1; //将密码长度改成1位 //创建一个远程登录用户,因为我要在外网用navicat for mysql软件连接
grant all privileges on 数据库名.表名 to 创建的用户名 @"%" identified by "密码"; // 数据库名.表名 如果写成*.*代表授权所有的数据库,%代表可以从任何地址登录 如 grant all privileges on *.* to caijt@"%" identified by "123456";
//记得你asp.net core程序里是用什么账号密码访问mysql的,就得设置成什么。
以下为mysql的一些相关配置文件路径:
配置文件:/etc/my.cnf
日志文件:/var/log//var/log/mysqld.log
服务启动脚本:/usr/lib/systemd/system/mysqld.service
socket文件:/var/run/mysqld/mysqld.pid 我顺便把mysql的默认字符集设置为utf8

然后 systemctl restart mysqld重启一下mysql,登录mysql后用show variables like '%character%' 查看mysql的默认字符集

然后我就可以在我的电脑上用navicat for Mysql进行连接了,对了,记得把防火墙关了,或者给防火墙加个3306的端口

 

然后在Navicat for Mysql把数据库进行恢复下,这些都很容易操作了。

数据库弄好后,到dotnet目录下dotnet  xxx.dll运行asp.net core 程序,然后再刷新一下外网地址,发现页面出来了,登录访问,一切正常

发现有些附件上传会出错,发现是附件大小超过1M就上传不了,那可以到nginx配置文件进行配置一下

限制最大上传20m,然后重启下nginx

我本来一切都完美收厂时,我发现一个问题,我是用putty连接服务器,我把putty关了后,dotnet也就关了,其实在之前调试时,我也发觉这个dotnet得一直占用窗口很不方便,想用别的命令时,还得把ctrl+c停下来后再打命令,那么有什么办法能把dotnet也变成一个像mysql,nginx一样的后台服务呢。

有两种方法可以解决

第一种:

微软官方提供的https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-2.2#monitor-the-app,把dotnet创建成一个服务,就可以用systemctl来管理了

[Unit]
Description=ItSysService [Service]
WorkingDirectory=/var/www/dotnet
ExecStart=/usr/bin/dotnet /var/www/dotnet/ItSys.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

以上是我写的服务,保存在/etc/systemd/system/itsys.service,然后通过systemctl管理

systemctl enable itsys.service //设置为开机启动
systemctl start itsys.service //开启服务

第二种:

https://my.oschina.net/lichaoqiang/blog/1861791

参考以上博客,用Supervisor守护进程,这也是之前微软官方推荐的

然后把服务器相关的端口添加到防火墙,再启动防火墙。

好了。终于完美收工了。

又一篇Centos7下的asp.net core部署教程的更多相关文章

  1. CentOS7下让Asp.Net Core的网站自动运行

    一.安装Nginx yum install nginx 二.配置Nginx vi /etc/nginx/nginx.conf location / { proxy_pass http://127.0. ...

  2. 在Mac下创建ASP.NET Core Web API

    在Mac下创建ASP.NET Core Web API 这系列文章是参考了.NET Core文档和源码,可能有人要问,直接看官方的英文文档不就可以了吗,为什么还要写这些文章呢? 原因如下: 官方文档涉 ...

  3. 在Linux(Ubuntu)下搭建ASP.NET Core环境并运行 继续跨平台

    最新教程:http://www.cnblogs.com/linezero/p/aspnetcoreubuntu.html 无需安装mono,在Linux(Ubuntu)下搭建ASP.NET Core环 ...

  4. Windows下构建ASP.NET Core+Code First+Docker

    背景介绍 本文将会示范如何在Windows系统下基于ASP.NET Core构建跨平台服务,并通过Docker容器运行发布. 首先说一下为什么选择这一套组合: 我本人和我们Code4Thought团队 ...

  5. 在Mac下运行ASP.NET Core应用程序

    在Mac下运行ASP.NET Core应用程序 通过参照.NET Core相关官方文档,在我的Mac电脑上用Visual Studio Code创建了我的第一个ASP.NET应用. 开发环境搭建 首先 ...

  6. Mac下运行ASP.NET Core应用程序

    Mac下运行ASP.NET Core应用程序 在Mac下运行ASP.NET Core应用程序 通过参照.NET Core相关官方文档,在我的Mac电脑上用Visual Studio Code创建了我的 ...

  7. 10分钟学会在windows/Linux下设置ASP.Net Core开发环境并部署应用

    创建和开发ASP.NET Core应用可以有二种方式:最简单的方式是通过Visual Studio 2017 来创建,其优点是简单方便,但需要安装最新版本Visual Studio 2017 prev ...

  8. ubuntu下发布asp.net core并用nginx代理之旅

    asp.net core 1.0.1发布已有些日子了,怀着好奇的心情体验了把ubuntu下的asp.net core 系统运行环境:ubuntu 16.0.4 for developer 首先搭建.n ...

  9. Mac下开发ASP.NET Core应用,我用FineUICore!

    在 Mac 下开发 ASP.NET Core 2.0+ 应用,我用FineUICore! FineUICore:企业级 ASP.NET 控件库,10年持续更新,只为你来:http://fineui.c ...

随机推荐

  1. java Map集合对比分析

    1.Map:Map是所有map集合的顶级父接口,用于key/value形式的键值对,其中每一个key都映射到一个值,key不能重复. 2.TreeMap:该map将存储的键值对进行默认排序,并且还能够 ...

  2. java代码 猜数字小游戏

    import java.util.Scanner; import java.util.Random; public class mulTip{ public static void main(Stri ...

  3. sys.argv的妙用:python命令行参数列表的修改、增加、删除

    是否妙用取决于你怎么用 1.sys.argv是用来获取命令行参数的方法,本身是一个list.你搜其实用方法,这方面的介绍最多,这里不赘述 2.那么问题是:sys.argv可以赋值吗?可以扩充吗?可以修 ...

  4. Meteor软件包管理

    Meteor 提供数千种开发应用程序,您可以使用社区包. 添加软件包 您可以查看Meteor官方包服务器: 点击这里. 只搜索你需要的包,并在命令提示符窗口中添加它. 例如,想使用 http 包添加到 ...

  5. Deepin-安装php

    点击即可:下载:PHP5.6 下载完后执行下面这条shell命令即可完成安装 文件保存为:php_install.sh ,运行时:sh php_install.sh .tar.bz2 cd php- ...

  6. UI 07 _ 导航视图控制器 与 属性传值

    首先, 先创建三个VC. 完毕点击按钮, 进入下一页, 并可以返回. 要先把导航视图控制器创建出来. 在AppDelegate.m 文件里代码例如以下: #import "AppDelega ...

  7. Highcharts:X轴分组堆叠图

    在设计一个项目中的数据展示页面时.想要设计双X轴,一个轴显示须要的项.一个轴对这些项进行分组.效果如图: Highcharts自带双X轴展示方式.可是效果不是太理想.调整起来也会麻烦些 看到Highc ...

  8. C# LINQ Unity 单例

    C# LINQ   1. 自定义 Master,Kongfu 类 1 class Master 2 { 3 4 public int Id { get; set; } 5 public string ...

  9. jQuery选择器特殊字符与属性空格问题

    一.选择器中含有特殊符号的注意事项 1.选择器中含有“.”.“#”.“(”或“]”等特殊字符 根据W3C的规定,属性值中是不能含有这些特殊字符的,但在实际项目中偶尔会遇到表达式中含有“#”和“.”等特 ...

  10. 解决CentOS java环境不生效的问题

    查看当前java版本 [root@localhost jdk1.6.0_45]# java -version openjdk version "1.8.0_65" OpenJDK ...