ASP.NET Core部署到Linux服务器(CentOS7 x64)

前言

  本文主要讲解如何一步步将ASP.NET Core网站发布到Linux服务器,文中会讲解具体步骤及需要避免的各种问题。


 

目录

  一、环境介绍

  二、创建及发布ASP.NET Core网站项目

  三、服务器软件安装(.NET Core SDK)

  四、在服务器上部署ASP.NET Core网站项目

  五、服务器端配置Nginx

  六、配置服务器端的守护进程(Supervisor)

  七、设置守护程序为开机自启

 


 

环境介绍

  本机所需开发工具: vs2017、XShell 、FileZilla(不限定,可使用其他上传工具)

  服务器系统及所需软件:CentOS7、.Netcore、Nginx、Supervisor、Policycoreutils-python


 

创建及发布ASP.NET Core网站项目

  打开vs2017,选择 文件->新建->项目,选择ASP.NET Core Web应用程序(.NET Core),在ASP.NET Core 1.1 模板处选择 Web应用程序

  

  

  此时ASP.NET Core 网站项目已建立完成,直接F5运行,可以在浏览器中看到如下页面

  

  回到vs2017,右键项目->发布,选择文件夹,文件夹名称更改为MyWebCore(可以不更改,默认名为PulishOutput,默认路径为bin\Release)点击发布后,可以在发布时填写的文件夹下找到发布的文件

  

  ASP.NET Core 网站发布完成,进行下一步


 

 服务器软件安装(.NET Core SDK)

 

  通过XShell登录Linux服务

  执行下列命令,安装.NET Core SDK(微软官方教程地址 https://www.microsoft.com/net/core#linuxcentos)   

 sudo yum install libunwind libicu
 curl -SSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?linkid=843449sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -c /opt/dotnetsudo ln -s /opt/dotnet/dotnet /usr/local/bin

  执行下列命名,返回版本号即表示.NET Core SDK已经安装成功   

 dotnet -–version

  

  .NET Core SDK安装完成,进行下一步


在服务器上部署ASP.NET Core网站项目

  找到本地发布好的ASP.NET Core项目(bin\Release\MyWebCore),使用FileZilla(可以使用其他上传工具)将MyWebCore文件夹整个上传至服务器(具体上传到什么位置可以自定义,此处使用/usr/myweb/文件夹)

  确保文件都成功上传之后,就可以进行在Linux服务器的部署了

  执行下列命令,部署ASP.NET Core网站  

 cd /usr/myweb/MyWebCoredotnet MyWebCore.dll

  出现如下信息,即表示网址已部署成功

  

  (注:ASP.NET Core 默认端口为5000,可以在项目中通过配置自定义端口,此处不做过多介绍)

  此时是无法访问到这个页面的,需要部署一个web容器来进行转发(即需要为Linux服务器配置Nginx)  

  ASP.NET Core网站部署完成,进行下一步


服务器端配置Nginx

  执行下列命令,安装Nginx  

 curl -o  nginx.rpm http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpmrpm -ivh nginx.rpmyum install nginx

  成功安装Nginx之后继续执行下列命令  

 systemctl start nginx        //启动Nginx
 systemctl enable nginx  //将Nginx设置为开机自启

  执行下列命令,配置防火墙

 firewall-cmd --zone=public --add-port=80/tcp --permanent    //开放80端口systemctl restart firewalld  //重启防火墙,使配置生效

  此时在浏览器输入服务器IP地址,测试Nginx是否可以访问

  

  Nginx可以正常访问,接下来开始配置Nginx对我们所部署的ASP.NET Core应用的转发

  找到Nginx配置文件nginx.conf(我的是在/ect/nginx/目录下)下载到本地,并将其server{}中的内容进行如下修改(建议先备份)  

server {listen 80;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;}
}

  将修改完成后的nginx.conf回传至服务器进行覆盖

  执行下列命令,使修改后的文件生效  

 nginx -s reload

  执行下列命令,启动ASP.NET Core网站

 cd /usr/myweb/MyWebCoredotnet MyWebCore.dll

  浏览器输入网址进行访问

  如果出现502错误,执行下列命令,将Nginx添加至白名单,然后再重启启动ASP.NET Core  

 yum install policycoreutils-pythonsudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginxsudo semodule -i mynginx.pp

  

  Nginx配置完成,进行下一步


 

 配置服务器端的守护进程(Supervisor)

  为避免Shell退出后仍然可以继续访问网站,我们需要守护进程(Supervisor)来监控ASP.NET Core网站,以保证其长久健康的运行

  执行下列命令,安装Supervisor  

 yum install python-setuptoolseasy_install supervisor

  执行下列命令,配置Supervisor 

 mkdir /etc/supervisor  //此处也可以使用上传工具手动创建文件夹 echo_supervisord_conf > /etc/supervisor/supervisord.confmkdir /etc/supervisor/conf.d

 

  修改supervisord.conf,对文件最后部分的内容进行修改

