本文基于初次或再次尝试部署. Net Core 应用到 Linux 服务器上, 我尝试后自我总结的经验一个简单的 Demo, 尝试部署在 Linux 服务器上和跨服务器访问数据库.
一, 环境介绍
1, 本地使用 Visual Studio 2017 开发, 使用的. NetCore SDK 版本为 2.1.4; 2, 数据库使用的 MSSQLServer, 部署在阿里云服务器上, WindowServer; 3,Demo 部署在腾讯云服务器上, CentOS 系统; 4,CentOS 中安装了. net CoreSDK 2.1.4(开发和部署的环境最好一致, 我在这里掉过坑) 5, 代码管理通过 Git 来进行, 在本地安装了 Git, 在 CentOS 中也安装了 Git; 6, 利用 jexus 进行反向代理;
二, 项目介绍
建立一个 Asp.Net Core 项目, 这个建立过程就不贴图了, 步骤简单. 此处还没有使用到 Docker, 建立项目时, 没有勾选 Docker 支持
整个项目从搭建到运行的简略过程
1, 建立实体 只加了一个 User 类, 里面就是基本的用户名, 密码, 地址和创建日期.
public class User
{
public User()
{
this.CreateDate = DateTime.Now;
}
public int Id { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Address { get; set; }
public DateTime CreateDate { get; set; }
}
2, 接下来是建立 DbContext
public class HDShopDbContext:DbContext
{
public HDShopDbContext(DbContextOptions<HDShopDbContext> options)
:base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//modelBuilder.Entity<User>().ToTable("xxxx");
}
public virtual DbSet<User> User { get; set; }
}
3, 配置服务
在项目中已经默认的将 EFCore 相关的 Nuget 包加入进来了
在 StartUp.cs 文件中进行服务配置, 使用
services.AddDbContext<HDShopDbContext>(d => d.UseSqlServer(Configuration.GetConnectionString("Default")));
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<HDShopDbContext>(d => d.UseSqlServer(Configuration.GetConnectionString("Default")));
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
此处, 解释下 Configure 和 ConfigureService 的区别: Configure 配置的是中间件, 整个服务运行过程中, 是以中间件形式进行跳转, 从第一个中间件到第二个中间件, 完成最后一个中间件要求后返回到上一个中间件, 而中间件数量的多少是我们可以去控制的, 如果有什么功能需要加入, 我们也可以以中间件的形式控制运行, Configure 方法即时控制中间件的. ConfigureService 配置的是整个运行中所用到的各种框架, 注入等等, 在 Configure 方法前先被调用. 具体可看 @ 行动派 Xdpie https://www.cnblogs.com/vipyoumay/p/5640645.html
在 appsetting.json 中配置连接字符串, 由于 Linux 中不能安装 SQLServer 除 2017 以外的其他版本我便将另一台 WindowServer 服务器数据库弄过来用了, SQLServer2017 对于 Linux 服务器配置要求很高, 我等小平民伤不起, 哈哈.
记得连接字符串名字不要弄错了 ! ! !4, 为了方便让 EFCore 的 CodeFirst 在我们部署完, 启动后就自动创建数据库, 我们准备点种子数据
public class DbInitializer
{
public static void Initialize(HDShopDbContext context)
{
context.Database.EnsureCreated();
if (context.User.Any())
{
return;
}
var users = new User[]
{
new User(){Address="测试",UserName ="1 测试 1",Password="123456"},
new User(){Address="测试",UserName ="2 测试 2",Password="123456"},
new User(){Address="测试",UserName ="3 测试 3",Password="123456"},
new User(){Address="测试",UserName ="4 测试 4",Password="123456"},
new User(){Address="测试",UserName ="5 测试 5",Password="123456"},
new User(){Address="测试",UserName ="6 测试 6",Password="123456"},
};
foreach (var user in users)
{
context.Add(user);
}
context.SaveChanges();
}
}
5, 编译运行, 测试下本地运行是否成功. 我这就不将我的测试结果展示出来了. 6, 进入 Linux 服务器, 下载好 Git, 通过配置好 SSH 公钥, 在 GitHub 或是码云上做个记录.(我还是习惯用码云, 毕竟汉字多 哈哈) Linux 服务器上配置 Gti 的教程: https://www.cnblogs.com/yolo-bean/p/7808767.html 7,Linux 服务器安装 jexus, 通过如下命令安装
curl https://jexus.org/release/x64/install.sh|sh
安装成功后会提示: OK, Jexus has been installed in /usr/jexus. 至此, 作为反向代理的 jexus 安装完毕, 以前需要安装 jexus+mono, 现在最新版本的 jexus 已经将 mono 合并进去了, 形成了现在的 jexus 独立版. 8, 安装. Net Core 环境 我的建议是先查看开发环境的. Net Core SDK 版本, 不然如果服务器上的环境和开发环境存在版本差异的话会出现一些坑, 比如我遇到的一个坑
Error:
An assembly specified in the application dependencies manifest ({projectName}.deps.json) was not found:
package: 'Microsoft.AspNetCore.Antiforgery', version: '2.0.2'
path: 'lib/netstandard2.0/Microsoft.AspNetCore.Antiforgery.dll'
This assembly was expected to be in the local runtime store as the application was published using the following target manifest files:
aspnetcore-store-2.0.5.xml
在我安装服务器的 SDK 的时候选择的是 2.1.3 版本, 而我的开发环境是 2.1.4 版本, 结果就出错了, 弄了一阵子没搞好这个原因, 同样就是这个原因, 使得我从 Git 上 pull 下来的项目, 虽然发布成功了, 但是部署的话是不能够正常访问的, 同时通过 dotnet /xxx/xxx/xx.dll 进行测试会一直出现这个错误. 最后通过干掉已有的版本, 获得最新的版本, 同样, 我也在这里有个问题, 貌似没得更新 SDK 版本的指令吧? 我没有找到, 抱歉, 如有, 请联系我, 谢谢. 通过命令, 干掉旧版的 CLI, 同时下载新版的 SDK 搞定, 成功运行起来了.
rm -rf /usr/share/dotnet 删除旧版 cli
下面是我的安装. Net Core 的指令
1, 配置 dotnet 产品 Feed
sudo rpm--import https: //packages.microsoft.com/keys/microsoft.asc
sudo sh - c 'echo -e"[packages-microsoft-com-prod]
name=packages-microsoft-com-prod
baseurl= https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod
enabled=1
gpgcheck=1
gpgkey=https://packages.microsoft.com/keys/microsoft.asc"> /etc/yum.repos.d/dotnetdev.repo'
2, 安装 SDK, 注意版本!!!
sudo yum update
sudo yum -y install libunwind libicu
sudo yum install dotnet-sdk-2.1.4
至此环境便已经搭建好了.
三, 部署过程
通过 Git 将码云或是 Github 上的项目 Pull 下来, 最好现在服务器上指定好 Git 路径比如我的建立一个专门放置项目的文件夹, 其中对每一个需要 Clone 到本地的项目建立一个文件夹, 可以让我思路比较清晰. 或许, 你有更好的方式, 也可以使用.
通过建立完毕运行指令
git clone 你项目的 SSH 地址
我们可以利用其他 dotnet 的指令进行一些操作了
具体需要什么指令可以通过 dotnet --help 进行获得
查看下文件夹中的内容
可以通过指令 dotnet run 将项目进行启动
此处会发现, 我们不能干什么事情了,
只能按 Ctrl + C 让服务停下来, 我们可以将当前这个程序作为后台程序运行, 具体的操作就是 Ctrl +Z 将服务暂停
然后通过指令 bg 将其设为后台进程, 如果想要进入已有的后台进程通过指令 fg
如果我们是只在命令行里操作的话, 又看不到页面, 又不能通过外网访问, 又想要确保网站是否真的运行成功了, 我们可以通过指令来查看网站的首页信息
curl localhost:65758
将返回网站的 html 信息
具体更多的 linux 下 http 指令请参照 http://blog.csdn.net/wh211212/article/details/54285921
我们可以发布了, 通过指令 dotnet build 将项目再次编译一下
然后通过 dotnet publish -o /xxxx/xxxx 将项目发布到指定文件夹
接下来, 可以开始配置 jexus 了.
/// 1, 切换到 Jexus 配置文件目录
cd /usr/jexus/siteconf
/// 2, 复制默认的配置文件为 HDShop
cp default HDShop
vi HDShop
######################
# web Site: HDShop
########################################
port=9527
root=/ /var/www/HDShop
hosts= * #OR your.com,*.your.com
AppHost={CmdLine=dotnet /var/www/HDShop/HDShop.dll;AppRoot=/var/www/HDShop/;Port=0}
至此, 需要的所有准备工作已经做好, 通过 jexus 的命令来启动服务
/// 如果已启动 Jexus:
sh / usr / jexus / jws restart
/// 如果未启动 Jexus:
sh / usr / jexus / jws start
jexus 的命令大全可以参照: http://blog.csdn.net/yang1982_0907/article/details/45155765 此时通过外网输入 ip 地址或域名 (如果有的话)+ 端口 (我写的不是默认 80 端口而是 9527 端口)
网站正常启动, 成功读到阿里云上那台数据库服务器的数据, 同时也进行增删改成功了. 至此, 尝试结束, 其中还有许多的其他部分没有说明进来, 比如说 Docker, 我是使用了 Docker 的, 但在写的部分中并没涉及 Docker, 因为我自己发现一些逻辑绕不过去, 具体问题见下一章. 还有也尝试了想要用图形界面操控 Linux 服务器并且远程操控, 专门下了 GNOME 和 TigerVNC, 发现很卡, 卡到心累, 便不再使用, 直接在命令行中进行所有工作. 同时, 对于 Window 下的项目怎么移动到 Linux 上, 其实还有很多种方式, 比如 FTP 等等, 这个可以从度娘获知. 我比较喜欢 Git 这种方式.
四, 后续问题
此次没有配合 Docker 容器一起使用, 下一次将会带来 Docker 容器
1, 引入 Docker 容器, 实现服务部署于容器中, 通过外网访问可以访问到 Docker 容器中的网站.
2, 项目还没有加入 Dockerfile 文件, 此次都是通过手工去部署的, 下一次将使用 Dockerfile 进行服务部署.
3, 域名绑定还没有尝试.
但是还有一些问题没有解决
1,jexus 配合 Docker 使用使用, 但是遇到点问题还需解决.
比如: 目前来讲, 我将网站直接发布好了, 那么我就不需要指令 dotnet run 让其自运行自侦听了, 那么全是依靠的 jexus 的代理.
这么一来, Docker 容器中运行服务那是什么意思呢? 我暂时还不能理解. 同时如果说 Docker 容器中运行网站, 那么是由网站本身自侦听还是由容器中的 jexus 进行代理呢?
2, 端口映射问题, 主机端口和 Docker 容器中端口映射问题.
3,Docker 容器间访问设置
2018-2-3, 望技术有成后能回来看见自己的脚步
来源: https://www.cnblogs.com/CKExp/p/8409563.html