干货来了,分享一个自己用废弃笔记本制作服务器的过程。家里闲置了一台读书时候使用的笔记,已经很多年没有用过了,4G内存也不好用,扔掉又觉得可惜,卖也卖不掉,突然想到拿来制作一台服务器使用看行不行。
笔记本还是win7系统,要制作成linux系统来当作服务器更好使用
一. 安装linux系统
要安装系统我们可以使用u盘来制作一个系统启动盘
我使用的是Rufus - 轻松创建 USB 启动盘 这个工具制作启动盘
如果看文章的你此时已经无法访问这个网站了,我将下载好的工具包放到了csdn上你可以下载使用,或是去搜一下其他的工具。
地址:https://download.csdn.net/download/weixin_40754174/87760888
这个工具无需安装,双击即可使用
首先我们需要去下载linux系统镜像,我这里选择使用centos7的镜像,大家可以选择自己需要的系统镜像,不过安装过程可能有差别。
插入u盘,打开rufus软件
选择镜像文件->其他参数可以默认->点击开始
其他提示默认即可
开始制作:复制文件的过程比较久
复制完毕后关闭即可
u盘启动盘就制作好了,然后就可以把u盘插到我的旧笔记本上,启动电脑进入bios模式,每个品牌的电脑进去bios模式可能不一样,我这里是在启动界面按F2进入,进入后移动到boot页面
回车进入启动顺序调整页面
选择启动系统盘顺序,把u盘的选项放到前面,按F10保存重启即可进入u盘启动页面。
选择 Install CentOS 7 回车 安装开始
输出一大堆之后,进入系统配置页面,选择语言
然后选择要安装的系统磁盘
这里选择磁盘,第一个是u盘别选错了
提示磁盘空间不足,点击Reclaim space回收空间
删除全部
回到安装页面,点击开始安装
安装过程中,我们可以设置一下用户密码,这里我设置一下root用户密码即可
然后就等待安装完成。
二. 网络设置
安装完成后无法连接网络,在网上搜索各种解决方案,大概意思就是需要安装无线网卡、配置无线网卡,没有过多去研究这个,因为要用来做服务器,直接插网线会比较稳定,插入网线后可以正常上网。
如果你还是无法上网,通过ip addr命令可以查看有哪些网卡地址
我的是叫enp3s0,如果statue状态是DOWN的话,你可以输入ifup enp3s0 启动网卡。
你的网卡不会是这个名字,你可以根据ip地址192.168.xx.xx判断哪个是你联网线的地址。
进入/etc/sysconfig/network-scripts/ 目录下可以看到你的网卡配置文件
是以ifcfg-开头的配置文件
输入命令 vi ifcfg-enp3s0 编辑该配置文件,如图:
BOOTPROTO = static 表示静态ip,默认是动态的,你的电脑连上路由器后每次会动态分配ip地址,我们要做服务器肯定需要把ip固定下来,所以这里需要设置为静态ip
GATEWAY 是网关地址,需要登录路由器管理页面进行设置,在系统设置->局域网设置里面,路由器不同有些许不同,但目的就是设置一下路由器的ip,以及设置局域网内的ip地址范围:
IPADDR设置的地址需要在上图的ip地址分配范围内。
DNS可以设置多个,需要设置DNS才能上网,8.8.8.8是谷歌提供的DNS服务器
ONBOOT 表示开机启动该网卡。
这样就可以正常上网,且每次开机都是一个固定的局域网内ip地址了,现在你在局域网内就可以通过192.168.7.77来访问这台电脑。
三. 如何远程连接服务器
这里推荐使用FinalShell这个连接工具,比较好用。
你可能输入ip和端口却无法连接,不用慌,那是因为防火墙。
查看防火墙状态: systemctl status firewalld.service
绿色的running表示防火墙开启。
如果你不考虑其他安全问题,你可以直接关闭防火墙就能连接了。
关闭防火墙: systemctl stop firewalld.service
再次执行查看防火墙命令:systemctl status firewalld.service
执行开机禁用防火墙自启命令 : systemctl disable firewalld.service
但是建议大家还是开启防火墙,这是一道网络保护,因为我们后面还有映射到公网上去。
开启防火墙状态下就需要配置防火墙规则,添加可以访问的端口。
开放指定端口
firewall-cmd --zone=public --add-port=22/tcp --permanent
命令含义:
--zone #作用域
--add-port=22/tcp #添加端口,格式为:端口/通讯协议
--permanent #永久生效,没有此参数重启后失效
重启防火墙 (添加端口后必须重启,不然你还是访问不了)
firewall-cmd --reload
删除端口 (删除的命令也写下来,如果添加错误了可以删除)
firewall-cmd --zone=public --remove-port=xxx/tcp --permanent
查看开启的端口: firewall-cmd --zone=public --list-ports
四. 如何在外网访问服务器
上面我们已经能够在局域网内访问自己的服务器了,但是还无法在外网访问,等于说你只能在你家里使用,而且部署了应用也只能在家里访问,那有什么意义呢,所以下面教大家如何拐个弯使用外网也能访问到,而且不需要你去搞比较贵的类似花生壳之类的内网穿透工具,而且还有流量限制,也不需要拉专线固定ip地址。
首先,我们需要宽带分配的ip地址是公网ip地址,因为现在很多宽带都是给的虚拟ip地址,虚拟ip是无法访问到的,电信宽带是可以打10000号要求客服修改为公网ip,我家里是用的电信,不知道其他运营商能不能给公网ip。
怎么看是否是公网ip呢,直接打开百度搜索ip,这个ip就是公网ip地址
再打开路由器管理页面查看WAN口ip
如果WAN口ip与百度搜索的公网ip地址一样,你的宽带分配的就是公网ip,否则就是虚拟ip。
有了公网ip后,我们需要设置内外网端口映射,进入宽带管理页面,将虚拟服务器中添加端口映射就可以了,比如你需要ssh到服务器上, 你就将外网端口22映射到你的这台电脑ip上的22端口即可。
我的路由器配置截图:
这样配置了后,就可以在外网通过公网ip地址进行ssh(22端口)连接了,我这里还配置了其他端口8000用于web服务,3306用于mysql数据库。
如图:用公网ip地址连接
但是普通宽带的公网ip地址是动态变化的,一段时间后即使你没有重启路由器他还是会变化,只有专线宽带的ip才是固定的,这样一旦ip地址变化了我们就无法连接和访问了,网上有很多内网穿透工具,比如收费的花生壳,还有免费的ngork,frp等等,大家都可以去试试,我用了ngork,之前也用过花生壳,但都觉得不爽,免费的不稳定,收费的又太贵。于是我想到一个方法,利用阿里云域名做自动的ddns解析。
五. 阿里云域名动态ddns
首先去阿里云买一个域名,可以买个便宜后缀的,比如.top
进入阿里云域名购买,输入你想要注册的域名
我买了个.top的域名,直接买了10年,才188。
买域名需要实名认证,然后才能解析,进入解析页面
添加一条记录,映射到你当前的ip地址,等解析正常了就可以用这个域名去访问你的服务器了。
如图:
也就是说,我们只要能实现,当ip地址变化后,能自己将变化后的ip地址解析到这个域名上,那我们就可以使用域名来访问服务器,使用域名来访问我们部署的服务页面等等。
正好,阿里云提供了这个接口来进行域名解析修改
文档地址:如何调用UpdateDomainRecord根据传入参数修改解析记录_云解析DNS-阿里云帮助中心
所以思路就是: 写一个程序放在我们的服务器上,定时去获取公网ip地址(时间间隔根据你自己需要来设定,经过我这几天的观察,其实公网ip地址变化频率并不高,有可能几天都不变化一次,也有几小时就变化一次的情况), 我设置了个5分钟的定时任务去获取公网ip地址,然后通过调用阿里云的api接口修改域名解析。
我这里使用的是java来开发定时任务。
关键代码如下:
public void refreshDdns(String currentIp) throws Exception {
// 获取解析记录
DescribeDomainRecordsResponseBody.DescribeDomainRecordsResponseBodyDomainRecordsRecord domainDnsRecord = this.getDomainDnsRecord();
String currentDdnsIp = "";
currentDdnsIp = domainDnsRecord.value;
if (!currentDdnsIp.equals(currentIp)){
// 刷新解析记录
this.updateDomainDnsRecord(domainDnsRecord,currentIp);
} else {
logger.info("无需修改解析记录,当前IP:{}",currentIp);
}
}
private DescribeDomainRecordsResponseBody.DescribeDomainRecordsResponseBodyDomainRecordsRecord getDomainDnsRecord() throws Exception {
DescribeDomainRecordsRequest describeDomainRecordsRequest = new DescribeDomainRecordsRequest()
.setDomainName(domain);
// 获取记录详情
DescribeDomainRecordsResponse domainRecordsResponse = client.describeDomainRecords(describeDomainRecordsRequest);
List<DescribeDomainRecordsResponseBody.DescribeDomainRecordsResponseBodyDomainRecordsRecord> records = domainRecordsResponse.getBody().getDomainRecords().getRecord();
DescribeDomainRecordsResponseBody.DescribeDomainRecordsResponseBodyDomainRecordsRecord record = records.get(0);
logger.info("获取解析记录:{}", JSON.toJSONString(record));
return record;
}
private void updateDomainDnsRecord(DescribeDomainRecordsResponseBody.DescribeDomainRecordsResponseBodyDomainRecordsRecord domainDnsRecord,String newIp) throws Exception {
// 修改记录
UpdateDomainRecordRequest updateDomainRecordRequest = new UpdateDomainRecordRequest()
.setRecordId(domainDnsRecord.getRecordId())
.setRR(domainDnsRecord.getRR())
.setType(domainDnsRecord.getType())
.setValue(newIp);
// 修改记录
UpdateDomainRecordResponse updateDomainRecordResponse = client.updateDomainRecord(updateDomainRecordRequest);
logger.info("修改解析结果:{}",JSON.toJSONString(updateDomainRecordResponse));
}
运行下来结果很满意,能在外网随时访问到家里的服务器和应用。