//原内容
;[include]
;files = relative/dictory/*.ini
//新内容 
[include]
files = conf.d/*.conf   //此处也可以是*.ini
//注意以上内容不要有;

  创建MyWebCore.conf文件(也可以是*.ini,需跟上一步保持一致),填写如下内容  

[program:MyWebCore]
command=dotnet MyWebCore.dll ;
directory=/usr/myweb/MyWebCore ;
autorestart=true ;
stderr_logfile=/var/log/MyWebCore.err.log ;
stdout_logfile=/var/log/MyWebCore.out.log ; environment=ASPNETCORE_ENVIRONMENT=Production ; user=root ; stopsignal=INT

  将MyWebCore.conf文件拷贝至下列目录  

  /etc/supervisor/conf.d/

  执行下列命令,查看是否生效

supervisord -c /etc/supervisor/supervisord.conf
ps -ef | grep MyWebCore

  

  如果存在 dotnet MyWebCore.dll进程,则表示运行成功

  配置文件如有修改,执行下列命令更新(没有则忽略)  

  supervisorctl reload

  此处可能出现的问题(没有则忽略)

  --重复的监听,会提示如下错误  
    another program is already listening on a port that one of our HTTP servers is configured to use

   --解决方法  

ps -ef | grep supervisord  //查看监听的端口,出现以下信息
root   2503  1  0 Nov19 ?  00:03:23 /usr/bin/python /usr/bin/supervisord
root   21337 2556  0 18:15 pts/8   00:00:00 grep --color=auto supervisord
kill -s SIGTERM 2503  
 在浏览器中进行访问

  

  守护进程Supervisor配置完成,进行下一步


 

 设置守护程序开机自启

  如果服务器宕机,重新启动后我们希望守护程序可以自启,那么需要做以下操作

  新建supervisord.service文件,并写入以下内容  

# dservice for systemd (CentOS 7.0+)
# by ET-CS (https://github.com/ET-CS)
[Unit]
Description=Supervisor daemon[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown ExecReload=/usr/bin/supervisorctl reload KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target

  将supervisord.service文件上传至服务器下列目录  

  /usr/lib/systemd/system/

  执行下列命令,将supervisor设为开机启动  

  systemctl enable supervisord

  执行下列命令,验证设置是否成功

  systemctl is-enabled supervisord

  返回enabled即为成功,可以执行重启Linux服务器来进行验证  

  reboot

  至此,ASP.NET Core网站部署到Linux服务器的操作全部完成。

 

转载于:https://www.cnblogs.com/iamzl/p/7363766.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redux进一步优化

1. 将原来的 mapStateToDispatch 中的函数提取出来,放在组件中, 如原来的: function mapStateToProps(state, ownProps) {return {hasMore:state.getIn([tabs,hasMore]),} } function mapDispatchToProps(dispatch) {return {addTabList:(i…

C# : 调用C++动态库(dll)

在实际软件开发过程中,由于公司使用了多种语言开发,在C#中可能需要实现某个功能,而该功能可能用其他语言已经实现了,那么我们可以调用其他语言写好的模块吗?还有就是,由于C#开发好的项目,我们可…

Python3.5以上版本lxml导入etree报错Unresolved reference

Web抓取Web站点使用HTML描述,这意味着每个web页面是一个结构化的文档。有时从中 获取数据同时保持它的结构是有用的。web站点不总是以容易处理的格式, 如 csv 或者 json 提供它们的数据。 这正是web抓取出场的时机。Web抓取是使用计算机程序将web页面数据…

linux设置history历史记录

#说明export HISTSIZE1000 #设置历史记录显示1000行export HISTTIMEFORMAT%F %T #设置历史记录格式 999 2017-08-15 10:58:32 #修改vim /etc/profilesed -i "s/\(HISTSIZE\).*/\11000/" /etc/profilesed -i "/HISTSIZE/aexport HISTTIMEFORMAT%F %T " /et…

STL-容器库101--array【C11】

1. 原型 C11提供 template < class T, size_t N > class array;T&#xff1a; 元素类型&#xff0c;以 array::value_type 作为别名使用&#xff1b;N&#xff1a; array中元素大小&#xff1b; 固定size的序列容器&#xff1b;初始化时&#xff0c; array对象不保存任何…

C#:向C++封送结构体数组

在使用第三方的非托管API时&#xff0c;我们经常会遇到参数为指针或指针的指针这种情况&#xff0c; 一般我们会用IntPtr指向我们需要传递的参数地址&#xff1b; 但是当遇到这种一个导出函数时,我们如何正确的使用IntPtr呢&#xff0c; extern "C" __declspec(dll…

其它综合-CentOS7 忘记root密码

CentOS7 忘记root密码 长时间不用的 CentOS 机器再次开机的时候忽然忘记了密码&#xff0c;总不能就重装一台吧&#xff0c;还有好多服务在机器上&#xff0c;于是决定重置root的密码。   如果是已经开启的机器&#xff0c;需要进行关闭&#xff0c;重新启动。在启动选择内核…

