起源
ECS可供选择的云厂商比较多,我个人使用过linode、腾讯云、阿里云等几家的ECS产品,其中linode是接触最早的,大概用了两三年时间,每个月10个美元,当时出于接入点距离考虑选择了位于东京机房的服务器,但即便这样,打开博客经常性明显感觉到慢,有时甚至通过终端连接到服务器都超时。后来实在是忍受不了了,就切到了国内的云厂商,选择一个和自己同城的机房,毕竟做出的产品要先取悦自己嘛,结果证明是真香。国内的对比下来,阿里云整体是功能最完善丰富、技术最强大的了。选用一个标准的2C4G配置,使用到至今近三年时间。
我都拿ECS做了什么
我个人的刚需是博客记录、密码管理,再有就是日常脑海里浮现的想法的落地。当前实现了个人博客以及写作能力的搭建,密码管理的搭建,同学信息地图web应用的搭建,砍一刀、投票、抢票等助力APP的搭建等。
个人博客
密码管理
同学信息地图
蓝男橙女,点开可以展示对应同学资料信息,发到微信同学群里还挺受大家喜欢,短时间内就有几十名同学录入进来。
助力APP
这个比较复杂,从规划设计到开发落地,走了多处死胡同,作为个人开发者发布小程序或者应用太难了。
也提前了解过flutter,并基于flutter开了个简单的小样,但这里我最终还是选择使用了uniapp进行开发,主要是看到了社区里有较为丰富的插件,也支持我想要部署的小程序和端。
这块涉及端上的开发和后端开发,耗时3个月终于开发完毕,不过当前只支持Android系统。里面的细节这里先卖个关子,后面有机会再做展开。
举个栗子
服务器概览
根据控制台指引,安装CPU和内存使用率对应的插件,可以直接查看当前的系统负载情况。
有了服务器后,这里找一个大家都会用到的博客作为示例来展开讲一下吧。
博客技术组成拆解
这里我不使用saas化的博客产品,因为saas化的产品留给自己施展的空间有限,而是自己来搭建。那这里就涉及以下几个方面:
- 编辑器 ——markdown
- 存储设计 ——MySQL
- 定时任务渲染页面 ——crontab
- web服务器 ——Nginx
- 评论 ——fastcgi
第一步 确定编辑器
选择博客的编辑器,自己实现成本会比较高,因为涉及到富文本编辑器的功能,这里我主要对比了两款,editor和markdown
https://github.com/kindsoft/kindeditor
https://github.com/pandao/editor.md
这里我两个都根据官方指引搭建了下,各有利弊,markdown整体体验下来好一些,用的多一些。
这里也需要借助web服务器才可以完整使用,到第四步一起说。
第二步 搭建MySQL
由于个人博客,大多数场景是自己记录查看使用,很少有爆火产生非常大流量的情况。因此这里也没必要单独采购MySQL做分离,完全可以都集成到同一台ECS上。
sudo yum install -y mysql mysql-server mysql-devel # 修改端口啥的配置sudovim /etc/my.cnf # 启动MySQLsudoservice mysqld startmysql -hlocalhost-uroot-p
这里注意下,最好设置成仅本机localhost可以登录,避免不必要的安全麻烦。
mysql> show tables; +--------------------------+| Tables_in_Blog | +--------------------------+| t_blog | | t_comments | | t_type_def | +--------------------------+3 rows inset (0.00 sec)
库表比较简单,共分为博客内容表、评论表、以及博客内容分类表。比较复杂的博客表建表语句如下:
| t_blog | CREATE TABLE `t_blog` ( `c_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `c_title` varchar(255) NOT NULL, `c_tag` varchar(45) DEFAULT NULL, `c_date` date NOT NULL, `c_content` text NOT NULL, `c_url` varchar(255) NOT NULL, `c_type` tinyint(4) NOT NULL DEFAULT '1', `c_keys` varchar(255) NOT NULL, `c_bid` char(6) NOT NULL, `c_mtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `c_state` tinyint(4) NOT NULL DEFAULT '0', `c_nums` bigint(20) DEFAULT '1', PRIMARY KEY (`c_id`) USING BTREE, UNIQUE KEY `Index_uniq` (`c_bid`), KEY `Index_date` (`c_date`), KEY `Index_type` (`c_type`), KEY `Index_title` (`c_title`) ) ENGINE=InnoDB AUTO_INCREMENT=3682 DEFAULT CHARSET=utf8 |
第三步 定时任务渲染页面
由于是单机,这里利用Linux自带的crontab服务即可。
*/1 * * * * cd /**/**/**/blog;./markdownToHtml.sh >> /**/**/blog_markdownToHtml.log 2>&1
这里是每隔1分钟将编辑器里新增构建保存到数据库里初始状态的内容,转换为自己喜欢的博客html格式,并加上页头和页尾。
第四步 搭建web服务器
这里我选择使用比较常用的Nginx服务器,并使用fastcgi的能力,集成CGI接口提供评论的能力。另外,第二步当中使用到的编辑器里关于图片上传等相关的能力使用了PHP,这里要使得Nginx支持PHP。
- 安装运行Nginx
sudo yum install nginx # 切换到root 启动Nginxsystemctl start nginx # 查看Nginx的运行状态systemctl status nginx ● nginx.service - SYSV: Nginx is a high-performance web and proxy server. Loaded: loaded (/etc/rc.d/init.d/nginx; bad; vendor preset: disabled) Active: active (running) since 五 2021-04-1622:10:39 CST; 1 years 0 months ago Docs: man:systemd-sysv-generator(8) Main PID: 21312 (nginx) CGroup: /system.slice/nginx.service ├─25914 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf └─25915 nginx: worker process
- 配置Nginx 支持fastcgi
location ~ /blog.cgi { root /**/**/**/cgi-bin/; fastcgi_pass 127.0.0.1:9911; fastcgi_index index.cgi; fastcgi_param SCRIPT_FILENAME fcgi$fastcgi_script_name; include fastcgi_params; }
- 配置Nginx 支持PHP
1. php包下载
https://secure.php.net/downloads.php
https://secure.php.net/get/php-7.1.7.tar.gz/from/a/mirror
2. 解压安装包后执行
./configure --prefix=/data/php --enable-fpm--enable-mbstring--disable-pdo--with-curl--disable-debug--disable-rpath--enable-inline-optimization--with-bz2--with-zlib--enable-sockets--enable-sysvsem--enable-sysvshm--enable-pcntl--enable-mbregex--with-mhash--enable-zip--with-pcre-regex--with-jpeg-dir# 若碰到如下报错:configure: error: xml2-config not found. Please check your libxml2 installation. # 意味着缺少xml2相关库,执行下述命令解决sudo yum install libxml2-devel -ychecking for cURL in default path... not found configure: error: Please reinstall the libcurl distribution # 缺少curl相关库sudo yum -y install curl-devel
- 安装和启动
make & make test & sudomake install # 启动php-fpm/data/php/sbin/php-fpm 提示 PHP error:ERROR: No pool defined. at least one pool section must be specified in config file 配置文件目录中没有.conf结尾的文件 cd /data/php/etc/php-fpm.d/; cp www.conf.default www.conf
- 调整Nginx配置并重启
第五步 写fastcgi接口
这里选择c语言的clearsilver包来写fastcgi,纯属是带有个人纪念意义色彩的举动。
不过不管怎样,提供的http接口能力是一致的,即:
- 接收评论相关的入参:文章id、评论内容、提交者信息;
- 进行入参合法性校验;
- 维护到DB里
- 在文章加载时提供根据文章ID分页查询评论的能力。
逻辑相对简单,这里就不展开了。
总结
以上只是列举了使用ECS落地个人想法的一个案例,还有像其他的跑一下Python脚本处理个文件数据、写个爬虫程序获取自己感兴趣的内容、验证个技术想法等等还是很方便的,作为技术人员尤其是后端,非常建议入手一台,搭建自己的练兵场。