0%

虚拟机的初始准备及一般操作

前言

当我们新建一台虚拟机(或新购买一台云服务器),我们应该做的一些基础设置,或者需要安装的一些软件。这篇博客我们来介绍一下这些设置。

网络设置

1. 设置静态IP和DNS
  • 注:根据需求设置,一般云服务器ip已经固定,可以不用设置静态ip;DNS根据是否要有vpn设置,但是“8.8.8.8”和“114.114.114.114”的设置可以满足大部分场景

​ (1) 运行命令查看当前ip及网关

1
2
3
4
# 查看ip
ip addr
# 查看网关
ip route


​ (2) 根据查看到的网卡名称打开对应的配置文件,配置ip、网关、dns等参数

1
sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0
1
2
3
4
5
6
7
8
9
10
TYPE="Ethernet"
BOOTPROTO="none" # 使用 'none' 来表示静态 IP 配置,而不是 DHCP
NAME="eth0" # 网卡名称
DEVICE="eth0" # 网卡设备名称
ONBOOT="yes" # 网络启动时激活该接口
IPADDR="10.6.0.3" # 静态 IP 地址
NETMASK="255.255.255.0" # 子网掩码
GATEWAY="10.6.0.1" # 网关地址
DNS1="8.8.8.8" # 第一个 DNS 服务器
DNS2="8.8.4.4" # 第二个 DNS 服务器

​ (3) 保存配置文件后,需要重启网络服务以应用更改

1
2
3
4
# centos7
sudo systemctl restart network
# centos8
sudo nmcli connection reload
2. 防火墙设置
  • 方案1:关闭防火墙【不推荐】
1
2
3
4
#关闭防火墙
systemctl stop firewalld
#开机禁用
systemctl disable firewalld
  • 方案2:将我们需要的端口开放
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 查看防火墙状态
firewall-cmd --state
#
systemctl status firewalld
# 启动防火墙
systemctl start firewalld
# 开机启用
systemctl enable firewalld

# 永久添加 7100 端口
firewall-cmd --add-port=7070/tcp --permanent
firewall-cmd --add-port=7070/udp --permanent
# 移除已经开发的端口
firewall-cmd --permanent --remove-port=8080/tcp
# 重新载入配置,比如添加规则之后,需要执行此命令
firewall-cmd --reload
# 查看已开放的端口
firewall-cmd --zone=public --list-ports
  • 注意:如果你使用的是云服务器,还要到对应页面添加规则,将对应端口在云服务器上开放

安装基础软件(并不是要求全部安装,可根据需求安装)

1. 安装yum相关

​ (1)验证是否安装了yum(通常系统会自行安装)

1
yum --version

​ (2)如果没有安装,通过以下命令获取yum并执行安装

1
2
3
4
5
# 获取yum文件
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/yum-3.4.3-167.el7.centos.noarch.rpm

# 执行安装
sudo rpm -ivh yum-3.4.3-167.el7.centos.noarch.rpm

​ (3)安装**yum-utilsdevice-mapper-persistent-datalvm2**

1
yum install -y yum-utils device-mapper-persistent-data lvm2

​ (4)在yum中设置docker的阿里云镜像(提高docker安装软件时的下载速度,也可以设置其他来源镜像)

1
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

​ (5) 更新yum软件包索引

1
2
3
4
# centos7
yum makecache fast
# centos8
yum makecache --refresh

​ (6) 验证yum是否安装成功

