低配服务器的个人建站爬坑之路

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sqm1995/article/details/89374500

@低配服务器的个人建站爬坑之路

低配服务器的个人建站爬坑之路

本文纯手打,转载请说明来源:https://blog.csdn.net/sqm1995/article/details/89374500

本文章记录博主个人建站的一些经历,主要用来做一个记录,希望也能给一些初次建站的朋友带来一些借鉴,少走些弯路,如有不对的地方,欢迎指出。
附上网站链接:http://toufu.xyz

建站初衷

因为我平时没事的时候喜欢看各种电影、综艺、电视剧,但是最近发现越来越多的视频资源都需要vip才能观看,一个vip本无所谓,但是我喜欢看的资源又分布在不同的视频网站,就很恼火,续费VIP都要同时续几个,所以想着自己搞个网络爬虫爬些资源看看,所以准备建个视频资源网站。

项目架构

为什么要介绍项目架构呢,因为这跟后面遇到的各种坑有关系,先在这写着,后面就知道了

后台框架:

  • spring-boot
  • spring-cloud(feign+eureka)
  • mybatis-plus

前端框架:

  • layui

数据库:

  • mysql
  • redis(以为现在网站的业务不是特别需要,所以暂时没用到)

spring-cloud一共弄了四个模块:用户中心、爬虫中心、api调用层、eureka注册中心
其中用户和爬虫连接数据库,另外两个不连接
为什么使用分布式架构呢,有人可能会问一个个人网站,访问量又不多,是不是有点大材小用了,我主要是考虑分布式的可扩展性,因为以后我可能还会做不同的功能模块,每个功能模块当做一个单独的service和service之间关联性不大,每个服务也可以当做单独的项目,如果以后工作中有需要,可以拿出来改一下使用,虽然这样很费服务器资源,但是扩展也比较方便,再买个服务器就行了,不用升配

此为项目背景(伏笔哦~~~)

购买服务器

网站做完之后感觉还行,于是想着买个服务器,毕竟不能每次localhost看电影吧,哈哈,所以开始了服务器选择之旅
我当时准备再三家云厂商选择,分别是阿里云、腾讯云、华为云。

因为博主实在是穷(不穷就不用折腾这些,直接续费会员了o(╥﹏╥)o),所以价格因素是我主要考虑的原因(PS:这也是后面坑多的原因),配置低不要紧,我可以压缩我的各种配置嘛

这个时候就很后悔去年双十一的时候没有参加阿里云的活动,当时好像才99一年最低配置,这个时候再去看贵多了,价格方面最低的是华为云,域名+服务器套餐最低400多元,阿里的最贵,就直接pass了,虽然之前公司用的阿里云服务器体验还挺好的,但是没钱怎么办咧。
附上华为云的活动图:
在这里插入图片描述

但是自己没用过华为云,所以不知道怎样,于是决定领一个免费试用的服务器和mysql数据库,
服务器配置如下
免费服务器配置:-
在这里插入图片描述
数据库配置:
在这里插入图片描述
在这里插入图片描述

因为是单独的数据库,所以项目部署上去之后,在什么配置都不改的情况下,运行无压力
这是项目全部启动后的内存情况:
在这里插入图片描述
在这里插入图片描述
爬虫运行时:
在这里插入图片描述
在这里插入图片描述
因为爬虫运行时是我网站服务器压力最大的时候,可以看出服务器内存完全够用,就是单核的CPU比较吃力,我的爬虫是分线程的,线程池corePoolSize和maximumPoolSize都为10,首次运行爬虫时也才15个 ,所以线程并发量并不高(也不敢开多了)。
所以总体来看,我当时还是很青睐华为云的,又便宜又好使(后面要打脸了,因为很多因素还没考虑到)。

就这样网站运行了一周,每天有四次爬虫任务,稳定运行,没有出现宕机的情况,于是我准备正式购买华为云
可是这个时候我突然想起一件事,1核2G的服务器虽然只要四百多,但是数据库呢?我在服务器上装个mysql会不会导致资源不足?于是我看了看服务器的价格:
在这里插入图片描述
好吧,告辞!

