个人服务器架构介绍

本文介绍了作者如何在有限的服务器资源下,通过Docker和docker-compose实现服务的容器化部署,包括Nginx、PHP、MySQL等。文章详细描述了Dockerfile的优化、日志收集、免手动的CI/CD流程,以及通过监听GitHub webhook自动触发重建的过程。
摘要由CSDN通过智能技术生成

背景
服务器硬件:BWG 洛杉矶机房 10G+512M+1核

截止目前,我服务器(你现在看的这个页面就是在这个服务器上面)上面运行的服务有:Nginx、PHP、MySQL、Redis、Log收集器、Ngork 。这些服务全部部署在一台机器上面。但是由于我服务器经常拿来做一些测试,导致经常需要 重装系统。因此每次重装系统后的服务部署都格外头疼。基本上把这些所有的服务部署一般,半天时间就没了。因此,一个快速稳定的部署方案十分有必要。

刚开始的想法是把所有部署操作写成一个Shell脚本,每次部署只用执行一遍Shell脚本就行了。但是Shell脚本维护成本太高,而且不同操作系统,不同版本的系统,很容易出现问题。因此 放弃了这个思路。

第二个想法是一步到位,上Docker + K8S,但是考虑到机器性能,K8S实在是太重了,可能K8S的性能消耗比我所有服务的消耗还要高。但是容器化部署是一个非常好的思路,于是想到了 使用轻量一点的方案docker+docker-compose。这套方案优势在于

1、docker容器带来的跨平台性 2、docker-compose进行容器编排足够轻量,不会额外消耗机器资源(我服务器配置太低,这点非常重要)

实现过程
一、打包Dokcerfile

打包过程中基础镜像选择了各个官方镜像,另外由于服务器磁盘只有10G,需要非常注意Docker镜像的尺寸,基本上每一步操作的缓存都得清理干净,比如apt-get、gcc build这些操作带来的 缓存可能非常大,不清理干净最终容器将会非常大。

另外,基础镜像尽可能小,比如golang build完后只需要一个alpine镜像运行即可,能选alpine就不用用ubuntu,保证最终镜像尽可能小,毕竟10G磁盘

最后,golang、c++之类的编译型语言全部采用分阶段构建,编译阶段在已经容器中,编译完以后拷贝到新容器中运行,这样可以连源码,编译器的大小都省去了。还是那句话,10G磁盘,迫不得已啊

二、编写docker-compose.yml

为了尽可能节约磁盘空间,基本上所有服务都关闭了日志记录。但是必要的日志还是得收集,不能丢。因此自己写了一个日志收集工具(其实本来不想自己写的,想用ELK一套,但是,机器性能 摆在这里,没办法,只能自己动手)。工具使用golang编写,功能只有一个,解析各个日志,然后存进MySQL。

工具日志也单独部署在一个容器中,日志数据写入到统一的日志数据卷中,然后日志服务读取日志数据卷的内容,写入MySQL。

其中,Nginx日志为了方便解析,将其格式改成了JSON。配置如下

user nginx;
worker_processes 1;

error_log /var/log/nginx/error_local.log warn;
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 - r e m o t e u s e r [ remote_user [ remote

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值