1
yum --version
  • 注:如果已经安装了yum,但使用yum安装其他软件时(如docker-ce)出现错误:

    1
    2
    3
    4
    已加载插件:fastestmirror
    Loading mirror speeds from cached hostfile
    Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was
    14: curl#6 - "Could not resolve host: mirrorlist.centos.org; 未知的错误"

    出现这个问题是因为使用的 CentOS 7 仓库已经被归档,当前的镜像地址无法找到所需的文件(CentOS 7 的官方支持已经结束,官方仓库在 2024 年 6 月 30 日之后已经停止维护,部分仓库已被移至归档库,这导致了你的 yum 命令无法找到所需的元数据文件,因此使用 CentOS 7 的官方仓库可能会遇到问题)。

    我们需要设置为国内的镜像源(如阿里云),命令如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # centos7
    curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
    # centos8
    # 备份原来的CentOS-Linux-BaseOS.repo 文件
    mv /etc/yum.repos.d/CentOS-Linux-BaseOS.repo /etc/yum.repos.d/CentOS-Linux-BaseOS.repo.backup
    # 我的centos8的/etc/yum.repos.d目录中有一个 CentOS-Linux-AppStream.repo文件,将这个文件也备份
    mv /etc/yum.repos.d/CentOS-Linux-AppStream.repo /etc/yum.repos.d/CentOS-Linux-AppStream.repo.backup
    # 从阿里云下载新的配置文件
    curl -o /etc/yum.repos.d/CentOS-Linux-BaseOS.repo https://mirrors.aliyun.com/repo/Centos-8.repo

    然后执行命令查看阿里云镜像源是否被添加:

    1
    cat /etc/yum.repos.d/CentOS-Base.repo

    执行命令让阿里云镜像源生效:

    1
    2
    sudo yum clean all
    sudo yum makecache

    再执行(3)~(5)步,建立正确的元数据缓存

2. 安装gcc、gcc-c++
  • 注:这里用yum方式安装,要先安装yum
1
2
3
yum -y install gcc

yum -y install gcc-c++
3. 安装jdk

​ (1)将jdk文件上传(或下载)到linux服务器

1
2
3
4
# 上传
rz -e
# 下载
wget '文件url'

​ (2)将文件解压到合适目录

1
tar -zxvf /usr/local/lib/jdk/jdk-8u421-linux-x64.tar.gz

​ (3)修改环境变量

1
2
3
4
5
vi /etc/profile

export JAVA_HOME='解压后的jdk文件夹路径'
export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin

​ (4)使配置的环境变量生效

1
source /etc/profile

​ (5)验证安装完成

1
java -version
  • 注意:安装jdk的方式不止一种,也可以使用yum命令安装(需要先安装yum)
1
2
3
sudo yum install -y java-1.8.0-openjdk

sudo yum install -y java-11-openjdk-devel

4. 安装maven

​ (1)将文件上传或下载到服务器

1
2
3
4
# 上传
rz -e
# 下载
wget '文件url'

​ (2)将文件解压到合适目录

1
tar -zxvf /usr/local/lib/maven/apache-maven-3.9.7-bin.tar.gz

​ (3)修改环境变量

1
2
3
4
5
vi /etc/profile

export MAVEN_HOME='解压后的maven文件夹路径'
# 这里将':$MAVEN_HOME/bin'加到PATH变量最后,结果不一定与下文完全一致
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin

​ (4)使配置的环境变量生效

1
source /etc/profile

​ (5)验证安装成功

1
mvn -v

​ (6)maven的常用命令

1
2
3
4
5
6
7
8
9
10
11
12
1、mvn compile 
2、mvn test
3、mvn clean
4、mvn package
5、mvn install
6、mvn deploy
7、mvn versions:set -DnewVersion=xxxx 设置Maven的版本
8、mvn dependency:tree 查看maven的依赖树(排查依赖很有效)

常用参数
-Dmaven.test.skip=true
-Dmaven.javadoc.skip=true
  • 注:安装maven的方式同样不止一种,也可以用yum方式安装,这里不再赘述
5. 安装docker

​ (1) 安装DOCKER CE(注意:Docker分为CE版和EE版,一般我们用CE版就够用了;这里用yum命令安装,需要先安装yum)

1
yum -y install docker-ce

​ (2) 验证是否安装成功

1
docker --version

​ (3) 启动docker

1
systemctl start docker

​ (4)设置阿里云镜像(提高docker安装软件时的下载速度,也可以设置其他镜像)