其实我想着再装个mysql应该也没问题,毕竟我这只是个个人网站,我打算自己现在免费服务器上装个mysql测试一下
但是工作原因,又迎来了清明节的假期,就没时间弄了,搁置了
其实一开始我记得腾讯云之前有过校园+的活动,学生服务器巨便宜,但是我已毕业几年了,所以就没有考虑这个,但是就在某一天我突发奇想去试着弄一下发现,竟然。。。
省略N多内容。。。
最后我选择了腾讯云学生服务器(这里我就不说怎么弄得了,弄过的肯定都知道,没试过的我只想说各位去试试就知道了,有惊喜!),
附上学生服务器价格:
在这里插入图片描述
是的,就是这么便宜,这里非常感谢TX爸爸给了我再造的机会,么么哒!
服务器10元一个月,数据库3元一个月,这不是完美契合我的意愿么
于是果断买了一个上海的服务器(坑来了!!!)
正当我美滋滋的看着服务器创建完成时,准备下手再买个数据库,才3元一个月,给我来一年的
悲剧发生了,我在买服务器的时候,没有看数据库的购买页面,下面附上两个页面的图片,大家来找不同:
服务器:
在这里插入图片描述
数据库:
在这里插入图片描述
看出来了么?
对,数据库没有上海的,坑爹啊,跨域连数据库是要收费的!给你们看跨域数据库连接收费信息
在这里插入图片描述
呵呵,告辞!

所以这里提醒各位初次购买的小伙伴,如果你要需要数据库,那么你一定要看看两个页面,服务器和数据库要选择同一地区的,我就是没注意数据库没有上海的,所以才导致悲剧,我想过用朋友的账号再弄一个,但是这样管理起来不方便,毕竟什么都是自己的,需要验证啥的时候才最方便,以前公司的服务器每次都要找相关人员要验证码,贼麻烦

所以,只有自己先在服务器装个数据库试试了,后面会给大家说说有单独数据库的差别,贼大

先附上服务器配置图:
在这里插入图片描述
在这里插入图片描述

部署

  • mysql数据库安装:

    这里我就不详细说了,给大家一个链接参考下,感谢这位作者:https://www.cnblogs.com/fanlinglong/p/6634937.html

  • jdk安装:

    这里也没啥好说的,不会的朋友可以自己搜一下
    需要注意的一点是,腾讯云的centOS7.2,环境变量一定要注意格式,不然会导致一些linux基本命令不能用,比如source,附上我的环境变量代码:

export JAVA_HOME=/usr/local/jdk/jdk1.8.0_211
export CLASSPATH=.:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

  • 项目部署:

    我的项目是用的boot自带tomcat+手写的一个shell脚本来部署,也附上我的shell脚本吧,里面包含了一键备份启动、重启、停止等功能,都是基本命令,很容看懂,可以根据自己需要改一下

#!/usr/bin/env bash
#
#
# Program Start Script
#
#

. /etc/profile

#存放需要更新的jar包路径
DIR="/XX/XX/XX/new"
#项目路径
PRO_BASE="/XX/XX/XX"
#备份路径
BACK_BASE="/XX/XX/XX"

BACKUP_TIME=$(date "+%Y%m%d%H%M%S")

#jar包名称
PRO="XXX-0.0.1-SNAPSHOT.jar"




md5_check() {
	OLD_MD5=`md5sum ${PRO} | awk '{print $1}'`
	NEW_MD5=`md5sum ${DIR}/${PRO} | awk '{print $1}'`
	if [[ "${OLD_MD5}" == "${NEW_MD5}"  ]];then
		echo -e "\033[31mThe JAR Package is the same! Please check jar Package!!!\033[0m"
	fi
}


