LOADING

加载过慢请开启缓存 浏览器默认开启

一文白嫖阿里云服务器+配置基本开发环境+博客等服务部署

零、(白嫖)步骤

阿里云的学生优惠会送一张无门槛300元代金券(传送门: 阿里云高校计划_云工开物_助力高校科研与教育加速-阿里云 ),刚好够白嫖用券专区中的小服务器一整年(还多出15块可以买个20g的流量包);个人配置如下:

  • 实例规格ecs.e-c1m1.large
  • CPU&内存:2核2G;
  • 操作系统:Ubuntu 22.04 LTS 64位;
  • 带宽计费方式:按使用流量;
  • 公网带宽:5 Mbps;

:别选固定带宽,这是另外的价钱;

白嫖完后,进入配置;

一、本地远程连接

1.1 密钥对认证

由于本人采用密钥对进行认证,在创建并绑定密钥对后会自动下载一个 .pem 的文件到本地,ssh连接需要采用以下方式:

  1. 直接连接:
ssh -i ~/.ssh/你的私钥文件 用户名@服务器IP
  1. 简化连接方式

每次手动输入私钥文件显然过于不便了,我们可以将私钥文件添加到SSH配置文件中;

nano ~/.ssh/config

增加配置如下:

Host 服务器别名(随便取)
  HostName 服务器IP 
  User 用户名 
  IdentityFile ~/.ssh/你的私钥文件 
  Port 22

按下 ^xy 保存后,可以直接采用服务器别名连接:

ssh 服务器别名

1.2 常见问题

  1. 连接时报错:
Warning: Permanently added '你的服务器IP' (ED25519) to the list of known hosts. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions 0644 for '你的私钥文件地址' are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored. Load key "你的私钥文件地址": bad permissions 用户名@服务器IP: Permission denied (publickey).

这是因为SSH出于安全考虑,要求私钥文件的权限必须足够严格,不允许其他用户访问。你需要修改私钥文件的权限,确保只有你自己可以读取和写入:

chmod 600 ~/.ssh/你的私钥文件

二、基本环境配置

2.1 基本工具安装

  1. 系统更新
sudo apt update
sudo apt upgrade -y
  1. 基本工具安装(有些已经自带)
sudo apt install -y build-essential curl wget git vim htop net-tools
  1. 防火墙配置
sudo apt install -y ufw
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable

2.2 安装Docker

以下步骤也可以直接参考 Docker 官方文档

# 安装所需依赖
sudo apt install -y apt-transport-https ca-certificates gnupg lsb-release

# 添加 Docker 的官方 GPG 密钥(通过阿里云镜像)
sudo mkdir -p /etc/apt/keyrings && \
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null && \
sudo apt-get update

# 安装最新的 Docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

常见问题

由于运营商网络等不稳定因素可能导致镜像加速器无法成功拉取到指定版本的容器镜像,阿里云提供了免费的镜像加速器,配置步骤如下:

  1. 登录容器镜像服务控制台
  2. 在左侧导航栏选择镜像工具 > 镜像加速器
  3. 镜像加速器页面获取加速器地址

接下来,在云服务器上更新 Docker 配置:

sudo mkdir -p /etc/docker 
sudo tee /etc/docker/daemon.json <<-'EOF' 
{ 
    "registry-mirrors": ["你的镜像加速器地址"] 
} 
EOF
sudo systemctl daemon-reload 
sudo systemctl restart docker

最后,验证是否可以成功拉取 Docker Hub镜像:

sudo docker run hello-world

如果看到以下输出,说明成功拉取!

Hello from Docker!
This message shows that your installation appears to be working correctly.

2.3 配置 git

  1. 这里采用使用 SSH 密钥认证,首先在云服务器上生成 SSH 密钥对;
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

可以直接一路回车到底,默认情况下,密钥会保存到 ~/.ssh/id_rsa

  1. 将公钥添加到 GitHub 账户
# 查看公钥内容
cat ~/.ssh/id_rsa.pub

复制后,登录到 GitHub,进入 Settings -> SSH and GPG keys,点击 New SSH key,将公钥复制到 GitHub 的文本框中并保存;

  1. 验证连接
# 测试连接
ssh -T git@github.com

如果配置成功,会观察到输出如下信息:

Hi username! You've successfully authenticated, but GitHub does not provide shell access.

2.4 安装 Anaconda

  1. 下载 Anaconda 的安装包

你可以在 官网 自行查找需要的版本,替换以下链接即可:

wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh
  1. 安装anaconda
# 授予可执行权限
chmod +x Anaconda3-2024.10-1-Linux-x86_64.sh

# 执行
./Anaconda3-2024.10-1-Linux-x86_64.sh

然后疯狂回车(中间需要输入一次yes)即可;

  1. 验证安装

