一、准备工作
(一)创建一个测试程序
使用VS创建一个WebApi项目:
本地访问路径:http://localhost:5000/WeatherForecast
(二)将WebApi项目发布
发布后生成的文件
(三)下载远程操作工具
-
Xshell 使用 windows 远程连接 Linux 系统上
-
winscp 使用windows 远程上传文件到Linux上
二、阿里云服务器的配置
(一)购买阿里云服务器
- 直接在网上购买即可(可选择学生服务,会有优惠)阿里云学生地址
- 进入控制台,相当于查看所有的实例(其实控制台就相当于是总的管理器)
若没有实例,请先创建实例
远程连接时会使用实例用户与密码,可在下图位置进行设置
(二)安装 Ubuntu 的镜像
1.如果已经安装了其他的操作系统,可以重新更换操作系统。
自定义的密码就是后面用远程工具进行连接的,登录密码和登录名。
(三)安全组配置
安装组其实就是用来放行端口的。通俗来说就是管大门的。具体的可以参考这个文章::阿里云安全组详细解说
1. 常用的几个端口
- 3389端口:远程桌面的
- 20/21端口:FTP,上传下载文件的;文件传输的
- 22端口:ssh 安全登录
- 443: HTTPS 服务器
- 25:e-mail 的默认端口
- 3306端口:MySQL
- 1521: Oracle 数据库
- 6379: redis 数据库
- 8888:宝塔面板初试接口
- 80端口:一般做个人网站要配置的
- icmp用来ping的
2. 安装组的参数具体含义 - 优先级:从一到一百的数字,数字越小,优先级越高。
- 协议:自定义TCP就行了(具体是干啥的我不知道)
- 端口范围:这个一定要写个范围,哪怕是只有一个端口,也还是 80/80 这么写。
-
授权对象: 如果我们是想让所有的人都可以访问,那么就是默认的 0.0.0.0 / 0
一般配置这个的时候,都是选择公网入方向,进行配置。授权对象实际上是运行方位的 ip 地址,如果允许所有的人进行访问,就是 0.0.0.0/0 ,如果是多个用户的话,可以中间用 , 隔开。
3. 安全组和防火墙的区别 - 云防火墙可以根据机器学习结果,自动将安全域进行分组;而安全组完全依赖于您静态的手动划分。
- 云防火墙在访问控制策略生效之前,存在大量的模拟过程,可以帮助您保障策略的正确性;而安全组中规则在配置之后即刻生效,一旦访问规则配置错误可能直接导致业务中断。
- 在云防火墙中您可以监控高危端口的访问情况。例如,查看3306端口是否有来自外部(互联网)流量的访问。
- 云防火墙还可以帮助您进行服务器变更前的确认。例如,某个服务器需要下线时,您可以通过云防火墙查看该服务器是否仍有访问流量,从而判断服务器下线是否影响业务
(四)安装宝塔(不必须,但强烈建议)
宝塔可以让你通过浏览器可视化操作云服务器,允许你在一定程度上可以像使用windows一样使用Ubuntu系统
- 宝塔安装详见宝塔面板安装命令
-
安装成功后会有相关的网址与账号密码
-
使用外网地址登录到宝塔面板后台,第一次会自动弹出套件推荐安装对话框,选择安装“LNMP套件”
三、安装dotnet运行时
直接去微软官网查找,对应版本上的dotnet运行环境相关操作,此处的连接在unbuntu上安装.net core。直接在Xshell执行相应的命令行,复制粘贴就可以了。具体操作如下
1.使用 APT 进行安装可通过几个命令来完成。 安装 .NET 之前,请运行以下命令,将 Microsoft 包签名密钥添加到受信任密钥列表,并添加包存储库。在终端中,运行以下命令:
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
.NET SDK 使你可以通过 .NET 开发应用。 如果安装 .NET SDK,则无需安装相应的运行时。 若要安装 .NET SDK,请运行以下命令:
sudo apt-get update;
sudo apt-get install -y apt-transport-https &&
sudo apt-get update &&
sudo apt-get install -y dotnet-sdk-3.1
- 通过 ASP.NET Core 运行时,可以运行使用 .NET 开发且未提供运行时的应用。 以下命令将安装 ASP.NET Core 运行时,这是与 .NET 最兼容的运行时。 在终端中,运行以下命令:
sudo apt-get update; \
sudo apt-get install -y apt-transport-https && \
sudo apt-get update && \
sudo apt-get install -y aspnetcore-runtime-3.1
4.可以执行下边的命令,来运行一下试试,如果安装成功,会有反应,如果没有安装上,会提示错误
dotnet --info
四、使用WinSCP 传送文件
使用实例名称与密码将 WinScp 连接到云服务器,连接成功后,进入home 目录,普通用户都是在home 目录下进行操作,一般你也可以建立一个自己的文件夹,把东西都放在同一个文件夹里,我这里创建了demo文件夹。将左侧本地文件直接拖拽到右侧的demo文件夹中,就可完成文件上传到云服务器。
五、使用Xshell执行dotnet 命令
在项目文件目录下运行下面命令:
dotnet AliyunDemo.dll
发现 http://<云服务器公网IP>:<端口号> 在浏览器根本打不开网页,于是
netstat -tnl
查看端口5000是否正常
发现5000端口,只对本地127.0.0.1有效,当然我们客户端没法访问了,此时有两种方法可以云解决
-
修改WebApi项目中的 Programe.cs 文件
2.在运行命令中指定URL
dotnet AliyunDemo.dll --urls http://*:5000
注意:
若你进行了宝塔安装,且安装了“LNMP套件”,此时仍然打不开网页,原因是LNMP中的Nginx进行了路由,所以此时需要我们配置一下Nginx。
六、宝塔中配置Nginx
登录到宝塔,进入管理页面
此时再进行第五步,运行起项目,使用Nginx配置的端口80,就可以在浏览器中访问到了。
七、守护进程
完成上面步骤后,虽然可以访问了,但当Xshell关闭后,就不可以访问了。这是因为Xshell启动的项目是前台进程,我们需要让项目启动变动后台进程。
守护进程是安装一个类似于Windows Service一样的服务, 能实时监控程序状态,异常退出时能自动重启。Supervisor 是用Python开发的Linux/Unix系统下的一个进程管理工具。它可以使进程(类似Windows Service)脱离终端,变为后台守护进程(daemon)。能实时监控进程状态,异常退出时能自动重启。详细文档请查看官网。配置守护进程Supervisor, 让我们的程序能365天24小时不间断运行。
(一)安装Supervisor
- 安装可以使用一下命令:
sudo apt-get install supervisor
安装成功后,supervisor就会默认启动,有很多方法添加进程,看了很多博客上的介绍和加上我的实际使用,我认为一下方法最好用,将每个进程的配置文件单独拆分,放在/etc/supervisor/conf.d/目录下,以.conf作为扩展名,例如dotnetdemo.conf定义的一个简单的HTTP服务器
- 文件内容配置如下:
配置说明
[program:CoreWebTest] ;自定义进程名称, 根据自己喜好命名
command=dotnet CoreWebTest.dll ;程序启动命令 使用dotnet 命令
directory=/home/wwwroot/CoreWebTest ;命令执行的目录 你.NET Core 程序存放目录
autostart=true ;在Supervisord启动时,程序是否启动
autorestart=true ;程序退出后自动重启
startretries=5 ;启动失败自动重试次数,默认是3
startsecs=1 ;自动重启间隔
user=root ;设置启动进程的用户,默认是root
priority=999 ;进程启动优先级,默认999,值小的优先启动
stderr_logfile=/var/log/CoreWebTest.err.log ;标准错误日志 路径可以自定义
stdout_logfile=/var/log/CoreWebTest.out.log ;标准输出日志 路径可以自定义
environment=ASPNETCORE_ENVIRONMENT=Production ;进程环境变量
stopsignal=INT ;请求停止时用来杀死程序的信号
- 重启supervisor,让配置文件生效,然后启动CoreWebTest进程:
supervisorctl reload
supervisorctl start CoreWebTest
到此,就可以长久正常访问项目接口了。
supervisorctl 使用说明
supervisorctl start programxxx,启动某个进程
supervisorctl restart programxxx,重启某个进程
supervisorctl stop groupworker: ,重启所有属于名为groupworker这个分组的进程(start,restart同理)
supervisorctl stop all,停止全部进程,注:start、restart、stop都不会载入最新的配置文件。
supervisorctl reload,载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程。
supervisorctl update,根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启。
supervisor启动和停止的日志文件存放在/var/log/supervisor/supervisord.log
注意:显式用stop停止掉的进程,用reload或者update都不会自动重启