case $1 in
	start)
		process=`ps aux | grep ${PRO} | grep -v grep | wc -l`
		if [ ${process} -eq 1 ];then
			echo -e "\033[31m xxx Program already started \033[0m"
		else
			#XXX为日志名
			nohup java -jar $PRO > XXX.log 2>&1 &
			echo $! > pid
			echo -e "\033[31m xxx Program start Success \033[0m"
			sleep 1
			#XXX为日志名
			tail -500f XXX.log
		fi
		;;

	stop)
		pid=`ps aux | grep ${PRO} | grep -v grep | awk '{print $2}'`
		kill -9 $pid
		echo -e "\033[31m xxx Program stop Success \033[0m"
		;;

	restart)
		process=`ps aux | grep ${PRO} | grep -v grep | wc -l`
		if [ ${process} -eq 0 ]; then
			./$0 start
			exit
		else
			./$0 stop
		fi

		# break

		while true; do
			process=`ps aux | grep ${PRO} | grep -v grep | wc -l`
			if [ ${process} -eq 0 ]; then
				./$0 start
				break
			else
				sleep 1
				echo "\033[31m xxx Program EXISTS \033[0m"
			fi

		done
		;;
	upgrade)
		backup_jar() {
			test -e $PRO_BASE/$PRO
			if [ $? -eq 0 ]; then 
				cp $PRO_BASE/$PRO $BACK_BASE/$PRO.${BACKUP_TIME} && echo -e "\033[31m xxx jar package Backup Success! \033[0m"
				cp -ra $DIR/$PRO $PRO_BASE
			else
				echo -e "\033[31mBackup xxx jar package Failure! xxx jar package Not EXISTS! \033[0m"
			fi
		}
		md5_check
		backup_jar
		./$0 restart
		;;
	*)
		echo -e "Usage: ${0}  {start|stop|restart|upgrade}"
		;;
esac

这里需要注意一下,centos7.2运行boot的jar包,会出现一个问题,启动时会卡在实例化 SecureRandom 对象这里:

org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of 
SecureRandom instance for session ID generation using [SHA1PRNG] took [420,121] milliseconds.

看了下启动日志,这里花了大概四百多秒,就在网上找了下原因,解决了
解决方案传送门:https://www.jb51.net/article/117086.htm

于是乎,就这样部署好了,但是看了下服务器的负载情况:
在这里插入图片描述
在这里插入图片描述
这。。。这。。。不会挂吧,这还是没有运行爬虫的情况下,感觉服务器像随时会炸一样,心惊胆战,就这样度过了一个下午,啥调试也没做,时不时想着上去看看服务器挂了没,服务器情况接下来再说,网站还差域名没搞完,接着来

腾讯云的域名注册也是很快的,4块钱买了个xyz的域名,因为发现其他比较好的后缀我想要的名字都被注册了,中午弄得,大概下午四五点的时候就审批通过了,还是很速度的

在这里插入图片描述
域名下来了,接下来就是用nginx做个路由转发了
召唤nginx安装传送门:https://www.cnblogs.com/knyel/p/7614863.html
如果只是个简单的路由转发,那么就可以暂时这么弄,打开niginx.conf,在http里面末尾处加上:

