将 .net core 项目部署到 Linux服务器

目录

1、前言

2、安装 .NET SDK 或 .NET 运行时

3、创建数据库

4、发布项目到Linux环境

5、配置Nigix

6、Nginx配置Https

7、安装Supervisor


1、前言

部署服务器:阿里云的CentOS 7.6 64位

发布项目:.Net Core 5.0

数据库:MySql 5.8 

其他:Nginx,Supervisor

2、安装 .NET SDK 或 .NET 运行时

参考官网网址:https://learn.microsoft.com/zh-cn/dotnet/core/install/linux-centos

1、CentOS 7 ✔️

安装 .NET 之前,请运行以下命令,将 Microsoft 包签名密钥添加到受信任密钥列表,并添加 Microsoft 包存储库。 打开终端并运行以下命令:

sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm

2、安装 SDK或是运行时

.NET SDK 使你可以通过 .NET 开发应用。 如果安装 .NET SDK,则无需安装相应的运行时。 若要安装 .NET SDK,请运行以下命令:

sudo yum install dotnet-sdk-5.0

如果只是在Linux上运行.net core项目则可以只安装运行时,请运行以下命令:

sudo yum install aspnetcore-runtime-5.0

3、查看Dotnet版本信息 ,请运行一下命令:

dotnet --info

3、创建数据库

在服务器安装MySQL数据库,在宝塔面板上创建数据库,设置账号密码

4、发布项目到Linux环境

如果不想用XFTP也可以用命令

rz命令(上传文件到Linux)
rz 直接输入 rz 之后回车就会打开你本地文件夹,选择文件就可以上传文件到Linux

通过XFTP - NetSarang Website (xshell.com)按需选择下载XFTP,

新建会话,输入主机名称和用户名、密码连接服务器 

将 .net core 项目部署到 Linux服务器_第1张图片

选择目录创建文件夹,把发布文件上传到文件夹中。

执行以下命令启动项目

#启动  .net core API 
进入上传发布的文件夹
cd  ..
cd /wwwceshi 
dotnet ceshi.dll

如果出现端口被占用:

可以使用以下命令自己指定端口:

dotnet ceshi.dll --urls http://*:5005

 看到Now listening on: http://[::]:5005,说明我们已经成功绑定了5005端口,现在内网可以访问网站了

5、配置Nigix

将 Nginx 配置为反向代理以将 HTTP 请求转发到 ASP.NET Core 应用程序。修改

/etc/nginx/sites-available/default。 使用vim打开修改(若未获取vim工具使用apt获取),并将内容替换为以下代码片段:

server {   
    listen        80;
    server_name   ceshi.cn *.ceshi.cn;
    location / {
        proxy_pass         http://127.0.0.1:5005;
        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;
    }
}

 这个server节配置是将本机的5005端口的应用交于80端口代理,用户访问的是localhost:80,但此请求转发到localhost:5005 到 ASP.NET Core 程序处理并返回响应。代理完成后我们获取该虚拟机的ip地址访问即可(可使用ifconfig或直接设置里查看)

 这个时候我们在访问该虚拟机的 80 端口出现:

将 .net core 项目部署到 Linux服务器_第2张图片

原因是因为我们的应用程序还没有运行呢,我把打包后的文件传到了Public文件中。使用dotnet命令运行

dotnet ceshi.dll --urls http://*:5005

 在外网打开ceshi.cn,访问该虚拟机ip,nginx转发成功了

将 .net core 项目部署到 Linux服务器_第3张图片

6、Nginx配置Https

配置HTTPS和证书相关的内容直接去看官方文档:https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-2.1&tabs=aspnetcore2x#configure-ssl

nginx配置HTTPS前置条件

1、服务器上已经安装nginx,已经配置http访问
2、nginx服务器已经安装ssl模块
3、已经拥有ssl证书,这需要你有一个域名,并且申请了证书(免费的)

1、查看nginx是否安装http_ssl_module模块

#进入到nginx安装目录的sbin目录
cd /www/server/nginx/sbin
#查看是否安装http_ssl_module模块
./nginx -V

如果 configure arguments里面包含 --with-http_ssl_module, 则已安装。

2、ssl 证书部署

下载申请好的 ssl 证书文件压缩包到本地并解压(这里是用的 pem 与 key 文件,文件名可以更改)。在 nginx 目录新建 cert 文件夹存放证书文件。

cd /www/server/nginx
 mkdir cert

3、nginx.conf 配置

编辑 /www/server/nginx/conf/nginx.conf 配置文件,注意:这里需要在安全组中开放443端口。

server {
        listen                    443 ssl http2;
        listen                    [::]:443 ssl http2;
        server_name               ceshi.cn *.ceshi.cn;
        ssl_certificate  /www/server/NginxwwwKey/BlogCert/ceshi.cn.pem;
        ssl_certificate_key /www/server/NginxwwwKey/BlogCert/ceshi.cn.key;
        ssl_session_timeout       1d;
        ssl_protocols             TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers off;
        ssl_ciphers               ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
        ssl_session_cache         shared:SSL:10m;
        ssl_session_tickets       off;
        ssl_stapling              off;

        add_header X-Frame-Options DENY;
        add_header X-Content-Type-Options nosniff;

        #Redirects all traffic
        location / {
            proxy_pass https://127.0.0.1:5005;
        }
    }

