0%

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

前言

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

基础设置

1. 设置虚拟机名称
1
2
3
4
5
# 查看当前虚拟机名称
hostnamectl

# 设置虚拟机名称({myvm}为设置的名称)
sudo hostnamectl set-hostname {myvm}
2. 设置静态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
3. 设置虚拟机hosts

我们为虚拟机设置了名称和静态IP后,就可以使用虚拟机名称来代替虚拟机ip访问该虚拟机,但是我们需要在hosts文件中添加名称和ip的对应关系

1
2
3
4
5
6
7
8
9
# 进入hosts文件
vi /etc/hosts

# 按‘i’进入编辑模式,添加如下内容
{ip} {myvm}
# 例
192.168.218.131 k8s-master
192.168.218.132 k8s-worker1
192.168.218.133 k8s-worker2
4. selinux设置(linux安装模块)

​ 改变设置后需重启虚拟机设置才能生效

1
vim /etc/selinux/config
1
2
3
4
5
6
7
8
# 修改SELINUX字段

# 强制模式(SELinux 强制执行安全策略,违反策略的操作会被拒绝并记录到日志中)
SELINUX=enforcing
# 宽容模式(SELinux 会记录违反策略的操作,但不会阻止这些操作。通常用于调试和测试)
SELINUX=permissive
# 禁用模式(完全禁用)
SELINUX=disabled
1
2
# 验证
getenforce
5. 防火墙设置
  • 方案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
  • 注意:如果你使用的是云服务器,还要到对应页面添加规则,将对应端口在云服务器上开放
6. 将ipv4流量转发到iptables

(1)加载’br_netfilter‘模块,该模块用于桥接网络的NetFilter模块(因为加载’br_netfilter‘模块需要在sysctl服务之前运行,所以使用systemd 服务)

​ 创建一个systemd服务文件

1
sudo vi /etc/systemd/system/load-br-netfilter.service

​ 添加以下内容

1
2
3
4
5
6
7
8
9
10
[Unit]
Description=Load br_netfilter module
Before=sysctl.service

[Service]
Type=oneshot
ExecStart=/sbin/modprobe br_netfilter

[Install]
WantedBy=multi-user.target

​ 启用并启动服务

1
2
sudo systemctl enable load-br-netfilter.service
sudo systemctl start load-br-netfilter.service

(2)添加参数

​ 编辑文件’/etc/sysctl.d/k8s.conf’ (vi /etc/sysctl.d/k8s.conf),在其中添加参数

1
2
3
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1

​ 修改参数

1
sudo sysctl -w net.ipv4.ip_forward=1

​ 加载文件

1
sudo sysctl -p

​ 重启虚拟机查看是否生效(如果生效参数都为1)

1
2
3
sysctl net.bridge.bridge-nf-call-ip6tables
sysctl net.bridge.bridge-nf-call-iptables
sysctl net.ipv4.ip_forward
7. 设置虚拟机时间同步

(1)安装chrony

1
2
3
4
# 检查是否安装了chrony
yum list installed | grep chrony
# 如果没有安装用以下命令安装
sudo yum install chrony

(2)配置chrony,这里以一台虚拟机为master,其他虚拟机为worker,worker同步master的时间

​ 在master实例编辑’/etc/chrony.conf‘文件,添加如下内容

1
2
3
4
5
6
# 允许其他节点同步时间,192.168.218.0/24为虚拟机所在的网段
allow 192.168.218.0/24

# 使用外部时间服务器(可选)
server ntp.aliyun.com iburst
server time.google.com iburst

​ 在其他worker实例编辑’/etc/chrony.conf‘文件没添加如下内容

1
2
# 指向时间服务器(master),这里如何设置了虚拟机名称用master,否则可以用ip
server mster iburst

(3)在每个实例依次重启chrony服务

1
2
3
4
5
6
7
8
# 启动
sudo systemctl start chronyd
# 重启
sudo systemctl restart chronyd
# 设置开机启动
sudo systemctl enable chronyd
# 查看状态
sudo systemctl status chronyd

(4)查看worker节点是否同步了master节点的时间