server {  
    resolver toufu.xyz; #指定域名
    listen 80;  
    location / {  
        proxy_pass http://localhost:端口号; #设定代理服务器的协议和地址  
    }

这样网站的部署算完毕了,接下来讲低配服务器填坑过程(主要还是因为服务器买错了,没得单独数据库o(╥﹏╥)o):

各种应用调试

为什么要调试呢,上面不是说跑了一下午没问题么,一下午是没问题,到晚上,数据库就给我挂了:
在这里插入图片描述
可以看出,内存果然被挤爆了,看来不折腾一下不行啊,于是乎,我先研究了一下mysql的基本设置
召唤传送门:https://blog.csdn.net/zhydream77/article/details/81285909
感谢这位大神的说明,平时我都不怎么看这种文章,为了服务器,我看了
于是我挑了其中四个参数来设置:

  • innodb_buffer_pool_size
  • performance_schema_max_table_instances
  • table_definition_cache
  • table_open_cache

下面我来说说挑选理由:
innodb_buffer_pool_size 用于缓存索引和数据的内存大小,肯定是越大越好,但是我的网站索引并不多,也不需是太需要,所以给我变小
performance_schema_max_table_instances 用于检测表对象最大数目,对于我这种小网站而言,不需要太大
table_definition_cache 用于设置表定义得缓存区大小
table_open_cache 用于设置打开表的缓存区大小

最终的我配置是:

innodb_buffer_pool_size=64m
performance_schema_max_table_instances=100
table_definition_cache=100
table_open_cache=64

搞定,重启mysql!

top -p 看了下mysql的内存占用,由之前的25%-35%到10%左右,刚才看了下:
在这里插入图片描述
嗯,很不错,差不多降低了三百多M的内存吧

接下来在调低一点jvm运行内存

改了下启动shell脚本,在nohup java 后面加上:

-Xms64m -Xmx128m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m

这里需要注意一下,我的jdk版本是1.8,所以不可以用XX:PermSize和XX:MaxPermSize来控制方法储存空间
从1.8开始,移除了永久代,1.7开始存储在永久代的部分数据就已经转移到了Java Heap或者是 Native Heap但1.7中并未移除
所以1.8之后只能通过设置元Metaspace(元空间)大小才能来代替之前的permsize

附上我四个项目分别的设置:

  • 用户中心:-Xms64m -Xmx128m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=64m
  • 注册中心:-Xms32m -Xmx64m -XX:MetaspaceSize=32m -XX:MaxMetaspaceSize=32m(只用来注册service)
  • 爬虫中心:无(爬虫任务量最多所以不限制)
  • api调用层:-Xms64m -Xmx128m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=64m(方法都比较简单,仅仅调用)

ok!restart
再附上调试之前我手动运行爬虫的时候内存使用情况:
在这里插入图片描述
再看看调试之后的内存:
在这里插入图片描述
比之前多了500M的样子,500M啊,我还能多部署两个项目呢,开心,睡觉

第二天早上起来上班,打开手机一看,不对啊,怎么内存升高到了1300多M:
在这里插入图片描述
怎么回事?看了下mysql,没变啊,那只有jvm了,于是百度了下原因
召唤解决办法:https://blog.csdn.net/mayifan0/article/details/80479903
于是果断加上了XX:CompressedClassSpaceSize这个参数;
在这里插入图片描述
OK!restart!
来看看内存:
在这里插入图片描述
跟之前一样,因为这个参数要看运行的时间来检验的,所以我下午两点钟的时候再看下,12点的时候还会运行爬虫

两点钟内存使用情况:
在这里插入图片描述
稍微增加了点,稳定在了1.3G以下了,不会想晚上那样,到了早上直接飙到1371M了

单独数据库的对比

在之前使用单独数据库的情况下,我的爬虫任务平均每次15分钟的样子运行完毕
在换成服务器本地数据库时,每次运行飙升到一个半小时完成,中间我没有改动任何代码,其实这跟我自己写的逻辑也有关系
数据库操作太频繁了,在我改变了代码逻辑后,最终也只能优化到半个小时左右完成,所以这也是我很后悔当初买错地区的最大的原因,内存可以优化,可以压缩,但是cpu是没有办法的。这就是我之前所说的数据库单独出来的差距,所以建议建站的朋友能单独买个数据库还是单独买一个,毕竟也才3块钱一个月,一年也才36,换来的提升是物超所值的

总结

虽然我不知道我这样配置是不是最好的,但是我会时刻关注自己服务器的情况来验证以下
回头看来也亏了服务器买错地域的小插曲,才让自己也开始关注运维的一些知识,以前在工作中几乎不怎么关注,公司服务器不够,升配,反正也不要自己钱,其实稍微调试一下就行,我这还是临时研究了下,就能搞定,如果长时间了解这方面的知识,相信能把服务器调校的更好,也是通过这次建站,了解了很多代码之外的知识,这些知识还是很有用的,如果有人看到这篇文章,欢迎给我一些建议我们互相交流一下运维方面的知识,最后,希望自己建站的小伙伴能少走弯路,把自己的网站弄的棒棒的,如果有大神看到不对的,请亲喷,也真心求教!

happy!

展开阅读全文

没有更多推荐了,返回首页