编辑完成保存配置,重载配置,重启Nginx即可,https生效。

但是如果现在关闭shell 打开页面会出现502,需要启动保护进程。

7、安装Supervisor

 Supervisor 是用 Python 开发的 Linux/Unix 系统下的一个进程管理工具。它可以使进程脱离终端,变为后台守护进程(daemon)。实时监控进程状态,异常退出时能自动重启。

Supervisor 不支持任何版本的 Window 系统;仅支持在 Python2.4 或更高版本,但不能在任何版本的 Python 3 下工作。

其主要组成部分:

supervisord:Supervisor 的守护进程服务,用于接收进程管理命令;

supervisorctl:Supervisor 命令行工具,用于和守护进程通信,发送管理进程的指令;

Web Server:Web 端进程管理工具,提供与 supervisorctl 类似功能,管理进程;

XML-RPC Interface:提供 XML-RPC 接口,请参阅 XML-RPC API文档。

1、安装Supervisor

联网状态下,官方推荐首选安装方法是使用easy_install,它是setuptools(Python 包管理工具)的一个功能。所以先执行如下命令安装 setuptools:

#安装 setuptools
yum install python-setuptools
#更换root用户,执行如下命令安装 Supervisor
easy_install supervisor
#验证是否安装成功方式
#(一)输出配置
echo_supervisord_conf
#(二)启动supervisorctl输入version返回版本号则成功
supervisorctl>version
#(三)查看程序运行进程号有返回则成功
pgrep supervisord

2、创建文件夹和配置文件

#创建文件夹
mkdir /etc/supervisor
#配置Supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf

3、修改并保存/etc/supervisor/supervisord.conf文件内容

#拉到文章最后
;[include]
;files =  relative/directory/*.ini

改为
[include]
files = conf.d/*.conf

4、进入创建的conf.d 文件夹创建文件 ceshi.conf,并写入配置

#配置程序名称
[program:ceshi]
#运行程序的命令
command=dotnet ceshi.dll --urls="http://*:5005"
#命令执行的目录
directory=/www/wwwceshi
#进程执行的用户身份
user=root
#进程挂掉后自动重启的三个选项,false,unexpected和true。如果为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的退出码的时候,才会被自动重启。当为true的时候,只要子进程挂掉,将会被无条件的重启
autorestart=true
#进程环境变量
environment=ASPNETCORE_ENVIRONMENT=Production
#错误日志文件
stderr_logfile=/var/log/ceshi.err.log
#输出日志文件
stdout_logfile=/var/log/ceshi.out.log    
#进程停止信号,可以为TERM, HUP, INT, QUIT, KILL, USR1, or USR2等信号默认为TERM 。当用设定的信号去干掉进程,退出码会被认为是expected,非必须设置
stopsignal=INT
#如果是true的话,子进程将在supervisord启动后被自动启动,默认就是true,非必须设置
autostart=true
#这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了,默认值为1 。非必须设置
startsecs=3

5、重新加载Supervisor配置,查看Supervisor运行的进程

#执行进程
supervisord -c /etc/supervisor/supervisord.conf

#查看进程
ps aux | grep ProjectName

#进入进程控制
supervisorctl

如果出现以下显示则表示运行成功!

 

注意:在执行第一条命令出现以下提示信息时:

Error: Another program is already listening on a port that one of our HTTP servers is configured to use.  Shut this program down first before starting supervisord.

For help, use /usr/bin/supervisord –h

是因为有一个使用supervisor配置的应用程序正在运行,需要执行supervisorctl shutdown命令终止它,或重新创建一个ProjectName.conf文件再执行第一条命令

其他常用命令


一、开启命令
supervisor的服务器端部分启动命令:
sudo unlink /var/run/supervisor.sock
supervisord -c /etc/supervisor/supervisord.conf      此时默认开启了所有服务

二、supervisor的客户端部分命令:
supervisorctl status 查看进程运行状态
supervisorctl start 进程名 启动进程
supervisorctl start laravel-worker:*   批量启动进程
supervisorctl stop 进程名 关闭进程
supervisorctl restart 进程名 重启进程
supervisorctl update 重新载入配置文件
supervisorctl shutdown 关闭supervisord
supervisorctl clear 进程名 清空进程日志
supervisorctl 进入到交互模式下。使用help查看所有命令
supervisorctl reread    
supervisorctl update   上面两个命令是修改supervisor配置文件后,需要运行才能生效的命令
start stop restart + all 表示启动,关闭,重启所有进程

三、关闭命令
supervisorctl stop all先关闭supervisor服务
之后再关闭supervisord服务
kill -9 pid

四、查看错误信息
#查看启动时具体报错信息
supervisorctl tail program_name stdout 
#查看启动报错日志
sudo supervisorctl tail program_name stderr

6、配置supervisord开机启动

(1)在指定目录下创建文件supervisord.service

vim /usr/lib/systemd/system/supervisord.service

(2)输入以下内容并保存退出

[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

(3)执行以下命令

systemctl enable supervisord

#提示:
Created symlink from /etc/systemd/system/multi-user.target.wants/supervisord.service to /usr/lib/systemd/system/supervisord.service.

(4)验证是否为开机启动:

systemctl is-enabled supervisord

提示:enabled 表示设置成功!

至此,创建supervisor守护进程完毕。

你可能感兴趣的:(Linux,.net,core,服务器,linux,.netcore)