最近一次工作中,涉及python与.net core,应用开发完成,自然就需要在服务器上部署。

  • 服务器:Centos 7.8

  • 部署程序

    • .net core webapi
    • python gRPC服务端

1.安装并配置python3相关

centos7自带python2,但是我们的脚本是python3编写

$yum install python3

1.1 修改pip软链接

# 删除原有pip软链接
$rm -rf /usr/bin/pip

# 为pip3建立软链接
$ln -s /bin/pip3 /bin/pip

友情提醒:这里不建议修改python的软链接,因为yum依赖python老版本,所以只修改了pip的软链接,原有centos甚至可能并没有安装pip,所以谈不上修改,只是建立,但是安装python3时,确实装了pip3的。

1.2 配置pip

pip在国内下某些依赖可能会很慢,建议修改代理。

$cd ~
$mkdir .pip
$vi .pip/pip.conf

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = pypi.tuna.tsinghua.edu.cn

# 保存
# Esc :wq

1.2 安装脚本依赖的第三方包

#先更新下pip
$pip install --upgrade pip setuptools

#安装git
$yum install git

#远程下载并安装所需第三方依赖包(仅是我程序需要的)
$pip install --upgrade git+https://gitee.com/RandyField/vsphere-automation-sdk-python.git

# 上面的命令可能有有些许问题,安装不成功,有点玄学 
# git clone ,然后本地安装
$cd /home/app/
$git clone https://gitee.com/RandyField/vsphere-automation-sdk-python.git
$cd vsphere-automation-sdk-python
$python3 setup.py install

# 安装其他依赖
$pip install pyvmomi #vmare sdk

#python grpc依赖包
$python3 -m pip install grpcio 
$python3 -m pip install grpcio-tools

2.安装node.js

我们使用pm2来守护我们的应用程序,在比较了其他守护进程工具之后,觉得pm2真心简单好用,pm2依赖node.js,所以需要安装node.js,使用许多方法,目测下面命令是最简单有效的。

$curl --silent --location https://rpm.nodesource.com/setup_12.x | bash -

$sudo yum install -y nodejs

3.安装.Net Core Runtime

3.1 发布应用

.Net Core有两种发布方式,一种是依赖运行时,其要求服务器必须安装.Net Core Runtime,一种是Self-contained(自包含),他不依赖任何运行时,直接就是一个可执行文件,可直接运行。

依赖运行时的二进制文件

#依赖运行时
$dotnet publish -r linux-x64 --self-contained false -o publish

Self-contained

#.Net Core Self-contained
$dotnet publish -c Release -r linux-x64 --self-contained true -p:PublishSingleFile=false -p:PublishTrimmed=true -o publish-linux-x64

由于我们是发布至Centos,所以选择了RID:linux-x64 ,按照官方的说法,这个RID:Most desktop distributions like CentOS, Debian, Fedora, Ubuntu, and derivatives,兼容大多数linux桌面发行版,如CentOS、Debian、Fedora、Ubuntu及其衍生物。更多具体的RID,请参考官方说明,按需选择。

3.2 安装运行时

网络环境不错,最终还是选择依赖运行时的发布方式,所以需要安装.net core运行时,参考官方即可

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

$sudo yum install aspnetcore-runtime-3.1

$sudo yum install dotnet-runtime-3.1

4.安装和使用pm2

node.js已经安装完成,接下来我们安装pm2吧。

4.1 安装pm2

$ npm install pm2@latest -g

4.2 使用pm2运行python脚本

$pm2 start "python3 grpcServer.py" --name vsphereDataPy --watch

4.3 使用pm2运行.net core app

$cd publish
$pm2 start " dotnet Vmware.Sphere.Api.dll" --name vsphereDataApi --watch

# 查看一下两个应用的状态,有木有挂掉
$pm2 list

# 查看一下日志,有没有什么报错
$pm2 log

4.4 其他命令

# 重启
$pm2 restart vsphereDataApi

# 重载
$pm2 reload vsphereDataApi

# 停止
$pm2 stop vsphereDataApi

# 删除
$pm2 delete vsphereDataApi
$pm2 delete vsphereDataApi

# 运行日志
$pm2 logs vsphereDataApi

# pm2 守护的应用列表
$pm2 list

# 设置开机启动
$pm2 startup

# 取消开机自启
$pm2 unstartup

4.5 命令详解

命令 说明
pm2 startup 设置pm2开机自启动
pm2 unstartup 移除pm2开机自启动
pm2 save 保存当前进程开机自启动
pm2 start <进程启动命令> [–name <进程名>] 启动应用程序
pm2 list 显示所有进程状态
pm2 monit 监控进程
pm2 logs [进程id或名字] 显示进程日志
pm2 stop [all] 停止[所有]进程
pm2 restart [all] 重启[所有]进程
pm2 delete [<进程名或者id>,all] 删除指定[所有]进程
pm2 info [进程id或名字] 查看应用程序信息

更多内容,参考官方

5.配置IP

我们的服务器还没有具体指明ip,Centos下配置IP地址,有两种方法:

  • 修改网卡配置文件
  • 图形化配置界面:nmtui

5.1 修改网卡配置文件

CentOs7是可以通过网卡配置文件进行ip修改的。

$vi /etc/sysconfig/network-scripts/ifcfg-ens-{根据实际环境}

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
#BOOTPROTO="dhcp"
#IP的配置方法[none|static|bootp|dhcp](引导时不使用协议|静态分配IP|BOOTP协议|DHCP协议)
BOOTPROTO="static" 
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="ac9b66bf-74fb-4bda-b89f-c66ff84c9571"
DEVICE="ens{实际环境}"
ONBOOT="yes"
#ip地址
IPADDR=192.168.0.50
#子网掩码
NETMASK=255.255.255.0
#网关
GATEWAY=192.168.0.1
DNS1=119.29.29.29
DNS2=8.8.8.8

#重启网络服务
$systemctl restart network

5.2 nmtui

这是别人告诉我的,算长姿势吧,至少我以前没用过,直接图形化界面就可以修改。可以谷歌一下nmtui即可,应该会有大量篇幅介绍,图文并茂。扔一个链接,不赘述。

6.开放端口

由于python gRPC服务端由内部程序访问,无需暴露端口,但是.net core webapi需要让外部访问,就必须开发端口,Centos7开发端口使用firewall,记得以前的6,用firewall在某些环境下(腾讯云)并不起作用,还用的iptable

# 开发端口
firewall-cmd --zone=public --add-port=5000/tcp --permanent   # 开放5000端口
firewall-cmd --reload  

# 查看防火墙所有开放的端口
firewall-cmd --zone=public --list-ports

# 关闭防火墙
systemctl stop firewalld.service

# 查看防火墙状态
firewall-cmd --state

# 查看监听的端口
netstat -lnpt

7.结语

至此,我们可以用我们已经配置的ip地址和开放的端口号,访问.net core webapi,并由webapi内部调用python gRPC服务端,获取所需数据。

参考链接

https://blog.csdn.net/qq_21386275/article/details/79881543

https://www.linuxprobe.com/soft-hard-links-comments.html

https://blog.csdn.net/wushiqi11/article/details/104673953/

https://nodejs.org/zh-cn/download/package-manager/

https://yoember.com/nodejs/the-best-way-to-install-node-js-with-yarn/

https://github.com/nodesource/distributions/blob/master/README.md

https://www.jianshu.com/p/9cab8f7020c1

https://pm2.keymetrics.io/docs/usage/quick-start/

https://www.cnblogs.com/yhongji/p/9336247.html