打开新的终端,输入:

conda --version

如果输出正确的 conda 版本,则说明安装成功并且正确配置环境变量;

conda 24.9.2

2.5 安装 MySQL

  1. 安装 MySQL APT 存储库
sudo wget https://dev.mysql.com/get/mysql-apt-config_0.8.33-1_all.deb
  1. 安装 MySQL 服务器
#安装 MySQL 服务器
sudo apt install -y mysql-server
#启动 MySQL 服务
sudo systemctl start mysql
#检查启动状态
sudo systemctl status mysql
#在系统启动时自动启动。
sudo systemctl enable mysql
  1. 安装安全向导(可选)
sudo mysql_secure_installation

它会让你自信选择安全策略,包括如下内容:

  • Would you like to setup VALIDATE PASSWORD component?
    • 是否需要启用 VALIDATE PASSWORD 组件?
  • There are three levels of password validation policy:
    • LOW Length >= 8
    • MEDIUM Length >= 8, numeric, mixed case, and special characters
    • STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
    • 这里选择输入 2 ,表示设置密码策略要求密码至少包含一个大写字母、一个小写字母、一个数字和一个特殊字符,并且密码总长度至少为8个字符;
  • Remove anonymous users?
    • 是否移除匿名用户?
    • 这里输入 y ,表示移除;
  • Disallow root login remotely?
    • 禁止MySQL的 root 用户从远程登录;
    • 这里选择 y;
  • Remove test database and access to it?
    • 是否需要移除MySQL自带的 test 数据库?
    • 无所谓,删了吧;
  • Reload privilege tables now?
    • 输入 y ,重新加载权限表,使得更改生效;
  1. 配置安全组规则

配置安全组时,MySQL 默认使用3306端口。确保实例安全组的入站规则开放3306端口。如果选择了不同的端口,请根据实际情况调整安全组设置。具体步骤请参考添加安全组规则

  1. 添加用于远程访问的用户

将以下输入的 <username><password> 部分自行修改;

sudo mysql -uroot -p \
-e "CREATE USER '<username>'@'%' IDENTIFIED BY '<password>';" \
-e "GRANT ALL PRIVILEGES ON *.* TO '<username>'@'%' WITH GRANT OPTION;" \
-e "FLUSH PRIVILEGES;"

执行后需要输入 root 账户的密码;

  1. 登录 mysql 账户验证
sudo mysql -u <username> -p

输入密码后,进入 mysql 环境,成功!

输入以下内容可以退出 mysql 环境:

exit;

2.6 配置 Node.js 开发环境

  1. 下载 NVM 源码
git clone https://gitee.com/mirrors/nvm.git ~/.nvm && cd ~/.nvm && git checkout `git describe --abbrev=0 --tags`
  1. 配置环境变量
sudo sh -c 'echo ". ~/.nvm/nvm.sh" >> /etc/profile'
source /etc/profile
  1. 设置镜像源
export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node
  1. 自行下载所需版本,例如:
nvm install v23.3.0

若观察到以下输出,说明安装成功:

Computing checksum with sha256sum
Checksums matched!
Now using node v23.3.0 (npm v10.9.0)
Creating default alias: default -> v23.3.0

2.7 配置 Java 环境

  1. 安装所需版本的JDK(以Java 1.8 为例):
sudo apt-get install -y openjdk-8-jdk

如果需要下载其他版本,可以运行以下命令查看:

sudo apt search openjdk
  1. 验证安装
java -version

2.8 Screen 工具

在通过 Scp 等远程传输文件时,特别是大文件时,往往因为 SSH 连接不稳定而导致中断。而 Screen 工具提供了从单个 SSH 会话中使用多个 shell 窗口的能力。当会话被分离或网络中断时 Screen 会话中启动的进程仍将运行,我们可以随时重新连接到 Screen 会话。

  1. 安装 Screen
sudo apt install screen
  1. 创建一个会话
screen -S test
  1. 挂起一个会话

按下 Ctrl + a + d 即可保持这个 Screen 到后台并回到我们 SSH 的主终端;

  1. 恢复一个会话
screen -r -d test

即可重新进入该 Screen;

  1. 查看已经存在的 Screen 终端
screen -ls

2.9 安装 Nginx 环境

  1. 使用 Nginx 官方源安装;

#更新系统已安装软件并更新包管理工具
sudo apt update -y
#Nginx安装前必要环境
sudo apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring
#导入官方Nginx签名密钥
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
#设置apt仓库
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
#安装nginx
sudo apt install -y nginx

接下来根据实际需要修改配置文件;

三、搭建 Cloudreve 云盘

3.1 快速部署

下载 Cloudreve 发布版本,你可以自行从 Release 选择适合你的操作系统的;

