今天早早来到公司,这也是再公司搬址前在老地址待得最后一天,昨天把前面重要的一个任务也完成的差不多了,遂现在记录一下。
收到任务,要将公司的开发环境和生产环境配置在银河麒麟v10服务器上。这个服务器是向华为申请得到的,是arm架构,与项目中使用的x86架构不同,所以安装的时候也算是遇到了很多的坑。
首先如果我想要连接到那个服务器进行一系列的操作,我就必须得先提前连接一下VPN,这让我又学习了一下VPN的知识。
VPN
VPN是虚拟专用网,当我们的主机IP连接上VPN之后(VPN为了确保安全性,往往需要提供身份验证才能进行连接。),我们在公网上的IP地址也就变成了VPN转换后的IP地址,这样就可以访问到目标只能由特定IP地址访问到的资源了。连接成功后,你的真实IP地址会被VPN服务器的IP地址所替换。当你访问互联网时,外部服务器只会看到VPN服务器的IP地址,而看不到你的真实IP地址。这种IP地址替换可以让你访问只有特定IP地址才能访问的资源。例如,公司内部的某些系统可能只允许来自特定IP地址的访问,通过VPN,你可以获得该特定IP地址的权限,从而访问这些资源。
学习了VPN之后,我又感觉它和我之前学习408的时候学到的NAT网络地址转换很像,于是我又去学习了一下NAT以区分他们两个。
NAT
NAT是网络地址转换。在实际应用中,NAT主要用于私有网络访问外部网络或外部网络访问私有网络的情况。当所有的内网ip要访问外网时,通过NAT转换后,所有的内网ip地址都会变成一个公共的外网ip地址。当外网地址要访问内部网络的时候,外网ip在经过NAT转换之后,会变成NAT转换器的IP地址以访问内部网络。
具体来说,NAT有以下两个好处:
- 通过使用少量的公有IP地址代表多数的私有IP地址,缓解了可用IP地址空间枯竭的速度。
- NAT可以隐藏私有网络,达到保护私有网络的目的。
关于二者的区别:
举个形象生动的例子:
VPN:像是一条安全的地下通道,你通过这条通道从你的家(电脑)到达公司的大楼(公司网络),通道中的所有信息都是加密的,确保没有人能在中途窥视你的数据。
NAT:像是一个中转站,所有的包裹(数据包)都会在这里被重新贴上标签(更换IP地址),然后再发送到目的地。中转站的作用是让多个包裹可以通过同一个地址(公共IP)被送出,同时也可以隐藏包裹的真实来源(内部网络结构)。
连接目标服务器
使用WindTerm软件新建会话,使用IP地址和用户名密码连接到的目标服务器,这样就可以在目标服务器上进行一系列操作了。
在使用了UniVPN这个软件并使用管理员给我提供的方式连接好了VPN之后,我就可以连接到目标鲲鹏服务器了。在进入服务器后,我输入命令uname -a查看到了关于本操作系统的一些基础信息。
之后我总共需要在改服务器上搭建以下组件,并设置好开发环境的配置文件。
Docker
首先我在该arm架构的服务器上要先安装Docker,虽然并不知道Docker是干嘛用的,并且也只是模模糊糊地知道一些镜像和容器地作用。但是我还是先安装了。
使用了下面这篇博客将Docker成功安装好。
https://www.cnblogs.com/haolb123/p/16506695.html
之后就要在Docker部署开发环境了。
但是紧接着在使用Docker pull的过程中,发现所有的国内所有的镜像都已经被封禁掉了,根本拉去不到镜像到本地,并且之前在x86架构下跑的开发环境所用的镜像也都是x86架构,无法在arm架构上运行(在经历了一番docker export 打成jar包,在上传到目标服务器上进行docker load之后,发现确实无法使用。)
于是Docker算是白安装了,接下来要在物理机上直接配置环境,不使用Docker这个工具了。
MySQL
项目需要使用到数据库也就是MySQL数据库,我根据下面这篇博客在服务器上安装好了arm架构的MySQL5.7版本。
https://blog.csdn.net/wochunyang/article/details/132883654
文章中有个疏漏,就是在执行
mysql -u root -h 127.0.0.1 -p
命令之后,需要输入密码,而这是第一次登录mysql,初始密码在初始化的时候产生的日志里面。
这样MySQL也是安装好了。
Nacos
下一步是安装Nacos。由于Nacos执行脚本里面依赖JAVA环境。所以要先配置好JAVA环境。我使用的JAVA是,bisheng-jdk1.8.0_412。
我在/etc/profile文件中,添加如下脚本。这样就可以修改全局的java环境。
之后在nacos的执行脚本中看好对应有关java的配置是否正确,如果正确即不需要修改,如果不正确就修改为所需要的java路径。
nacos的执行脚本如下所示:
其中有关java环境的配置。
之后即可使用命令sh startup.sh -m standalone启动nacos。后面加个 -m standalone是设置为单机模式启动,而非集群模式。
我根据以下博客将nacos设置成了开机自启。
nacos配置开机自启_nacos设置开机自启-CSDN博客
Seata
在这之后就是Seata的安装和配置。
seata安装在下面这个目录下。
进入bin目录下,可以看到关于seata的一些脚本。
其中start_seata-demo.sh脚本中的内容是下图所示,它用来执行同级的seata-server.sh脚本并指定了端口号和主机地址。
而seata-server.sh脚本才是执行seata的脚本。其中内容是
#!/bin/sh
# ----------------------------------------------------------------------------
# Copyright 2001-2006 The Apache Software Foundation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ----------------------------------------------------------------------------
#
# Copyright (c) 2001-2006 The Apache Software Foundation. All rights
# reserved.
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ]; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
PRGDIR=`dirname "$PRG"`
BASEDIR=`cd "$PRGDIR/.." >/dev/null; pwd`
# Reset the REPO variable. If you need to influence this use the environment setup file.
REPO=
# OS specific support. $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
case "`uname`" in
CYGWIN*) cygwin=true ;;
Darwin*) darwin=true
if [ -z "$JAVA_VERSION" ] ; then
JAVA_VERSION="CurrentJDK"
else
echo "Using Java version: $JAVA_VERSION"
fi
if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then
JAVA_HOME=`/usr/libexec/java_home`
else
JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/${JAVA_VERSION}/Home
fi
fi
;;
esac
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=`java-config --jre-home`
fi
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
[ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi
# If a specific java binary isn't specified search for the standard 'java' binary
if [ -z "$JAVACMD" ] ; then
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
else
JAVACMD=`which java`
fi
fi
if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly." 1>&2
echo " We cannot execute $JAVACMD" 1>&2
exit 1
fi
if [ -z "$REPO" ]
then
REPO="$BASEDIR"/lib
fi
CLASSPATH="$BASEDIR"/conf:"$REPO"/*
ENDORSED_DIR=
if [ -n "$ENDORSED_DIR" ] ; then
CLASSPATH=$BASEDIR/$ENDORSED_DIR/*:$CLASSPATH
fi
if [ -n "$CLASSPATH_PREFIX" ] ; then
CLASSPATH=$CLASSPATH_PREFIX:$CLASSPATH
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
[ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
[ -n "$HOME" ] && HOME=`cygpath --path --windows "$HOME"`
[ -n "$BASEDIR" ] && BASEDIR=`cygpath --path --windows "$BASEDIR"`
[ -n "$REPO" ] && REPO=`cygpath --path --windows "$REPO"`
fi
exec "$JAVACMD" $JAVA_OPTS -server -Xmx2048m -Xms2048m -Xmn1024m -Xss512k -XX:SurvivorRatio=10 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:MaxDirectMemorySize=1024m -XX:-OmitStackTraceInFastThrow -XX:-UseAdaptiveSizePolicy -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="$BASEDIR"/logs/java_heapdump.hprof -XX:+DisableExplicitGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -Xloggc:"$BASEDIR"/logs/seata_gc.log -verbose:gc -Dio.netty.leakDetectionLevel=advanced -Dlogback.color.disable-for-bat=true \
-classpath "$CLASSPATH" \
-Dapp.name="seata-server" \
-Dapp.pid="$$" \
-Dapp.repo="$REPO" \
-Dapp.home="$BASEDIR" \
-Dbasedir="$BASEDIR" \
io.seata.server.Server \
"$@"
虽然我也看不懂。但内容就是这些。seata启动依赖数据库和nacos的启动,所以如果要将seata设置为开机自启的服务,得再seata.service中添加好让它的启动再nacos和数据库的启动之后。
Minio
我也不知道minio是干嘛用的,所以按照下面博客安装好了并且设置了开机自启后也没出现什么问题,比较简单。
单机部署MinIo并设置开机自启_minio开机自启动-CSDN博客
开机自启
在整个配置的过程中,我学会了如何将一个服务设置为开机自启服务。
网上一共有三种设置linux服务为开机自启的方式,在这里我采用其中一种。
使用Systemd添加开机自启动服务
systemd 是系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程。
对于Systemd详细信息,可以查看下面内容:
Fedora wiki: Systemd/zh-cn:https://fedoraproject.org/wiki/Systemd/zh-cn
systemd.service 官方手册:https://fedoraproject.org/wiki/Systemd/zh-cn
systemd.service 中文翻译:http://www.jinbuguo.com/systemd/systemd.service.html#
使用写出所需要的服务app的配置文件,注意要根据具体服务启动的要求写出来。
# 启动顺序与依赖关系
[Unit]
Description=My app Startup Test Service
After=network.target
# 启动行为
[Service]
Type=simple
WorkingDirectory=/home/ubuntu/app/
ExecStart=/home/ubuntu/app/app.bin
Restart=always
RestartSec=0s
KillMode=mixed
# 定义如何安装配置文件
[Install]
WantedBy=multi-user.target
- 首先将 app.service 文件复制到 /etc/systemd/system/ 或者 /usr/lib/systemd/system/(如果在 /usr/lib/systemd/ 下没有system目录,则手动创建一个即可)。
- 添加或修改配置文件后,需要重新加载,使用指令:sudo systemctl daemon-reload,sudo 可省,会自动弹出输出密码的对话框。
- 设置允许自启动,使用指令:sudo systemctl enable app.service(后缀.service可以省略)
至此,自定义的应用程序可以在下次开机的时候自动启动了,
常用的一些指令如下所示。
- 启动:sudo systemctl start app.service
- 激活开机启动:sudo systemctl enable app.service
- 取消开机启动:sudo systemctl disable app.service
- 启动服务:sudo systemctl start app.service
- 停止服务:sudo systemctl stop app.service
- 重启服务:sudo systemctl restart app.service
- 重载服务:sudo systemctl daemon-reload
- 察看运行情况:sudo systemctl status app.service
- 查看所有已启动的服务:sudo systemctl list-units --type=service
注意点
后来在的过程中遇到了很多问题,例如就遇到了内存不足的问题。使用free -m可以以mb的形式查看当前的内存使用情况。后来发现是启动的java程序太多了。每个都占了1个多g的内存,可能是因为在搭建java环境的时候下载了很多的java也开启了很多的java,后来在重启服务器之后,内存就够了。
ps命令可以查看当前的进程。kill命令可以根据pid杀掉进程。
which java可以看见java的路径。
系统配置在/etc/profile
whoami可以看当前的用户是哪个。
cat 文件路径 用于显示文件内容
chmod赋予文件权限。
ps -a | grep minio 查看所有正在运行的进程,并过滤出包含“minio”字符串的进程。
reboot用于重启。