​ 登录阿里云容器镜像服务页面获取镜像地址(我的地址:https://rfe996n7.mirror.aliyuncs.com)

​ (5)编辑或创建 Docker 的配置文件,并添加镜像

1
2
sudo mkdir -p /etc/docker
sudo vi /etc/docker/daemon.json

​ 在配置文件daemon.json中添加镜像

1
2
3
{
"registry-mirrors": ["https://rfe996n7.mirror.aliyuncs.com"]
}

​ (6)加载配置文件并重启Docker让配置生效

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

​ (7)查看配置的镜像是否生效

1
docker info

​ (8)docker操作

​ - 进入docker容器

1
docker exec -it [容器名称或ID] /bin/bash
6. 安装docker-compose

​ (1)下载docker-compose

1
sudo curl -L "https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

​ (2)授予文件夹可执行权限

1
sudo chmod +x /usr/local/bin/docker-compose

​ (3)创建软链

1
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

​ (4)验证是否安装成功

1
docker-compose --version
  • 注:’/usr/bin’ 是一个标准的系统目录,存放着大多数系统命令;通过创建软链,可以在终端中直接使用’docker-compose‘命令,而不必每次输入全路径’**/usr/local/bin/docker-compose**‘,从而使命令调用更加方便

    1
    2
    3
    4
    # 没有创建软链
    /usr/local/bin/docker-compose up -d
    # 创建软链后
    docker-compose up -d
7. 安装systemd
  • 注:systemd是服务管理软件,如果不采用docker方式部署而是采用传统方式部署,则systemd非常有用

​ (1)yum方式安装(需要先安装yum)

1
yum install systemd

​ (2)创建并编辑配置文件(以frps.service 为例)

1
vi /etc/systemd/system/frps.service

​ 写入内容

1
2
3
4
5
6
7
8
9
10
11
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /opt/software/frp/frps -c /opt/software/frp/frps.toml
[Install]
WantedBy = multi-user.target

​ (3)常用systemd命令

1
2
3
4
5
6
7
8
9
10
11
12
# 启动frp
systemctl start frps
# 停止frp
systemctl stop frps
# 重启frp
systemctl restart frps
# 查看frp状态
systemctl status frps
# 配置 frps 开机自启
systemctl enable frps
# 禁止开机启动
systemctl disable frps
8. 安装npm

(1)下载npm安装包

1
wget https://npm.taobao.org/mirrors/node/v10.14.1/node-v10.14.1-linux-x64.tar.gz
  • 注:如果无法在云服务器下载,就在主机下载再上传

(2) 解压(到适当目录)

1
tar -xvf  node-v10.14.1-linux-x64.tar.gz

(3)添加环境变量(我的安装目录在:’/usr/local/lib/node-v10.14.1-linux-x64‘)

1
vi /etc/profile
1
2
export NODE_HOME=/usr/local/lib/node-v10.14.1-linux-x64
export PATH=$NODE_HOME/bin:$PATH
1
source /etc/profile

(4)可以设置镜像

1
npm config set registry https://registry.npmmirror.com

(5)检测是否成功

1
npm -v
8.1 安装并使用pm2

​ PM2 是一个流行的 Node.js 进程管理器,旨在简化 Node.js 应用程序的管理和监控;安装 PM2 之前需要先安装 Node.js,而 Node.js 包含了 npm;所以安装PM2之前要先安装npm;

1
npm install pm2 -g
  1. 启动应用
1
2
# 在启动前记得用“npm i”安装依赖
pm2 start app.js
  1. 查看进程状态
1
pm2 status
  1. 重启应用
1
pm2 restart app.js
  1. 停止应用
1
pm2 stop app.js
  1. 删除应用
1
pm2 delete app.js
  1. 查看日志
1
pm2 logs
9. 安装git
  • 注:这里使用下载安装包的安装方式,需要自己编译、安装,所以需要先安装一些依赖(包括gcc、gcc-c++);这里使用了yum命令,所以是需要先安装yum的
1
sudo yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel -y

(1)下载安装包

1
wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.37.2.tar.gz

(2)解压

1
tar -zxvf git-2.37.2.tar.gz

(3)编译

1
2
3
4
5
6
7
cd git-2.37.2
# 进入解压后的文件夹,使用命令’make‘编译
make
# 如果make命令不生效则需要使用如下命令安装开发包
sudo dnf install libcurl-devel
sudo dnf install openssl-devel
sudo dnf install expat-devel

(4)安装

1
2
# 安装到自己选择的目录(即prefix后跟随的目录)
make install prefix=/usr/local/lib/git-2.37.2

(5)修改环境变量

1
2
3
4
vi /etc/profile

export GIT_HOME=/usr/local/lib/git-2.37.2
export PATH=${GIT_HOME}/bin:$PATH
1
2
# 让环境变量生效
source /etc/profile

(6)验证是否安装成功

1
git -v
9.1 git的使用方法

(1)提交代码

1
2
3
4
5
6
7
8
9
10
# 查看当前分支代码状态
git status
# 将代码提交到暂存区
git add .
git add filename.txt
# 将暂存区的内容提交到版本库
git commit -m "描述本次提交的内容"
# 将本地仓库的提交(commits)推送到远程仓库(remote repository)
# git push <remote> <branch>
git push origin master

(2)新建分支/切换分支

1
2
3
4
5
6
# 查看现有的分支
git branch
# 新建分支
git checkout -b branchName
# 切换分支
git checkout branchName

(3)代码贮藏/弹出(得到一个‘clean work tree’,可以方便的切换到其他分支)

1
2
3
4
# 将还没有提交的代码贮藏
git stash
# 将已经贮藏的代码弹出
git stash pop

(4)使用远程仓库(默认的远程仓库引用为‘origin’)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看远程仓库
git remote -v
# 添加远程仓库
# <name>:你为远程仓库指定的名称,通常使用 origin 作为默认名称。
# <url>:远程仓库的地址,可以是 HTTPS、SSH 或 Git 协议的 URL。
git remote add <name> <url>
# 删除远程仓库
git remote remove <name>
# 修改远程仓库的 URL
git remote set-url <name> <newurl>
# 从远程仓库获取更新,但不会自动合并到本地分支。
git fetch <remote>
# 获取远程分支的最新状态,并将其合并到当前分支。
git pull <remote> <branch>
# 将本地的更改更新到指定的远程仓库。
git push <remote> <branch>
10. 安装nginx
使用docker-compose的安装方式

安装的docker-compose.yml文件为:

1
2
3
4
5
6
7
8
9
10
11
12
services:
nginx:
image: nginx:1.22
container_name: nginx
restart: always
volumes:
- ./conf/nginx.conf:/etc/nginx/nginx.conf #映射配置文件入口文件
- ./html:/usr/share/nginx/html #静态资源根目录挂载
- ./logs:/var/log/nginx #日志文件挂载
- ./conf/conf.d/default.conf:/etc/nginx/conf.d/default.conf #映射配置文件
ports:
- 80:80
使用命令
1
2
3
4
# 测试 Nginx 配置
sudo nginx -t
# 重新加载Nginx
sudo nginx -s reload
功能实现及配置文件讲解

nginx的功能很多(部署前端项目、静态资源分离、反向代理、解决跨域问题、根据子域名访问不同的端口号),这里没有办法一下子写完,只能用到之后再添加;nginx最重要的就是它的配置文件,我根据我的使用经验说明一下

  1. 根据子域名(三级域名)访问不同的端口号

​ 我们配置好子域名以后,会发现主域名和子域名访问的都是云服务器的80端口,但是我现在希望子域名能访问云服务器的不同端口;这一功能,我们可以借助nginx实现

​ 在nginx的default.conf配置文件中,添加如下内容:

1
2
3
4
5
6
7
server {
listen 80;
server_name gitea.qiuli.site;
location / {
proxy_pass http://10.6.0.3:3030/;
}
}
  • 注:
  • “listen 80” 指定监听的端口
  • “server_name”是nginx中的一个核心指令,负责匹配请求的域名(当客户端发送请求时,Nginx 会检查请求的 Host 头部,看看它匹配哪个 server_name配置的域名。一旦找到匹配的服务器块,Nginx 就会使用这个块中的配置来处理请求。)
  • “location” 匹配请求路径,“/”表示匹配所有请求路径;proxy_pass为请求转发的url ,需要注意的是如果nginx部署在docker中,这里的转发路径不能用“localhost”或者“127.0.0.1”,因为docker容器的默认网络(桥接模式)有独立性,所以这样配置请求会指向docker容器内部;正确的做法是配置宿主机的ip,这里我配置的云服务器的内网ip
  1. 解决跨域问题

    我将前后端项目部署在同一台虚拟机上,但是前端项目却无法请求同在一台服务器上的后端项目,这就是跨域问题造成的

​ TODO 等公安备案完毕再进行进一步配置