部署这事儿,要说简单,其实很简单,尤其巨硬官方文档写的那叫一个清晰。
发布
写好的.net core
项目,直接在vs中发布即可,需要注意选择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
可以看到如下内容:
2、把发布的文件放到服务器
理论上文件可以放到任意地方,只要你记得住就可以。
将文件放好,测试一下效果,注意需要运行上图红框的dll文件:
dotnet /var/www/servers/k-test/WebApplication1.dll
如果你发现报错了,很大几率都是端口冲突,这时需要注意更改端口,官方文档有详细的介绍,这里就不多说了。
如果看到跟图中一样的绿色显示,则表示项目已经成功运行了,下一步就该挂载到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
如果看到如下内容,表示已经成功了:
5、完成
如果之前没有重启apache服务器,那么重启一下,现在可以访问了。
我这里可以通过api.jeremyjone.com
来访问:
部署多个项目
这个我看了很多帖子,基本到上面就完事了,跟官方文档一毛一样,没有卵用。
我希望通过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/test
和api.jeremyjone.com/test2
分别访问不同项目了。
有个坑,需要注意
其实也不是什么大问题,不过我没注意,整了半天,白耽误功夫了,特意说一下:
第一个参数一定是以/
开头并且以/
结尾,比如:
ProxyPass / http://127.0.0.1:44001/
ProxyPass /test/ http://127.0.0.1:44001/
我在/test
后面忘了写/
,导致怎么访问都是404,日志还没有其他错误,烦的一批,结果歇了会,回过头再来看,发现这里居然漏了一个/
,也算是一种收获吧。
文章评论