1
chronyc sources
8. 设置虚拟机时区
1
2
3
4
# 查看现在的时区
timedatectl
# 设置时区为上海
sudo timedatectl set-timezone Asia/Shanghai
9. 关闭系统交换分区(swap area)
1
2
3
4
# 输入命令可以查看到swap相关信息
cat /etc/fstab
# 执行命令关闭swap area,关闭后再执行’cat /etc/fstab‘看不到swap相关信息
swapoff -a ;sed -i '/swap/d' /etc/fstab
  • 注意:如果不关闭swap,就会在kubeadm初始化Kubernetes的时候报错:“[ERROR Swap]: running with swap on is not supported. Please disable swap”

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

1. 安装yum

​ (1)验证是否安装了yum(通常系统会自行安装),并保证软件版本更新到最新

1
2
3
4
# 查看版本
yum --version
# 更新软件
sudo yum update -y

​ (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-utils、device-mapper-persistent-data、lvm2

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
    10
    11
    12
    # 备份原来的repo 文件
    # CentOS8
    mv /etc/yum.repos.d/CentOS-Linux-BaseOS.repo /etc/yum.repos.d/CentOS-Linux-BaseOS.repo.backup
    mv /etc/yum.repos.d/CentOS-Linux-AppStream.repo /etc/yum.repos.d/CentOS-Linux-AppStream.repo.backup
    # CentOS7
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

    # 从阿里云下载新的配置文件
    # CentOS8
    curl -o /etc/yum.repos.d/CentOS-Linux-BaseOS.repo https://mirrors.aliyun.com/repo/Centos-8.repo
    # CentOS7
    curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

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

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

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

    1
    2
    sudo yum clean all
    sudo yum makecache

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

1.1 使用yum安装基础软件

(1)使用yum安装wget

1
sudo yum install -y wget

(2)使用yum安装vim

1
sudo yum install -y vim

(3)安装gcc、gcc-c++

1
2
3
sudo yum -y install gcc

sudo yum -y install gcc-c++
2. 安装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

3. 安装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
3.1 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方式安装,这里不再赘述
4. 安装docker

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

1
2
3
4
# 安装
sudo yum -y install docker-ce
# 安装指定版本
sudo yum install -y docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io

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

1
docker --version

​ (3)设置镜像源(提高docker安装软件时的下载速度)

​ a. 阿里云镜像

​ 登录阿里云容器镜像服务页面获取镜像地址

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

​ b.毫秒镜像

​ 登录到毫秒镜像,按照提示操作

1
{"registry-mirrors": ["https://docker.1ms.run"]}

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

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

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

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

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

1
docker info

​ (6)设置docker开机自启

1
2
3
4
# 设置开机自启
sudo systemctl enable docker --now
# 查看状态
sudo systemctl status docker
4.1 卸载docker

(1)确保 Docker 服务已停止

1
sudo systemctl stop docker

(2)使用 yum 卸载 Docker 包

1
sudo yum remove docker-ce docker-ce-cli docker-ce-rootless-extras docker-buildx-plugin docker-compose-plugin

(3)手动删除 Docker 文件和目录

​ 即使使用 yum 卸载,有时仍会有一些残留文件。可以手动删除这些文件和目录:

1
2
3
4
5
6
7
8
9
10
11
12
# 删除 Docker 安装目录
sudo rm -rf /var/lib/docker

# 删除 Docker 配置目录
sudo rm -rf /etc/docker

# 删除 Docker 服务文件
sudo rm -f /usr/lib/systemd/system/docker.service
sudo rm -f /usr/lib/systemd/system/docker.socket

# 重新加载 systemd 配置
sudo systemctl daemon-reload

(4)清理 YUM 缓存以确保没有残留的包信息

1
2
sudo yum clean all
sudo yum makecache

(5)确认所有 Docker 相关的包和文件都已删除

1
2
# 此命令应不再返回任何结果
rpm -qa | grep docker
4.2 docker的常用命令

​ (1)进入docker容器

1
docker exec -it [容器名称或ID] /bin/bash
5. 安装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
5.1 设置docker-compose网络

我们使用docker-compose部署容器时,默认每个docker-compose.yml文件会创建属于自己的网络,并且使用桥接方式与宿主机连接;我们要想访问别的容器时只能访问其暴露在宿主机中的端口,这样让网络管理变得很不方便,特别是在宿主机ip变动时,每次都需要修改很多文件;我们可以手动创建一个docker网络,在各容器创建时都使用这个网络,这样在docker-compose.yml文件中需要访问别的容器时,我们可以直接使用容器名称来代替容器ip,docker-compose会帮我们自动解析,便于后续的网络管理

(1)在docker中建立一个网络

1
2
3
4
# 创建一个名称为’my_network‘,连接方式为桥接(bridge)的网络
docker network create --driver bridge my_network
# 查看网络是否创建成功
docker network ls

(2)在创建容器的docker-compose.yml文件中添加以下内容,让这些容器都使用’my_network’

1
2
3
4
5
6
7
services:
networks:
- my_network

networks:
my_network:
external: true
6. 安装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
7. 安装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
7.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
8. 安装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
8.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>
9. 安装nginx
(1)使用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
(2)操作命令
1
2
3
4
# 测试 Nginx 配置
sudo nginx -t
# 重新加载Nginx
sudo nginx -s reload
(3)功能实现及配置文件讲解

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

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

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

​ 在nginx的’conf/conf.d/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. 启用缓存

​ a. 添加缓存块

​ 在 Nginx 配置文件(通常位于 ‘conf/nginx.conf’)中,添加以下内容:

1
2
3
4
5
6
7
http {
# 定义缓存路径和参数
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;

# 其他全局配置
...
}
  • /var/cache/nginx:缓存文件的存储路径。
  • levels=1:2:缓存目录的层级结构。
  • keys_zone=my_cache:10m:定义缓存区域名称为 my_cache,并分配 10MB 的内存用于存储缓存键。
  • max_size=1g:缓存最大占用 1GB 磁盘空间。
  • inactive=60m:如果缓存文件在 60 分钟内未被访问,则自动删除。
  • use_temp_path=off:禁用临时文件路径,直接写入缓存目录。

​ b. 在路径中启用缓存

​ 在‘/conf/conf.d/default.conf’文件的server块中,添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 80;
server_name example.com;

location / {
# 使用之前定义的缓存区域
proxy_cache my_cache;
# 缓存 200 和 302 状态码的响应 10 分钟
proxy_cache_valid 200 302 10m;
# 缓存 404 状态码的响应 1 分钟
proxy_cache_valid 404 1m;
# 在错误时使用过期的缓存
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
# 后端服务器地址
proxy_pass http://backend_server;
}
}
  • proxy_cache my_cache:启用缓存,并指定缓存区域。
  • proxy_cache_valid:设置不同状态码的缓存时间。
  • proxy_cache_use_stale:在后端服务器不可用时,使用过期的缓存。

​ c. 添加图片(静态文件) 缓存

1
2
3
4
5
6
7
8
location ~* \.(png|jpg|jpeg|gif|ico|svg|webp)$ {
proxy_cache my_cache; # 启用代理缓存
proxy_cache_valid 200 30d; # 缓存 200 状态码的响应 30 天
add_header Cache-Control "public, max-age=2592000"; # 设置 HTTP 缓存头
expires 30d; # 设置缓存时间
access_log off; # 关闭访问日志
proxy_pass http://your_backend_server; # 代理到后端服务器
}

​ d. 开启压缩传输

​ 在‘conf/nginx.conf’中添加如下内容:

1
2
3
4
5
6
7
8
http {
gzip on; # 启用 Gzip 压缩
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 指定需要压缩的文件类型
gzip_min_length 1024; # 仅压缩大于 1KB 的文件
gzip_comp_level 6; # 设置压缩级别(1-9,值越大压缩率越高,但 CPU 消耗也越大)
gzip_vary on; # 添加 "Vary: Accept-Encoding" 响应头,确保兼容性
gzip_proxied any; # 对代理请求也启用压缩
}

​ d. 修改文件之后重启nginx

  1. 解决跨域问题

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

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