专题目录
国产化之路-统信UOS操作系统安装
国产化之路-国产操作系统安装.net core 3.1 sdk
国产化之路-安装WEB服务器
国产化之路-安装达梦DM8数据库
国产化之路-统信UOS + Nginx + Asp.Net MVC + EF Core 3.1 + 达梦DM8实现简单增删改查操作
前言
国产的操作系统一般都是基于Linux开发的,只是不同的操作系统使用的Linux版本有所差异,比如麒麟V10的操作系统是基于Ubantu16.4的,统信UOS ARM64专业版是基于Debian8.3的,当然还有服务器版本的,不管如何,对于我们开发者或维护人员来讲,站点的发布与维护管理最好能通过一个统一的集成环境,点击几下鼠标或做一些简单的配置即可完成,就像是Windows的IIS那样方便,那么在Linux的环境下是否有这样类似的环境呢?答案是肯定的,在国内用的比较广泛的是宝塔面板或类似宝塔面板的站点式的管理应用。宝塔面板是一款服务器管理软件,除了支持Linux系统也支持windows,通过它我们可以很轻松地管理服务器,提升运维效率,比如创建管理网站、FTP、数据库、拥有可视化文件管理器、可视化软件管理器、可视化CPU、内存、流量监控图表、计划任务等功能。可以访问官网了解更详细的介绍。
这里我们在统信UOS ARM64专业版操作系统下对宝塔面板进行安装,原先在麒麟V10操作系统环境下一直安装不成功,坑比较多,无奈之下改成了统信操作系统,对于麒麟V10操作系统环境下的安装计划等麒麟官网维护完成,官方的安装源可用后再作尝试。
安装宝塔
我们这里是参考宝塔官方论坛最新版本的安装方法,下面安装要求是直接引用论坛里边的:
安装要求:
内存:512M以上,推荐768M以上(纯面板约占系统60M内存)硬盘:300M以上可用硬盘空间(纯面板约占20M磁盘空间)
系统:CentOS 7.1+ (Ubuntu16.04+.、Debian9.0+),确保是干净的操作系统,没有安装过其它环境带的Apache/Nginx/php/MySQL/pgsql/gitlab/java(已有环境不可安装)
架构:x86_64(主流服务器均是此架构),ARM不完整兼容(面板环境安装慢,部分软件可能安装不上)宝塔Linux面板7.4.5版本是基于Centos开发的,为了最好的兼容性,请优先考虑使用Centos8.x系统
系统兼容性顺序:
Centos8.x > Centos7.x > Ubuntu18.04 > Debian10 > Ubuntu 20.04 > 其它系统
提示:Centos官方已宣布在2020年停止对Centos6的维护更新,各大软件开发商也逐渐停止对Centos6的兼容,新服务器不建议使用Centos6
我这边的架构属于ARM64,文档上提示“ARM不完整兼容”,心里还是有点担忧,统信的UOS是基于Debian8.3版本根据安装文档指引使用Debian安装命令
wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && bash install.sh
上面是询问将宝塔面板安装到www目录,直接打入“y”即可
屏幕上的文字不断翻滚,经过漫长的等待(大概10分钟左右)顺利安装成功了,因为之前的安装提示原本还是有些担心的。这里需要记下面板的访问地址和随机分配的账号密码,不然后面就抓瞎了。在浏览器上输入面板地址,出现了宝塔登录界面
在登录界面上直接输入随机分配的账号和密码进行登录
第一次进入会出现用户许可协议,直接勾选同意,点击“进入面板”。
这里会叫你选择安装软件套件,有两种方案选择:一个是LNMP方式、另一个是LAMP方式,感觉和咱们关系都不大,因为下一步要安装Nginx所以选择了“LNMP”,勾选了Nginx1.18和FTP,其他的暂时也没啥用(这些软件后面如有需要也可以安装),勾选完后安装方式默认选“急速安装”点击“一键安装”按钮,接着会弹出一个安装消息窗口,里边又开始飞快地滚动文字了。
趁着安装软件的间隙我们可以关闭这个消息窗口来熟悉一下宝塔面板的各项菜单(不用担心安装会中止,在后台会继续安装)。首页上显示负载、CPU使用率、内存使用率、硬盘使用情况等机器的当前状态,还是很直观方便的。
系统安全面板显示当前开放的端口,还可以对端口进行开关设置非常实用。
其中让我比较在意的是网站和文件这两个管理菜单,通过点击网站菜单可以进入网站管理页面(当前在安装Nginx暂时还进不去),里边提供了站点的创建和配置,非常方便。点击文件菜单进入文件管理页面,通过文件管理页面我们可以查看主机上的所有目录和文件,且可以创建、删除、修改目录、上传文件,这样就很方便了,我们可以在自己的开发机上编译项目代码,然后通过宝塔的文件上传功能把编译打包好的项目放到指定的目录中去,接着再通过网站管理功能再配置一番,这样咱们基本的站点管理功能就有了,想想还是美滋滋的。
在安装完成时还是比较在意这个账号和密码的,随机生成的不太好记,好在这个面板设置里边可以修改账号和密码,这个还比较贴心,另外宝塔默认访问的端口号是8888,为了安全起见建议修改一下,除了这些以外还有其他的一些可修改项,可以看一下。
然后,就是软件商店了,里边着实有不少应用,有收费的也有免费的,感觉免费的也已经够用了,当前的要求也不是很高,走马观花地稍微看一把。
其它的就不详细介绍了,官网上已经有详细的操作说明,根据自己的需要摸索吧!点击左上角IP地址边上的数字,可以直接弹出安装消息窗口,当前安装已经完成,就是安装Nginx花了不少的时间,将近有20分钟,接下来咱们试着发布一个站点试试。
发布站点
(1)点击“网站”菜单进入网站管理页面,然后点击“添加站点”按钮,弹出添加网站的配置窗口,如下图所示:
这里注意一下,域名是必输项,如果没有域名暂时随便输一个,但格式要正确。网站根目录默认是“/www/wwwroot/域名”,也可以自己修改,其他的随意,点击“递交”按钮就完成站点创建。
(2)在开发机中准备好待发布的网站项目,将项目先发布到本地文件系统。
(3)回到宝塔管理面板,点击左侧“文件”菜单进入文件管理页面,点击目录列表依次从目录www/wwwroot中找到我们新建AppDemo站点目录,并点击进入,如下截图所示:
站点创建完成会添加默认的404、index页面,不需要的话可以在文件管理页面中把这些文件删除,然后点击“上传”按钮,弹出上传文件窗口:
点击窗口左上角上传按钮(可以选择上传文件也可以上传目录,我们选择上传文件)将我们已准备好的本地发布版本的所有文件全选并拖拽到窗口中,然后点击“开始上传”。
(4)上传成功后点击宝塔面板中的“网站”菜单,在网站管理页面中选择我们创建的站点,点击“设置”链接,对我们的站点进行设置。
在站点修改窗口中选择“网站目录”,我们将运行目录选择为“/wwwroot”,我们发布的网站样式等都在这个子目录里边,如果不指定的话,显示会没有样式。
继续点击站点修改窗口左侧的“配置文件”项,会列出本站点的Nginx配置项,默认情况下使用的是80端口,server_name是我们之前创建站点时随便输入的域名,没有域名在这里我们把域名改成IP地址:
然后我们要做一个反向代理的配置,在配置文件中加入如下配置项:
# AppDemo
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,在宝塔面板中点击软件商店,在软件商店页面中点击“已安装”按钮,在已安装的软件列表中找到Nginx,点击“设置”,在弹出来的Nginx管理窗口中,点击“重启”按钮即可。
为了方便查找,可以在已安装的软件列表中将Nginx设置为首页显示,然后在首页上就可以找到它。
(5)通过终端运行已发布的网站(MvcExample是我这里已编译的网站dll)
dotnet MvcExample.dll
然后打开浏览器访问网站看看是否成功:
关于守护进程
我们的站点已发布成功,但这里有一个问题,我们在终端执行命令dotnet xxx.dll 运行 .NET Core 应用程序时,如果我们关闭终端结束会话,那么我们的程序也会结束运行,我们关闭终端再来浏览发布的站点看看:
如上图,页面显示“502 Bad Gateway”,这个不是我们想看到的,那如何才能当我们关闭终端结束会话后,站点仍然运行呢?这里就需要引进守护进程。
守护进程,英文名:“daemon",它是一个在后台运行并且不受任何终端控制的进程,不会随着会话结束而退出。我们使用Linux的命令可以实现守护进程,但是比较麻烦,即然咱们安装了宝塔面板,我们还是希望可以通过面板来配置就可以实现这个功能。在宝塔的软件商店中找到了两款守护进程的工具:supervisor和pm2。
supervisor
supervisor是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具。可以很方便的监听、启动、停止、重启一个或多个进程。用 supervisor管理的进程,当一个进程意外被杀死,supervisor监听到进程死后,会自动将它重启,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。
以上是摘自网络上对supervisor的介绍,我们可以通过宝塔面板中的软件商店找到它并安装:
安装完成后,在已安装的软件列表中找到supervisor管理器,点击设置会弹出Supervisor管理器窗口
然后点击右上角的“添加守护进程”
启动用户可以选择默认用户,运行目录选择你发布的站点目录,我这里是“/www/wwwroot/AppDemo”,启动命令“dotnet xxx.dll”,xxx.dll是站点名称,如果无法识别dotnet命令,则给出命令的完整路径,如:“/usr/local/dotnet/dotnet xxx.dll”,进程数就默认1,点击“确定”按钮完成守护进程的添加。
我们再次打开浏览器,站点又正常运行了,当前已经不再需要使用终端去运行“dotnet xxx.dll”了。
PM2
PM2(Process Manager 2 )是具有内置负载均衡器的Node.js应用程序的生产运行时和进程管理器。 它允许您永久保持应用程序活跃,无需停机即可重新加载它们,并促进常见的Devops任务。
以上介绍来自网络,pm2虽然是node进程管理工具,但作为进程管理工具.net core仍然适用,PM2需要node环境,但我们直接通过宝塔面板来安装可以省很多事情,在软件商店中找到他,直接点击安装即可
安装过程不再描述,完成后点击“设置”弹出PM2管理器:
通过终端命令方式来启动PM2的命令如下:
pm2 start "dotnet xxx.dll" --name xxx
对照命令,我们大概可以猜到PM2管理器面板如何添加进程,项目所在目录直接选择发布站点的目录即可,启动文件名称应该就是命令:“dotnet xxx.dll”了,项目名称对应的是name名称,可以根据个人喜好起一个,然后点击“添加”按钮,但这里出现了一个问题,点击“添加”按钮一直提示"指定文件不存在",无奈最后通过终端运行pm2命令来添加了一个进程,再回到宝塔面板的PM2管理器窗口中查看,倒是新增了一条记录,正是通过终端添加的,但可惜的是在管理器上无法查看具体配置,然后通过管理器去启动和暂停这个进程都是没问题的,后来经过分析,通过宝塔面板运行PM2时是以“www”用户的身份去运行的,估计这个用户有点特殊,通过“www”用户无法识别“dotnet”命令所造成的,暂时作罢。
supervisor与PM2比较
这两个工具从网上了解使用相当普遍,查了一下资料,supervisor适用于开发环境,它会监视你对代码的改动,自动启动,比较方便;PM2内建负载均衡(使用 Node cluster 集群模块),0 秒停机重载,维护升级时不需要停机,稳定,适合于正式运行环境;从宝塔面板控制的便捷性来看supervisor配置起来要方便很多,可以指定运行用户,而PM2通过管理面板未能配置起来,只能通过后台终端来添加,但添加完成后可以用面板来管理。选用哪一款见仁见智吧!我们也可以结合使用,在开发测试时使用supervisor,正式发布使用PM2。
小结
在麒麟v10操作系统下安装WEB服务器耗费了大量的时间,最新版本的宝塔无法安装,Nginx安装不成功,正好麒麟官方网站又在维护,无法访问官方的源,一路曲折。当前安装的是基于国产的另一个操作系统:统信UOS ARM64专业版,其基于Debian8.3版本,安装还算顺利,但麒麟v10操作系统下的WEB服务器还是得配置,坑还是得填上无法绕过,计划等官网维护完成后再试试。
当前在统信UOS下的WEB服务器已配置完成,我们可以通过如下步骤来发布咱们的站点:
1、通过宝塔面板的网站管理创建站点。
2、将待发布的网站项目发布到本地文件系统。
3、通过宝塔面板的文件管理上传发布版本到指定站点目录。
4、配置站点设置反向代理。
5、使用进程守护工具添加运行 .NET Core 应用程序(测试运行环境可以使用supervisor,正式发布环境使用PM2,使用PM2时,通过终端运行来添加进程,后面管理可以直接通过宝塔面板来操作)。
参考资料
宝塔官网地址:https://www.bt.cn/
宝塔安装参考说明:https://www.bt.cn/bbs/thread-19376-1-1.html
官方发布说明文档:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-3.1
supervisor网址:https://pypi.org/project/supervisor/
PM2官网:https://pm2.keymetrics.io/
PM2守护进程介绍:https://www.cnblogs.com/stulzq/p/9775973.html