wget https://github.com/cloudreve/Cloudreve/releases/download/3.8.3/cloudreve_3.8.3_linux_amd64.tar.gz

# 创建程序目录
mkdir -p /usr/local/cloudreve

# 解压获取到的主程序到所在目录
tar -zxvf cloudreve_3.8.3_linux_amd64.tar.gz -C /usr/local/cloudreve

cd /usr/local/cloudreve
# 赋予执行权限
chmod +x ./cloudreve

# 启动 Cloudreve
./cloudreve

观察到以下输出,说明启动成功:

在首次启动时,会创建初始管理员账号,请注意保管下方的管理员密码,此密码只会在首次启动时出现

Cloudreve 默认会监听5212端口,你可以在浏览器中访问 http://服务器IP:5212 进入 Cloudreve。注意需要增加阿里云服务器的安全组规则。

3.2 启动进程守护

  1. 编辑配置文件
vim /usr/lib/systemd/system/cloudreve.service

[Unit]
Description=Cloudreve
Documentation=https://docs.cloudreve.org
After=network.target
After=mysqld.service
Wants=network.target

[Service]
WorkingDirectory=/usr/local/cloudreve
ExecStart=/usr/local/cloudreve/cloudreve
Restart=on-abnormal
RestartSec=5s
KillMode=mixed

StandardOutput=null
StandardError=syslog

[Install]
WantedBy=multi-user.target
  1. 更新配置并启动
# 更新配置
systemctl daemon-reload

# 启动服务
systemctl start cloudreve

# 设置开机启动
systemctl enable cloudreve
  1. 管理命令
# 启动服务
systemctl start cloudreve

# 停止服务
systemctl stop cloudreve

# 重启服务
systemctl restart cloudreve

# 查看状态
systemctl status cloudreve
  1. 访问前端服务

通过 https://你的服务器IP:5212 即可访问;

四、部署 hexo 博客

纯纯自用罢了;

4.1 服务端 git 的有关配置

  1. 创建一个单独的用户用于管理仓库;
sudo adduser git
sudo passwd git
  1. 设置 git 用户 sudo 权限;
sudo chmod 740 /etc/sudoers
sudo vim /etc/sudoers

添加一行:

git ALL=(ALL) ALL

按下 :wq 保存更改,然后:

sudo chmod 400 /etc/sudoers
  1. 上传公钥到服务器并添加到 git 用户

在本机执行:

scp ~/.ssh/id_rsa.pub root@<你的服务器IP>:/home/git/tempkey.pub -i ~/.ssh/你的私钥文件.pem

然后登录服务器:

ssh 你的服务器别名
sudo su - git
mkdir -p ~/.ssh
cat ~/tempkey.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
exit

你同样可以在本机化简配置:

Host 你的服务器别名_2
  HostName 你的服务器公网IP
  User git
  IdentityFile ~/.ssh/id_rsa
  Port 22

4.2 配置 Git 仓库和部署钩子

  1. 初始化一个裸仓库;
su git
cd ~
git init --bare hexo.git
  1. 添加 post-receive 自动部署钩子;
vi ~/hexo.git/hooks/post-receive

输入以下内容并保存退出(:wq):

#!/bin/bash
GIT_WORK_TREE=/data/hexo git checkout -f

赋予执行权限:

chmod +x ~/hexo.git/hooks/post-receive
  1. 创建部署目录并授权
sudo mkdir -p /data/hexo
sudo chown -R git:git /data/hexo
sudo chmod -R 755 /data/hexo

4.3 Hexo 配置

4.3.x 关于资源文件夹的问题

当然,使用图床等工具,直接在 markdown 中插入外链是最方便的,并且不用担心在博客迁移时发生问题。不过如果你想要保存图片在本地,那么可以参考如下方法:

  1. 保存图片在 source/ 文件夹下;

这是肯定的,区别只是在于后面的引用格式问题;

  1. 如果图片的目录为 source/img/example.png

那么,默认配置下,你的引用格式应该为

![](img/example.png)

如果你希望不同文章的图片保存在不同目录,你可以自行修改保存路径和相应的引用格式(注意是相对于 source 文件夹的路径);当然,你也可以使用 Hexo 提供的配置方式,将配置文件 config.yml 修改为:

post_asset_folder: true

但你每次通过命令行新建一个文章时,它会自动在 _posts 文件夹下生成一个同名文件夹,你可以将文章图片都放在该文件夹中,此时引用格式为:

![](example.png)

但是,这并不是特别方便,特别是对于需要通过别的阅读器,比如 Typora 等进行阅读。如果你希望维持相对路径格式又能对图片进行分类,你可以通过修改 Typora 设置来进行,但我推荐使用插件 hexo-asset-link 插件,这个插件可以保留你原本写的路径结构,即:

![](./文章名/example.png)

安装和配置方法如下:

npm install hexo-asset-link --save

_config.yml 中添加:

asset_link:
  enable: true
  post_asset_folder: true

重新生成并部署即可!

其余部分暂略;

4.4 部署 Hexo 博客

4.4.x 部署 Hexo 博客到云服务器

  1. 安装 hexo-deployer-git 插件;
npm install hexo-deployer-git --save
  1. 修改 _config.yml 中的 deploy 部分;
deploy:
  type: git
  repo: git@你的服务器别名_2:/home/git/hexo.git
  branch: master
  1. 运行以下命令进行部署;
hexo clean
hexo generate
hexo deploy

或直接写成:

hexo c && hexo g && hexo d
  1. 修改 Nginx 配置文件;
sudo vim /etc/nginx/nginx.conf

为:

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    keepalive_timeout  65;

    include /etc/nginx/conf.d/*.conf;
}
  1. 修改虚拟主机配置;
sudo vim /etc/nginx/conf.d/default.conf

如果没有域名,则修改为:

server {
    listen        80;
    listen   [::]:80;
    server_name  你的公网IP;

    location / {
        root   /data/hexo;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

如果仅有域名,则修改为:

server {
    listen        80;
    listen   [::]:80;
    server_name  yourdomain.com;
  
    location / {
        root   /data/hexo;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

如果你有域名并申请过 SSL 安全证书,则修改为:

server {
    listen        80;
    listen   [::]:80;
    server_name  yourdomain.com;

    rewrite ^(.*)$ https://${server_name}$1 permanent;
}

server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate     /path/to/your/cert.pem;
    ssl_certificate_key /path/to/your/key.pem;

    ssl_session_cache   shared:SSL:1m;
    ssl_session_timeout 5m;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    location / {
        root   /data/hexo;
        index  index.html index.htm;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   Host             $http_host;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

注意将上面的域名、SSL 证书的路径字段替换为你实际的。

  1. 启动 Nginx 进程;
sudo systemctl start nginx
sudo systemctl status nginx
sudo systemctl reload nginx

阿里云服务器一般默认开放了 80 和 443 端口,如果服务商不同,请自行开放防火墙;

  1. 配置域名解析(如果没有域名,则无需进行这一步);

如果你使用的是阿里云的 DNS,那么你需要登录域名管理后台,添加一条 A 记录:

主机记录 类型 记录值 TTL
blog A 你的公网IP 600(s)

解析是否生效可以通过以下命令进行验证:

ping yourdomain.com

如果你的域名 DNS 指向了非服务商,比如我使用了 Cloudflare 的 DNS,那么你需要在 Cloudflare 的控制面板中设置,添加 A 记录:

类型 主机名 内容(IP 地址) TTL 代理状态
A blog 你的服务器公网IP 自动 关闭小云朵(点一下变灰)

说明:如果你只是做博客访问,把“代理状态”的小云朵关闭(变灰),否则 Nginx 会收到 Cloudflare 的 IP 而不是你用户的真实 IP;

特别说明:

如果你使用的是中国大陆的服务器,那么需要提交备案申请,未备案域名将无法通过 HTTP/HTTPS 正常访问,云服务商会限制端口 80 和 443。如果你想通过云服务器部署个人博客,请遵循有关规定。不过我懒。

补充:

备案时应该要求你的域名 DNS 指向阿里云 DNS,否则存在不通过的风险。(我记得备案的时候用途就不能写个人博客来着)

4.4.y 配置服务到 Github Page 或其他托管平台

把 Hexo 部署到 GitHub Pages 或其他托管平台并绑定你的域名也同样可行且省事,而且完全免费、无需备案。

  1. 新建一个 Github 仓库;

命名为:(啥也不用勾选,空的公开仓库即可)

XXX.github.io
  1. 修改 Hexo 的配置文件;

将 deploy 部分改为:

deploy:
  type: git
  repo: 你的仓库地址
  branch: main

如果你默认 GitHub 用 master 分支,那就把 branch 改为 master 即可;

  1. 绑定域名;

首先,添加一个名为 CNAME 的文件到 source 目录下:

echo "yourdomain.com" > source/CNAME

登录 Cloudflare ,添加如下记录:

类型 名称
CNAME blog XXX.github.io

确保开启了 小云朵(代理)图标,启用 CDN 与 HTTPS;

重新部署博客:

hexo clean && hexo g && hexo d
  1. 设置 GitHub Pages 部署配置;

在你的仓库中打开「Settings」→「Pages」,设置以下内容:

  • Source 设为:main 分支(或者 master,看你哪个在用)
  • Branch folder 选的是 / (root)
  • Custom domain 应该已填写为:yourdomain.com

在重新部署一次,如果 DNS 已生效,那么就可以正常浏览你的博客了!

:不定期随缘更新中...