事先说明:本人是通过visual studio 2019 + 发布为文件夹的形式部署 , 通过vs部署发布的好处在于很多配置项vs会帮我们自动生成到配置文件中
1.确保你的项目是已经通过本地测试可以正常运行的,假设你的项目名为firstapp,后方运行时要用
2.在vs中打开项目,上方菜单栏"生成", 然后点击 '发布[你的项目名称]',然后弹出发布配置窗口
3.点击途中绿色圈住的"编辑"按钮,弹出配置界面
4.发布方法我们选择"文件系统",目标位置自己设置一下,即最后打包出的文件夹放在哪
5.我们再点击左侧的"设置",得到如下界面
1.配置,表示我们是'Release'还是'Debug'的形式发布
2.目标框架,即netcore使用的版本
3.部署模式,这里就是区分独立部署还是依赖部署的地方了,依赖部署的话,要求你服务器上还要安装对应版本netcore的运行时环境,我们这里选择的是独立部署,即所有依赖文件都会自动打包到你的文件夹中,然后在服务器上不用安装netcore就能跑起来了
4.目标运行时,我们选择自己服务器对应的版本就好,这里是演示linux版本,具体32位还是64位服务器自己确定吧
5.然后我们点保存
6.保存之后回到第一张截图界面,我们点击"发布"
7.等待发布完成后,得到我们项目的文件夹,假设名为 myapp
我们可以查看一下myapp文件夹,发现打包了很多项目中需要用到的dll,还有一些json配置文件和一些linux下的so文件,还有几个跟你项目名称相关的文件...
- firstapp //在linux上通过./firstapp来执行整个项目
- firstapp.deps.json //项目依赖文件
- firstapp.dll //项目程序集
- firstapp.pdb //项目调试文件,会协助firstapp.dll运行遇到错误抛出异常
- firstapp.runtimeconfig.json //运行时配置文件
8.登录到我们的linux系统,一般网站都放在/var/www下,没有www目录,我们就新建一个www目录,如果你只是测试,你放别的地方也可以
9.通过FTP工具将刚打包出来的myapp文件夹上传到/var/www/目录下
10.前往对应目录,并执行命令即可运行项目
cd /var/www/myapp
./firstapp #这个firstapp是你项目的名字,参见第7条
如果无法执行提示权限问题 Permission denied 或者 no live upstreams while connecting to upstream 错误时候
1.那么请尝试给打包出来的文件夹权限,777(先尝试是否是此问题)
2.可能是selinux导致的
/usr/sbin/sestatus 先查看selinux状态
vim /etc/selinux/config 修改selinux状态
将SELINUX=enforcing 修改为 SELINUX=disabled 状态
如果遇到"Process terminated. Couldn't find a valid ICU package installed on the system"的问题
尝试安装ICU库
sudo yum install -y icu
补充,接下来基于Centos补充Nginx + supervisor 来自动启动并守护项目进程
安装 Nginx
sudo yum install -y nginx
由于nginx是第一次安装的,请通过运行以下命令来显式启动:
sudo service nginx start
##如果需要开机自启动,请执行
systemctl enable nginx.service
修改/etc/nginx/nginx.conf文件,并用以下内容替换对应的server节点部分:
配置Nginx
server {
listen 80;
server_name myserver;
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;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
安装supervisor守护进程
通过yum安装supervisor,注意,如果使用python pip安装,那么最好确保是python2的版本,python3现在可以使用supervisor,但是通过pip安装的可能会出现异常
yum install -y supervisor
配置守护进程信息
切换到supervisord.d目录,该目录下的ini文件都会在supervisor服务启动时被守护执行
cd /etc/supervisord.d
#在此新建一个supervisor的.ini配置文件
touch myserver.ini
编辑 myserver.ini 文件
[program:myserver]
directory=/var/www/这里填文件夹名称
command=/bin/bash -c "./myserver"
environment=ASPNETCORE__ENVIRONMENT=Production
user=root
stopsignal=INT
autostart=true
autorestart=true
startsecs=10
stderr_logfile=/var/log/myserver.err.log
stdout_logfile=/var/log/myserver.out.log
下面内容为上方文件的说明
#下面所有注释的内容都要删除,包括这一句
[program:myserver] #配置当前守护进程服务的名称,supervisord可直接通过名称启动服务
directory=/var/www/myapp #工作目录,即应用程序集所在目录
command=下方详解 #执行的命令
environment=ASPNETCORE__ENVIRONMENT=Production #表明是生产环境
user=root #root 权限
stopsignal=INT
autostart=true
autorestart=true
startsecs=10 #进程持续运行多久才认为是启动成功
stderr_logfile=/var/log/myserver.err.log
stdout_logfile=/var/log/myserver.out.log
注意,上方配置文件中command
参数,这个参数表示守护进程自动替我们执行的命令
例如 python test.py
或者sh test.sh
再或者当你安装了dotnet环境后,通过依赖部署时,这里会填dotnet firstapp.dll
但是,我们是独立部署的,通过./firstapp
来运行,但是如果这样配置command =./firstapp
会发现守护进程无法启动,因为不识别这个命令
解决方案:我们通过/bin/bash -c "字符串命令"
这样来执行就可以了,即command = /bin/bash -c "./firstapp"
启动supervisord 守护程序,启动后会执行supervisord.d目录下的ini文件
supervisord -c /etc/supervisord.conf
设置开机启动守护程序supervisord
systemctl enable supervisord.service
重启supervisord
supervisorctl reload
最后补充,注意,如果要使用nginx的话,那么还有一些nginx反向代理相关配置要注意设置哦,例如
//这里很重要,由于通过nginx转发给.netcore处理,所以如果不配置此项,那么想在netcore中获取访问端的IP的话,导致无法获取
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});