最近工作中一直在做将asp.net mvc网站部署Jexus上,解决一些来自客户的要求,因为项目是asp.net webform和asp.net mvc混合的网站组成,因此在将网站从Windows IIS服务器迁移到 Centos Jexus上遇到了不少的坑,总之是一个一个的躺平了。
在开始之前需要将Centos服务器安装好,因Centos服务器各种管理操作都是使用的命令行(终端)来执行,为了更方便的管理Centos服务器,可以安装宝塔面板进行服务器管理操作。
安装宝塔面板
宝塔面板是一款管理Linux服务器的可视化web面板,安装该面板后可以直接在浏览器上完成服务器的管理工作,例如网站部署,数据库安装,端口开放或禁用,定时任务,备份,文件管理等等。
宝塔官网:www.bt.cn
首次使用时,通过 putty 等客户端使用root账户登录Centos服务器(其它服务器类似,如Ubuntu、Debian等),然后执行如下命令安装即可:
Centos安装脚本
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
Ubuntu/Deepin安装脚本
wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh
Debian安装脚本
wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && bash install.sh
Fedora安装脚本
wget -O install.sh http://download.bt.cn/install/install_6.0.sh && bash install.sh
注意:必须为没装过其它环境如Apache/Nginx/php/MySQL的新系统,推荐使用centos 8.X的系统安装宝塔面板
宝塔安装完毕后,在最后的提示文字里面有宝塔的登录入口地址,用户名,密码等信息需要记录下来,直接复制下来保存即可,用户名,密码这些信息可以在宝塔面板里面修改。如果忘记用户名密码等信息,请使用SSH(如putty)登录服务器,执行如下命令就可以看到登录地址,用户名,密码等信息。
查看宝塔登录入口,用户名,密码命令: /etc/init.d/bt default
Jexus安装
Jexus 安装最新版即可,需要注意的是,安装Jexus需要区分X86_64系统和ARM64系统,像有些云服务器,可能使用的是ARM64系统,因此需要注意。安装Jexus时,执行如下命令:
X86_64系统
安装jexus独立版的命令是:
curl https://jexus.org/release/x64/install.sh|sh
ARM64系统
安装jexus独立版的命令是:
curl https://jexus.org/release/arm64/install.sh|sh
MVC网站部署注意事项
asp.net webform网站,asp.net mvc网站原本是不能跨平台部署的,在上一个步骤中安装的Jexus是自带Linux mono 运行时来支持.net程序,因此就可以将.net 开发的网站程序部署到 Linux服务器上,但需要注意的是,Mono不支持最新的.net 环境,需要降级编译发布。经过测试尤其是mvc的引用类库需要注意不能使用最新版本,具体能使用的引用类库和版本如下:
MVC引用库版本
- System.Net.Http.Formatting—-5.2.4
- System.Web.Mvc—-5.2.4
- System.Web.Http—-5.2.4
- System.Web.WebPages.Razor—-3.0.0
其它需要注意的事项
- URL地址(路由)、静态资源地址严格区分大小写
- 不支持虚拟目录下套应用程序(后面单独另说)
- 文件路径按 Linux的来,不支持Win路径如 “D:\”
配置文件更新
system.web配置节点更新,解决System.Net.Http的问题。
<compilation debug="true" targetFramework="4.7.2"> <assemblies> <add assembly="System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> </assemblies> </compilation>
虚拟目录下套应用程序
在Windows服务器,部署网站可以虚拟目录下面嵌套应用程序,如下图那样部署:
上图中的uploadserver做为一个应用程序嵌套到service这个虚拟目录里面的,如果要访问uploadserver里面的页面,请求地址为:
https://jhrs.com/service/uploadserver
当将uploadserver部署到Jexus之后,如果还是保持着 /service/uploadserver
这种链接样式后,再加上这个网站是使用的 asp.net mvc开发的,会出现不能正确定位网站根目录的问题从而报System.InvalidOperationException
错误。如下图所示:
解决这个问题需要从两个方面着手:
第一:在 Jexus的siteconf文件里面配置网站是,不要配置 二级或叫两段路径
,下图是原来的配置。
只需要将上图的配置修改为一级或一段路径
即可。如下图所示:
第二:配置反向代理,在Jexus的siteconf找到root文件进行修改,添加如下图所示的节点进行反向代理即可。reproxy=/service/uploadserver https://jhrs.com/uploadserver
左边的 reproxy=/service/uploadserver
就是表明当请求的地址匹配 https://jhrs.com/service/uploadserver
时,实际上对于服务器来说是反向代理请求的 https://jhrs.com/uploadserver
这个地址,如果你会配置 nginx 反向代理,这点不难理解。
通过反向代理就可以保持和迁移前的URL地址一样,这样就不需要修改任何代码保持请求接口或者URL一致。
webform部署注意事项
最近终于完成了webform网站的迁到工作,除了注意所有资源大小写问题之外(URL大小写),就是程序中的bug修复和兼容处理。
将asp.net webform网站部署到centos系统上,需要借助 jexus服务器,在实际操作过程中,网站的发布我是直接通过FTP来发布的,大致步骤如下:
第一:宝塔面板里面安装Pure-Ftpd,即先安装上FTP服务。
第二:创建FTP账号,将FTP目录指向到网站目录,这里需要注意的是,如果你的网站在原IIS部署使用了虚拟目录,或者主站下面套独立的应用程序方式部署的话,在Visual Studio里面配置FTP发布时,FTP站点路径按照路径层次配置即可。下面来图说明:
例如在IIS上,jhrs.com主站下面建了一个虚拟目录 rzjh(人在江湖),然后又在rzjh(人在江湖)下面建立了一个mnjh(美女江湖)的应用程序,对应的访问地址是:https://jhrs.com/rzjh/mnjh
Visual Studio发布配置步骤如下:
配置完了之后,再点击配置,如下图所示那样,可以验证一下是否与FTP连接成功。
接下来再点击设置tab,如下图那样。
通过这样配置 ,就可以直接在 VS里面将asp.net webform网站通过FTP发布到Centos上面了,省去了通过客户端来复制文件麻烦事,对于几十个网站要发布部署到centos上面,这种方式在开发阶段还是比较方便的,当然你可能会说使用持续集成工具来自动发布,也是可以做的。
有的时候配置好FTP发布时,当你点击发布时会出现FTP发布出错,得到如下提示
FTP 发布时报错,无法将“bin/jhrs.com.dll”添加到网站。 Ready to proceed (200)
解决办法就是:1、将发布配置删除,重新创建一个。2、检查FTP目录权限,你可以直接给 777 权限,即读写权限都给。直接在宝塔面板里面设置相应目录权限即可,当然也可以使用命令:chmod -R 777 /www/jhrs.com,直接给jhrs.com目录设置权限全开。改为777表示对于该用户、用户组内其他用户、其他用户都可以读写及执行,属于权限全开。