码字,杂谈

将 .net core 项目部署到 Linux(含配置多个项目)

部署这事儿,要说简单,其实很简单,尤其巨硬官方文档写的那叫一个清晰。

发布

写好的.net core项目,直接在vs中发布即可,需要注意选择linux:

《将 .net core 项目部署到 Linux(含配置多个项目)》

这里不是重点,相信到了部署阶段,开发和发布并不是本文所要关注的。

部署

本文用的CentOS 7 + Apache环境,如果有不一样的,大同小异,自行参阅文档。

先挂上巨硬的官方文档,这份部署文档相当详细,我也搜了一下其他文章,基本上都是按照这份文档部署的,所以没啥可说的。

巨硬的官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/linux-apache?view=aspnetcore-3.1 ,如果你使用的是Nginx,他也有对应的文档,可以自行参阅。

1、安装dotnet

sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
sudo yum install dotnet-sdk-3.1
sudo yum install aspnetcore-runtime-3.1  # 逻辑上需要安装运行时,但是sdk已经包含了运行时,所以先装了sdk的话,这句可以跳过

这样就装完了环境,跑一下dotnet可以看到如下内容:

《将 .net core 项目部署到 Linux(含配置多个项目)》

2、把发布的文件放到服务器

理论上文件可以放到任意地方,只要你记得住就可以。

《将 .net core 项目部署到 Linux(含配置多个项目)》

将文件放好,测试一下效果,注意需要运行上图红框的dll文件:

dotnet /var/www/servers/k-test/WebApplication1.dll

《将 .net core 项目部署到 Linux(含配置多个项目)》

如果你发现报错了,很大几率都是端口冲突,这时需要注意更改端口,官方文档有详细的介绍,这里就不多说了。

如果看到跟图中一样的绿色显示,则表示项目已经成功运行了,下一步就该挂载到apache中去了。

3、设置apache

根据官方文档的介绍:Apache 的配置文件位于 /etc/httpd/conf.d/ 目录内。 除了 /etc/httpd/conf.modules.d/ 中的模块配置文件外(其中包含加载模块所需的任何配置文件),将对任何带 .conf 扩展名的文件按字母顺序进行处理

所以,在/etc/httpd/conf.d/文件夹中创建一个配置文件,让我们的项目生效:

vim /etc/httpd/conf.d/test.conf

并将如下内容粘贴到文件中:

<VirtualHost *:*>
    RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
</VirtualHost>

<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:44001/
    ProxyPassReverse / http://127.0.0.1:44001/
    ServerName api.jeremyjone.com
    ServerAlias api.jeremyjone.com
    ErrorLog /var/log/httpd/api-error.log
    CustomLog /var/log/httpd/api-access.log common
</VirtualHost>

这里有个问题,第2行的expr=%{REQUEST_SCHEME},我这里总是报%的语法问题,删了百分号就成功了。

然后检查、重启服务器:

sudo service httpd configtest
sudo systemctl restart httpd  # 如果上面运行正确,再运行该行

4、配置项目的服务项

创建一个服务配置项的文件:

sudo nano /etc/systemd/system/k-test.service

内容如下:

[Unit]
Description=Example .NET Web API App running on CentOS 7

[Service]
WorkingDirectory=/var/www/servers/k-test
ExecStart=/usr/local/bin/dotnet /var/www/servers/k-test/WebApplication1.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-test
User=apache
Environment=ASPNETCORE_ENVIRONMENT=Production 

[Install]
WantedBy=multi-user.target

需要注意:里面的内容别忘了改成自己的。

保存文件内容,将其挂到服务并启动:

sudo systemctl enable k-test.service
sudo systemctl start k-test.service
sudo systemctl status k-test.service

如果看到如下内容,表示已经成功了:

《将 .net core 项目部署到 Linux(含配置多个项目)》

5、完成

如果之前没有重启apache服务器,那么重启一下,现在可以访问了。

我这里可以通过api.jeremyjone.com来访问:

《将 .net core 项目部署到 Linux(含配置多个项目)》

部署多个项目

这个我看了很多帖子,基本到上面就完事了,跟官方文档一毛一样,没有卵用。

我希望通过api.jeremyjone.com一个地址部署多个项目,而不是每次都申请一个二级域名。通过代理可以解决,也深入的学习了一下apache的proxy模式。

官方文档介绍:https://httpd.apache.org/docs/2.4/mod/mod_proxy.html ,还是贴文档地址,有兴趣的朋友可以去看看。

简单说一下,因为我看到部署的配置文件是这样的:

ProxyPass / http://127.0.0.1:44001/
ProxyPassReverse / http://127.0.0.1:44001/
  • 第一个参数是路径,官方叫path,其实就是匹配外部访问时url的除去域名部分。
  • 第二个参数是内部地址,代理的url。

用官方的例子说明:

ProxyPass "/mirror/foo/" "http://backend.example.com/"
  • 当我们访问http://api.jeremyjone.com/mirror/foo时,内部会调用http://backend.example.com/处理并返回结果。
  • 如果需要参数,那么使用访问http://api.jeremyjone.com/mirror/foo/abc时,内部会调用http://backend.example.com/abc处理并返回结果。

大体的逻辑就是这样,更高级的用法参看文档使用。

有了这样的代理,就可以在api.jeremyjone.com后面加上不同字段来调用不同代理,获取不同项目的结果。

修改一下配置文件,/etc/httpd/conf.d/test.conf

<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyPass /test/ http://127.0.0.1:44001/
    ProxyPassReverse /test/ http://127.0.0.1:44001/

    ProxyPass /test2/ http://127.0.0.1:44002/
    ProxyPassReverse /test2/ http://127.0.0.1:44002/

    ServerName api.jeremyjone.com
    ServerAlias api.jeremyjone.com
    ErrorLog /var/log/httpd/api-error.log
    CustomLog /var/log/httpd/api-access.log common
</VirtualHost>

这样,就可以通过api.jeremyjone.com/testapi.jeremyjone.com/test2分别访问不同项目了。

有个坑,需要注意

其实也不是什么大问题,不过我没注意,整了半天,白耽误功夫了,特意说一下:

第一个参数一定是以/开头并且以/结尾,比如:

ProxyPass / http://127.0.0.1:44001/
ProxyPass /test/ http://127.0.0.1:44001/

我在/test后面忘了写/,导致怎么访问都是404,日志还没有其他错误,烦的一批,结果歇了会,回过头再来看,发现这里居然漏了一个/,也算是一种收获吧。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注