left join on and 与 left join on where的区别

数据库在通过连接两张或多张表来返回记录时&#xff0c;都会生成一张中间的临时表&#xff0c;然后再将这张临时表返回给用户。 在使用left jion时&#xff0c;on和where条件的区别如下&#xff1a; 1、 on条件是在生成临时表时使用的条件&#xff0c;它不管on中的条件是否为真…

spring boot高性能实现二维码扫码登录(中)——Redis版

前言 本打算用CountDownLatch来实现&#xff0c;但有个问题我没有考虑&#xff0c;就是当用户APP没有扫二维码的时候&#xff0c;线程会阻塞5分钟&#xff0c;这反而造成性能的下降。好吧&#xff0c;现在回归传统方式&#xff1a;前端ajax每隔1秒或2秒发一次请求&#xff0c;去…

C# :socket 通讯基础使用实例

们在讲解Socket编程前&#xff0c;先看几个和Socket编程紧密相关的概念&#xff1a; TCP/IP层次模型当然这里我们只讨论重要的四层 01&#xff0c;应用层(Application)&#xff1a;应用层是个很广泛的概念&#xff0c;有一些基本相同的系统级TCP/IP应用以及应用协议&#xff0…

IBM发表论文:可能已找到处理量子计算退相干的方法

在《自然》杂志最近发表的一篇论文中&#xff0c;IBM和其他机构的研究人员设计了两种量子算法&#xff0c;利用变分量子电路和量子核估计器来训练一种支持向量机分类器。这两种算法背后的关键思想是使用量子状态空间作为特征空间表示&#xff0c;有效地构建映射&#xff0c;从原…

PHP + NGINX 控制视频文件播放,并防止文件下载

最简单的方法是使用NGINX的 internal 功能 server { listen 80; server_name www.xxx.com;  location / { index index.php index.html index.htm; root /xxx; if (!-e $request_filename) { rewrite ^/index.php(.*)$ /index.php?s$…

可视化调试工具

rosrun rqt_console rqt_console # 查看日志消息&#xff0c;可filter、highlight指定级别。 rosrun rqt_logger_level rqt_logger_level # 可设在日志记录器的严重级别 rosrun rqt_topic rqt_topic # 显示topic调试信息 rosrun rqt_publisher rqt_publisher # 在界面中管理ro…

C#:委托基础与事件

通过以下思维导图&#xff0c;学习委托的基本概念&#xff0c;后面着重讲解委托的运用&#xff0c;希望通过最简单的方式收获更多的知识。 1.委托的各种写法 1、委托 委托名new 委托&#xff08;会调用的方法名); 委托名&#xff08;参数&#xff09;; 2、委托 委托名 会调用…

Git Bash关键命令

1.默认目录是C:\Users\用户名 2.切换目录&#xff1a;$cd c:\\windows 3.切换到上级目录&#xff1a;cd ..&#xff0c;中间有空格 4.列出某目录所有文件&#xff0c;相当于DOS下的dir&#xff1a;ls c:\\windows 5.查看配置信息&#xff1a;git config --list 以下是显示信息 …

C#:invoke 与 BeginInvoke使用区别

invoke和begininvoke 区别 一直对invoke和begininvoke的使用和概念比较混乱&#xff0c;这两天看了些资料&#xff0c;对这两个的用法和原理有了些新的认识和理解。 首先说下&#xff0c;invoke和begininvoke的使用有两种情况&#xff1a; 1. control中的invoke、begininvoke。…

Django基本命令

Django基本命令 1.创建一个Django 项目 django_admin.py startproject mysite当前目录下会生成mysite的工程&#xff0c;目录结构如下&#xff1a; manage.py ----- Django项目里面的工具&#xff0c;通过它可以调用django shell和数据库等。settings.py ---- 包含了项目的默认…

Git忽略规则.gitignore梳理

对于经常使用Git的朋友来说&#xff0c;.gitignore配置一定不会陌生。废话不说多了&#xff0c;接下来就来说说这个.gitignore的使用。首先要强调一点&#xff0c;这个文件的完整文件名就是".gitignore"&#xff0c;注意最前面有个“.”。 一般来说每个Git项目中都需…

第二周CoreIDRAW课总结

1.这节课学到了什么知识&#xff1f; 学到了图像的复制&#xff0c;再制鼠标复制&#xff0c;重复&#xff0c;还有对象的对齐&#xff0c;对象的分布顺序。 2.有哪些心得体会&#xff1f; 做了课本的练习&#xff0c;会用窗口里面的泊坞窗造型命令也作出了一个作品。 3.这节课…

axios关于针对请求时长策略设计的思考

前言 在我们的业务请求中&#xff0c;有很多时候会针对有不同时长的需求策略性设置。这里针对这个需求进行详细的展开。 针对这种情况&#xff0c;我们的timout的一般是根据请求地址来的&#xff0c;所以核心处理技巧便是如何根据不同的request地址去设置不同的timeout. 我们之…