Ubuntu系统部署.net core 项目 并开机自启动
一、使用远程工具连接服务器
-
可以使用 Xshell 工具远程(百度下载破解版),这里使用的是 Tabby :
#Tabby下载地址:https://tabby.sh/ #连接服务器 (ip地址:192.168.194.128 用户名:dunhao, 密码:123456) #查看ip地址: ifconfig -a 根据提示安装 net-tools sudo apt install net-tools #检查SSH是否开启(Ubuntu默认是不安装SSH服务的) ps -e|grep ssh # 安装SSH sudo apt-get install ssh # 启动SSH服务 sudo /etc/init.d/ssh start # 修改SSH配置文件(可以更改包括端口、是否允许root登录等设置、配置文件位置) /etc/ssh/sshd_config #默认是不允许root远程登录的,可以在配置文件中开启 sudo vim /etc/ssh/sshd_config 找到PermitRootLogin without-password 修改为PermitRootLogin yes # 重启SSH服务 service ssh restart
二、安装程序运行环境
-
安装.net core 环境( .net core 2.1 )
# 更新环境 sudo apt-get update wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb rm packages-microsoft-prod.deb # 安装SDK sudo apt-get install apt-transport-https sudo apt-get update sudo apt-get install dotnet-sdk-2.1 # 验证SDK安装情况 dotnet --info
-
安装 Nginx
# 参考文档地址:https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-20-04 # 安装 sudo apt update sudo apt install nginx # 设置防火墙 sudo ufw allow 'Nginx HTTP' # 查看状态 sudo ufw status # 停掉服务 sudo systemctl stop nginx # 开启服务 sudo systemctl start nginx # 重启服务 sudo systemctl restart nginx
-
安装 Mysql
# 安装 mysql 5.7.21 数据库 # 更新 sudo apt-get update sudo apt-get upgrade # 安装 官网下载 mysql-server_5.7.36-1ubuntu18.04_amd64.deb-bundle.tar mkdir mysql5.7.36 # 解压 sudo tar -vxf mysql-server_5.7.36-1ubuntu18.04_amd64.deb-bundle.tar # 用dpkg 进行安装 sudo dpkg -i mysql-*.deb # 解决报错 (必须联网) sudo apt-get install libtinfo5 sudo apt-get install libmecab2 # 安装成功后,开启远程连接 1. 连接数据库 mysql -uroot -p GRANT ALL PRIVILEGES ON *.* TO root@"192.168.194.128" IDENTIFIED BY "root" WITH GRANT OPTION; flush privileges; use mysql update user set host = '%' where user = 'root'; flush privileges; # 以上操作还是无法远程连接 1. 查看3306端口是否正常 修改mysql配置文件 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf 找到 bind-address = 127.0.0.1 # 前面加注#释掉 #bind-address = 127.0.0.1 # 重启 mysql 服务 service mysql restart 重新连接则成功 # 创建工位(会议数据库) 导入sql语句
## 三、项目部署
1. 前端:
```python
# nginx中部署前端wevb
etc/nginx/nginx.conf文件里, 也可以配置在子配置文件里etc/nginx/conf.d/default.conf。我这里为了配置方便,就配置在子文件里了。当然你也可以再新建一个文件,只要在conf.d文件夹下就可以了。
#在conf.d目录下新建一个test.conf文件:
touch test.conf
#打开test.conf文件:
vim test.conf
# 添加如下内容
server{
listen 8001;
server_name localhost;
root /usr/share/nginx/html/html8001;
index index.html;
}
# 然后在/usr/share/nginx/html目录下新建一个目录:
mkdir html8001
# 然后把项目放进去,重启nginx
sudo systemctl restart nginx
#访问 http://192.168.194.128:8001
# 设置nginx开机自启动 (按照上面方式默认已经自启动了)
我们需要在 /etc/init.d/目录下创建一个nginx的脚本文件,命令 vi nginx 输入以下内容
#! /bin/sh
# Author: rui ding
# Modified: Geoffrey Grosenbach http://topfunky.com
# Modified: Clement NEDELCU
# Reproduced with express authorization from its contributors
set -e
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="nginx daemon"
NAME=nginx
DAEMON=/usr/local/nginx/sbin/$NAME
SCRIPTNAME=/etc/init.d/$NAME
# If the daemon file is not found, terminate the script.
test -x $DAEMON || exit 0
d_start() {
$DAEMON || echo -n " already running"
}
d_stop() {
$DAEMON –s quit || echo -n " not running"
}
d_reload() {
$DAEMON –s reload || echo -n " could not reload"
}
case "$1" in
start)
echo -n "Starting $DESC: $NAME"
d_start
echo "."
;;
stop)
echo -n "Stopping $DESC: $NAME"
d_stop
echo "."
;;
reload)
echo -n "Reloading $DESC configuration..."
d_reload
echo "reloaded."
;;
restart)
echo -n "Restarting $DESC: $NAME"
d_stop
# Sleep for two seconds before starting again, this should give the
# Nginx daemon some time to perform a graceful stop.
sleep 2
d_start
echo "."
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart|reload}" >&2
exit 3
;;
esac
exit 0
# 然后输入命令
update-rc.d –f nginx defaults
# 如果要取消开机自启动:
update-rc.d -f nginx remove
补充资料:
/etc/init.d/里存放了所有的启动脚本,我们平时可以通过/etc/init.d/脚本名 启动模式 来启动某个应用。 例如输入命令“/etc/init.d/smb start”来启动smb服务。 如果是在RedHat系统下,还可以通过service smb start来启动某个服务。
尽管/etc/init.d目录中的脚本可以启动和停止各个服务,但在系统引导时,init并不是直接在/etc/init.d目录下找各个服务的启动脚本,而是在/etc/rc.d/目录下查找,该目录包含rc0.d、rc1.d等分别代表不同的init启动级别的子目录。
你可以用Runlevel命令查看当前你的系统是在那个运行级
#Runlevel
N 2
注:我当前的系统是2级
接着来看看这些rcx.d的目录下所包含的内容,内容全是一些符号链接,链接到上一级init目录中的脚本上。 这些符号链接名称都以S或K开头,后面跟一个数字以及该脚本所控制的服务名,例如S10network。 当init从低的运行级向高的运行级过渡时,它按照数字递增的顺序运行所有以S开头的脚本,S=start,即启动脚本对应的服务;K=kill,即杀死脚本对应服务。
前面介绍到rcx.d目录下指向启动脚本的符号链接是由K或S+数字+服务名 所组成,中间这个数字十分重要,系统启动时按照这个数字递增执行所有S开头的脚本,系统关闭时按照这个数字递减执行所有K开头的脚本。
如何自定义符号链接? 启动脚本: 因为我刚才的运行级是2级 所以在/etc/rc.d/rc2.d 目录下运行
#ln -s /etc/init.d/nginx S99nginx //重新定义nginx服务的脚本启动顺序
nginx
```
2. 后台:
```python
# 在home文件夹下wwwroot 文件夹
mkdir wwwroot
# 下面可自行创建文件夹,把后台项目放进对应的文件夹即可(我的是在 /home/dunhao/wwwroot/deskbook 下)
# 用Xftp 工具把项目文件放到文件夹下面 ( tabby工具文件夹没法传 )
# 部署完成后对项目设备开机自启动
这里使用 Supervisor
官网地址:http://supervisord.org/
# Supervisor
# 安装
sudo apt-get install supervisor
# 你也可以使用pip安装
pip install supervisor
官方安装教程:http://supervisord.org/installing.html
# 安装完之后我们配置自启动配置文件,配置文件目录为:
/etc/supervisor/conf.d/
# 我们创建一个配置文件
sudo touch deskbook.conf
sudo vim deskbook.conf
# 加入如下
[program:GeduDistributionApi]
command=dotnet GeduDistributionApi.dll
directory=/home/dunhao/wwwroot/deskbook # 项目地址
environment=ASPNETCORE__ENVIRONMENT=Production
command=sh frp.sh
autostart=true
autorestart=true
startretries=100
redirect_stderr=true
stdout_logfile=/home/dunhao/wwwroot/deskbook/out.log
官方给出的详细的参数设置文档:http://supervisord.org/configuration.html
# 重启生效
sudo service supervisor stop
sudo service supervisor start
#发布文件之后重启生效的命令
service supervisor restart
# 检查 Supervisor 状态
配置之后,我们可以检查一下 Supervisor 状态。首先确认是否运行:
ps aux | grep supervisor
一般都能看到对应进程。
# 设置 Supervisor开机自动启动
如果我们是使用 apt 安装的,一般来说会自动设置好开机启动,这也是为什么文章开头推荐使用 apt 进行安装的理由。但是如果你重启之后发现没有开机自动启动,可以按照下面的方法配置。(我的并没有)
把下面的命令写进 rc.local 即可:
/usr/bin/supervisord
# Ubuntu 配置 rc.local
Ubuntu 18.04 的改动还是比较大,很多之前版本 Ubuntu 上简单易用的一些功能都被砍了,比如设置 rc.local 自动启动脚本的功能。之前的 Ubuntu 上只需要把想要自动启动的脚本放到 /etc/rc.local 这个文件,就可以开机启动了,但是 Ubuntu 18.04 这样做已经不行了,因为 rc-local.service 这个 systemd service 已经默认不启用了。所以我们所需要做的就是重新启用 rc-local.service,然后就可以像之前一样简单的设置开机自动启动脚本了。
# 创建 rc-local.service 配置文件
这个配置文件默认在 /lib/systemd/system/ 这个目录下,我们只需将它拷贝到对应目录:
sudo cp /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service
然后编辑这个文件:
sudo vim /etc/systemd/system/rc-local.service
最后加上这些内容
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
修改后的 rc-local.service 文件完整如下:
# SPDX-License-Identifier: LGPL-2.1+
#
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.
[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
# 创建 rc.local 文件 (18.04 以后默认是没有/etc/rc.local这个文件夹的, 需要手动创建)
配置完成后,需要创建一个rc.local文件:
sudo vim /etc/rc.local
脚本内容为:
#!/bin/sh -e
cmd
exit 0
在这个文件里写入我们想要开机自动启动的命令即可,完整内容如下:
#!/bin/sh -e
cmd
/usr/bin/supervisord
exit 0
#然后给这个文件加上执行权限:
sudo chmod +x /etc/rc.local
至此,就已经完成了 rc.local 的配置,重启之后会自动启动对应想启动的脚本。
#如果发现没有生效,可以尝试:
sudo systemctl enable rc-local
# 拓展
systemctl start rc-local.service #启动服务
systemctl stop rc-local.service #暂停服务
systemctl status rc-local.service #查看状态
```