一、服务器迁移与系统更换
由于深圳的云服务器即将到期,为了方便管理,决定将服务器迁移至成都。首先,建立了一个按量付费的成都服务器进行测试,发现 ping 深圳服务器的延迟为 36ms,而 ping 成都服务器的延迟仅为 7ms,差距十分明显。鉴于此,决定进行服务器迁移。
同时,由于之前的服务器使用的是 CentOS Stream 系统,现在决定更换为 Ubuntu 系统,这意味着需要从 0 开始进行部署。
二、设置虚拟内存
新的服务器仅有 2G 物理内存,为了提升性能,首先需要增加虚拟内存。具体步骤如下:
创建一个目录:
plaintext
Copy
mkdir -p /mnt/data/mem
创建一个 4G 的文件,可以使用 fallocate 命令,如果该命令不可用,也可使用 dd 命令:
plaintext
Copy
fallocate -l 64G /mnt/data/mem/swapfile
或者
plaintext
Copy
dd if=/dev/zero of=/mnt/data/mem/swapfile bs=1G count=4
设置权限:
plaintext
Copy
chmod 600 /mnt/data/mem/swapfile
将文件格式化为 swap 空间:
plaintext
Copy
mkswap /mnt/data/mem/swapfile
启用 swap 文件:
plaintext
Copy
swapon /mnt/data/mem/swapfile
验证 swap 是否可用:
plaintext
Copy
swapon --show
为了在服务器重启后仍然保留这个 swap,还需要编辑 /etc/fstab 文件,在文件末尾增加以下内容:
plaintext
Copy
/mnt/data/mem/swapfile none swap sw 0 0
需要注意的是,之前在深圳的 CentOS 服务器上配置的是 /home/swapfile swap swap default 0 0。
如果要修改虚拟内存大小,先禁用当前交换空间:
plaintext
Copy
swapoff -a
然后删除现有的 swap 文件:
plaintext
Copy
rm /mnt/data/mem/swapfile
最后重新执行上述步骤即可。
三、安装 Docker
在安装 Docker 之前,先了解一下 docker.io 和 docker.ce。docker.io出现较早,docker.ce是社区版。docker.io支持的平台较少,更新频率也较慢。而 docker-ce还包括对 Swarm 等 Docker 工具的支持,并且具有更丰富的社区支持和文档资料。
在 Ubuntu 系统上安装 Docker,docker.io可以直接通过 apt install docker.io安装,而安装 docker-ce则需要多一些步骤。首先进行 apt update,如果是阿里云服务器上的 Ubuntu 系统,可能自带了阿里云镜像源,就不需要再配置源了。
然后安装一些软件:
plaintext
Copy
apt install apt-transport-https ca-certificates curl software-properties-common
安装 GPG 证书,可以使用阿里云的镜像源,因为官方的可能被墙:
plaintext
Copy
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
写入软件源信息:
plaintext
Copy
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
再次进行 apt update,然后安装 docker-ce:
plaintext
Copy
apt install docker-ce
以及其他相关包:
plaintext
Copy
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
查看 Docker 版本:
plaintext
Copy
docker -v
查看 Docker 状态:
plaintext
Copy
systemctl status docker
测试 Docker 是否正常:
plaintext
Copy
docker run hello-world
如果出现报错,可能是镜像源的问题。可以更改镜像源,比如在 /etc/docker/daemon.json文件中添加以下内容:
json
Copy
{
"registry-mirrors": [
"https://dockerproxy.com",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://ccr.ccs.tencentyun.com"
]
}
然后重启 Docker:
systemctl daemon-reload
systemctl restart docker
检查配置是否成功,可以通过 docker info查看输出结果中是否有上述镜像 url。
接着安装 docker-compose,可以先尝试通过 apt install docker-compose安装,但可能会发现版本比较低。可以先移除这个低版本:
plaintext
Copy
apt remove docker-compose
然后使用 GitHub 上的安装方法,比如:
plaintext
Copy
curl -L "https://github.com/docker/compose/releases/download/v2.29.7/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
如果有新版本,将上面的版本号替换一下。如果下载缓慢,可以在本地用迅雷下载,在 GitHub releases 更多上找到 docker-compose-linux-x86_64,重命名为 docker-compose,复制到服务器上的 /usr/local/bin/目录中。如果该目录中已经有一个未下载完的 docker-compose,可以先删除它。然后赋予执行权限:
plaintext
Copy
chmod +x /usr/local/bin/docker-compose
如果还是不能使用 docker-compose version命令,可以参考 Docker Compose 的官方 GitHub 说明,将其复制到合适的目录中,比如 /usr/libexec/docker/cli-plugins,并赋予执行权限。
如果发现 docker pull镜像有时会失败,可以添加自己阿里云的镜像服务地址,但可能只有自己的阿里云服务器能访问。
四、安装 MySQL
这里安装 MySQL 8.0。首先更新软件源:
plaintext
Copy
apt update
然后安装 MySQL:
plaintext
Copy
apt install mysql-server -y
查看版本:
plaintext
Copy
mysql --version
查看运行状态:
plaintext
Copy
systemctl status mysql
以数字 ip 形式显示 MySQL 的 tcp 监听状态:
plaintext
Copy
netstat -tln
设置 MySQL 的 root 密码,安装后首次是不需要密码的:
plaintext
Copy
mysql -u root
修改密码:
plaintext
Copy
alter user 'root'@'localhost' identified with mysql_native_password by '123456';
设置允许远程登陆:
sql
Copy
use mysql;
update user set host='%' where user='root';
flush privileges; -- 权限刷新
exit;
但此时可能还是不能远程登陆,还需要修改 /etc/mysql/mysql.conf.d/mysqld.cnf文件,将 bind-address = 0.0.0.0。然后重启 MySQL:
plaintext
Copy
systemctl restart mysql
并且在阿里云防火墙开放端口。远程连接后新建一个数据库,编码选择 utf8mb4,新建一个表,在字段中随便插入一些大小写英文和中文,用 select * from table like '%xxxx%'查询时,会发现 xxxx不区分大小写,中文也显示正常,但是表名区分大小写。
为了解决这个问题,可以在 /etc/mysql/mysql.conf.d/mysqld.cnf配置文件最后增加 lower_case_table_names=1。但如果在已经安装好 MySQL 后增加这个配置是无法重启 MySQL 服务的,因为这个配置只允许在初始化数据库之前设置。实际上,如果在安装 MySQL 之前就有这个配置文件,安装 MySQL 的时候会提示是否使用它,此时忽略表名大小写就会生效。由于卸载 MySQL 会移除这个文件,所以先对它进行备份,再卸载 MySQL,然后复原。
具体步骤如下:
停止 MySQL:
plaintext
Copy
systemctl stop mysql
备份配置文件:
plaintext
Copy
cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.backup
卸载之前安装的 MySQL:
plaintext
Copy
apt-get --purge autoremove mysql-server
删除目录:
plaintext
Copy
rm -rf /var/lib/mysql
还原配置文件:
plaintext
Copy
cp /etc/mysql/mysql.conf.d/mysqld.cnf.backup /etc/mysql/mysql.conf.d/mysqld.cnf
顺便把 bind-address改成 0.0.0.0,在 [mysqld]下添加 lower_case_table_names=1。
重新安装 MySQL:
plaintext
Copy
apt-get install mysql-server
安装的时候会提示已经包含配置文件,此时选 N。
五、安装 Nginx
安装 Nginx 非常简单,直接使用 apt install nginx即可。安装完成后就可以访问服务器的 ip:80端口了。
六、MySQL 数据迁移
先在源数据库服务器上执行备份,此命令只能备份一个数据库:
plaintext
Copy
mysqldump -u root -p db_app > db_app.sql
输入密码后就会备份到当前目录。然后在目标数据库上新建一个数据库 db_app,再把备份的 sql 文件复制到目标服务器上,在目标服务器上运行:
plaintext
Copy
mysql -u root -p db_app < db_app.sql
如果不先建立数据库,会提示数据库不存在。导入完成后可以查看数据是否全在。
七、安装.NET 运行环境
这里只需要安装运行时,选择安装 ASP.NET Core 运行时,因为它同时包括.NET 和 ASP.NET Core 运行时。使用以下命令安装:
plaintext
Copy
apt-get install -y aspnetcore-runtime-8.0
安装完成后,运行 dotnet -v是看不到的,因为没安装 SDK,但可以使用 dotnet xxx.dll。
八、安装 Redis
不太清楚 apt install redis和 apt install redis-server有啥区别。按官网的直接使用 apt install redis,查看状态 systemctl status redis-server会没有显示,但 apt install redis-server后直接就有状态了。
接下来可以进行以下操作:
plaintext
Copy
systemctl enable redis-server
然后启动服务:
plaintext
Copy
systemctl start redis-server
查看状态可以看到正在运行:
plaintext
Copy
systemctl enable redis-server
也可以按照官网的安装方法:
plaintext
Copy
sudo apt-get install lsb-release curl gpg
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
sudo chmod 644 /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt-get update
sudo apt-get install redis
Redis 会自动启动,并且应该在启动时自动重启。如果 Redis 在重新启动后没有启动,可能需要手动启用它:
plaintext
Copy
sudo systemctl enable redis-server
sudo systemctl start redis-server
验证 Redis 是否正常工作,可以使用以下命令:
plaintext
Copy
redis-cli
然后输入 ping。
为了让 Redis 可以被其他服务器访问,可以修改 /etc/redis/redis.conf文件,找到 bind 127.0.0.1 ::1,将 127.0.0.1改为 0.0.0.0,并增加密码,找到 requirepass,取消掉注释,修改为 requirepass 123456。protected-mode可以保持不动。
九、恢复 Nginx 配置
CentOS 版本的 Nginx 为 /nginx/1.20.1,Ubuntu 版本的 Nginx 为 /nginx/1.18.0 (Ubuntu)。修改 /etc/nginx/nginx.conf文件,发现里面有 include /etc/nginx/sites-enabled/*;。在 Ubuntu 系统中,这个文件夹里已经有个 default文件,就是默认的 80 端口配置。现在只需要在这个文件夹中新增文件,然后将以前的 server { }复制过来。但在 CentOS 系统中,nginx 没有这个目录。
十、迁移 Gitea 服务器
Git 服务器是在 Docker 中部署的 Gitea。将整个 Gitea 目录复制到新服务器中,修改 docker-compose.yml文件。注意 image: gitea/gitea:1.21.3版本需要保持不变,尝试使用 latest会导致 Git 服务器无法访问。同时,MySQL 配置的 host不能是 127.0.0.1 需要改成服务器的ip, 因为这是在docker中的,我就是没注意到这里导致无法访问mysql启动不了这里我发现无法拉取1.21.3 镜像,那么可以先在原服务器上先把镜像打包docker save -o gitea.tar gitea/gieta:1.21.3
然后在新服务器上导入docker load --input gitea.tar
然后docker images 一下看是否导入成功。
最后转到docker-compose.yml 所在目录
docker-compose up -d
可以docker logs gitea 看下日志是否启动成功
今天晚上发现nginx托管的静态资源 无法打开报403 但昨天就没此问题怀疑昨天还是用的之前深圳服务器的缓存,几经查找最终解决是将/etc/nginx/nginx.conf 第一行的user 改成root, 另外发现页面打开有问题需要F12禁用下缓存