目录

服务器的n种玩法

前段时间心血来潮,租了个服务器和域名,搭好了个人邮箱和这个网站。一是因为一直觉得有个自己专属域名的网站和邮箱是一件很酷的事,二来也是想熟悉一下Linux以及计算机网络相关的知识。这篇博客将记录我搭网站和邮箱的过程,我想以后再搭一个小型的网盘的服务,也将会一并记录在这里,正如这篇博客的名字一样,我想尽可能多地利用服务器玩一些有趣的东西,毕竟已经花了钱了,同时对我这个计算机新手来说也是一个学习的过程。这段时间正值期中,有很多作业要做,我会慢慢将这篇文章更新完。

准备工作

在做这一切之前,我们需要一台服务器和一个域名。域名不是必要的,因为通过ip也可以直接访问到服务器,但如果要搭邮箱的话是一定需要域名才可以收发邮件的;并且没有炫酷的域名,装逼的效果至少少了一半。相对于服务器来说一个普通域名的价格不是很贵,所以可以的话还是尽量买一个炫酷的个性化的域名吧!我的服务器是租的搬瓦工的vps,国内也有腾讯云等等服务器可以选择,但因为使用国内的服务器搭建网站需要备案,所以我首选了国外的服务器。域名是通过namecheap购买的,同样还有Godaddy等等很多选择。

在以下所有操作中,使用的操作系统均为Centos 7 x86_64。

邮箱

网上有许多开源的邮箱服务可以选择,如iRedMailExtMailZimbra等等。我选择了EwoMail的开源版,因为他看上去比较好搭,不过对于其他的邮箱应该过程也会差不多。

在docker中运行EwoMail

EwoMail的官方文档中,有一个要求:“Centos 7/8系统64位,服务器需要干净环境,要求全新干净系统,不能安装在已有的Nginx,MySQL的环境中。”刚开始我不太信邪,我想要在安装EwoMail后再自己安装一个Nginx服务作为主要的反向代理,一直监听80和443端口,将不同的请求转发到不同端口。比如如果是mail.waynez.me的请求,就转发到8080端口,如果是waynez.me的请求,就返回我的博客主页,这样我可以在一台服务器上同时布置邮箱的博客的服务。但当我按照EwoMail文档安装后,发现里面集成了好了Nginx和MySQL的服务,而这会和我自己想要的Nginx产生冲突,也就是为什么会文档中会要求不能安装在已有的Nginx,MySQL的环境中。我觉得这是个很不人性化的设计,这就意味着我在这台服务器上搭了邮箱后就不能再做其他的事情了。这时我想到docker也许是个解决方法,将EwoMail放在docker中,这样不会对我的其他的环境造成影响。我可以在docker外面再安装一个Nignx,作为主要的请求代理,如果监听到是对mail.waynez.me的请求,就可以将请求转发到docker中的EwoMail的对应的监听端口。

docker的安装过程很简单,使用官方脚本自动安装:

1
$ curl -fsSL https://get.docker.com | bash -s docker

安装好之后启动docker:

1
2
$ sudo systemctl enable docker
$ sudo systemctl start docker

搜索一下有没有制作好的EwoMail镜像可以直接用:

1
$ docker search ewomail

/img/how-to-play-with-a-server/1.png

我们就直接使用第一个bestwu/ewomail的镜像:

1
$ docker pull bestwu/ewomail:latest

下载好后,使用docker images应该就能看到刚刚下载的镜像。

/img/how-to-play-with-a-server/2.png

确认下载没问题后,使用下面的命令来运行docker:

1
$ docker run -d -h yourhost.name --restart=always -p 25:25 -p 109:109 -p 110:110 -p 143:143 -p 465:465 -p 587:587 -p 993:993 -p 995:995 -p 8081:80 -p 8080:8080 -v `pwd`/mysql/:/ewomail/mysql/data/ -v `pwd`/vmail/:/ewomail/mail/ -v `pwd`/ssl/certs/:/etc/ssl/certs/ -v `pwd`/ssl/private/:/etc/ssl/private/ -v `pwd`/rainloop:/ewomail/www/rainloop/data -v `pwd`/ssl/dkim/:/ewomail/dkim/ --name ewomail bestwu/ewomail

和官方给的命令比起来,我修改了一个小地方:把-p 80:80改成了-p 8081:80,也就是把docker的80端口映射到了主机的8081端口。这是因为之前所说的,我会在docker外装一个Nginx作为主要的反向代理,所以主机的80端口会一直被外面的Nginx监听。把docker内的80端口映射到其他不太重要的端口,就可以通过Nginx将请求转发到对应的端口,这样我就不需要修改docker里面的配置,简单地通过指定端口映射达到我想要的目的。

关于各个端口的作用,可以参考以下说明:

  • 25端口为SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务所开放的,是用于发送邮件。
  • 109端口是一个POP3(Post Office Protocol Version 3,邮局协议3)服务器端口,用于接收邮件,客户端访问服务器端的邮件服务。POP3服务器开放此端口,用于接收邮件,客户端访问服务器端的邮件服务。
  • 110端口是为POP3服务开放的,是用于接收邮件的。
  • 143端口是为IMAP(INTERNET MESSAGE ACCESS PROTOCOL)服务开放的,是用于接收邮件的。
  • 465端口是为SMTPS(SMTP-over-SSL)协议服务开放的,这是SMTP协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。SMTPS和SMTP协议一样,也是用来发送邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件发送者抗抵赖功能。防止发送者发送之后删除已发邮件,拒不承认发送过这样一份邮件。
  • 587端口是现代网络上SMTP提交的默认端口。
  • 993端口是为IMAPS(IMAP-over-SSL)协议服务开放的,这是IMAP协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。IMAPS和IMAP协议一样,也是用来接收邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件接收方抗抵赖功能。防止收件者收件之后删除已收邮件,拒不承认收到过这样一封邮件。
  • 995端口是为POP3S(POP3-over-SSL)协议服务开放的,这是POP3协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。POP3S和POP3协议一样,也是用来接收邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件接收方抗抵赖功能。防止收件者收件之后删除已收邮件,拒不承认收到过这样一封邮件。
  • 8081端口为邮箱登录入口,8080端口为邮箱管理入口。

到这里,如果没有问题的话,邮箱服务就已经搭好啦!通过8080端口可以访问邮箱管理后台http://server-domain-or-ip:8080,默认用户是admin,默认密码是ewomail123。进入后台管理后,我们可以管理邮箱并为邮箱创建新的账号。

添加域名解析MX记录和A记录

现在我们已经有了邮箱的账号,要怎么登录进去呢?因为我们刚刚把登录的80端口映射到了主机的8081端口,所以可以通过http://server-domain-or-ip:8081进入邮箱登录界面,使用上一过程中创建的账号就可以登录啦!但是现在有两个问题:1)因为我们没有为邮箱绑定域名,现在其他主机是访问不到这个邮箱的服务的,我们既不能收邮件也不能发邮件;2)如果每次只能通过http://server-domain-or-ip:8081登录邮箱的话就太不炫酷了,我想和mail.qq.com、mail.163.com一样,能通过一个专属域名不加端口号就能访问到这个登录界面。

为了解决这两个问题,我们需要在域名中添加解析。还记得我们在准备工作中买的域名吗?现在我们打开域名的管理界面,一般在购买的平台都能找到管理域名的入口,比如我是在namecheap上买的,那么在Domain List -> MANAGE -> Advanced DNS就可以看到DNS的管理界面了。

/img/how-to-play-with-a-server/3.png

为了让我们的邮箱服务可以正常收发邮件,我们需要添加一条MX记录。例如,当有人发邮件给vincen@example.com时,系统将对example.com进行DNS中的MX记录解析。如果MX记录存在,系统就根据MX记录的优先级,将邮件转发到与该MX相应的邮件服务器上。

首先我们添加一条MX记录。如果希望将主域名作为邮箱名的话,Host填@,这样我的邮箱将会是example@waynez.me的形式。Value为主机地址,需要注意的是,Value必须是可以在DNS中解析的主机,而不能是ip,原因可以参考这里。因此我们需要先填一条A记录,比如将waynez.me解析为我的服务器地址,那么MX记录里的Value我就可以填waynez.me。优先级随便填,比如5。MX优先级用来指定邮件服务器接收邮件的先后顺序,数值越小优先级越高。因为我们只添加一条MX记录,所以MX优先级没有意义。

现在我们再添加一条A记录,用于邮箱登录。我想将mail.waynez.me作为邮箱登录的域名,因此在Host中填mail,在Value中填写服务器的ip地址,这样就会将mail.waynez.me解析到我的服务器ip上面了。

下载并配置Nginx

DNS记录添加好后,现在需要用Nginx在服务器上作为反向代理,将不同请求转发给对应的端口。Nginx不在默认的yum源中,因此我们先安装一个有Nginx的epel源:

1
$ sudo yum install epel-release

然后安装Nginx:

1
$ sudo yum install nginx

添加开机启动并启动Nginx:

1
2
$ sudo systemctl enable nginx
$ sudo systemctl start nginx

输入systemctl status nignx可以查看现在在状态,显示running就表示Nginx已经运行了,现在需要对Nginx进行配置,配置文件是/etc/nginx/nginx.conf,我们查看文件,可以看到有这样一句:include /etc/nginx/conf.d/*.conf;,这表示在读取这个配置文件时,会加载/etc/nginx/conf.d/目录下所有以.conf结尾的文件。

/img/how-to-play-with-a-server/4.png

我们可以直接在这个文件里面更改配置,也可以在/etc/nginx/conf.d/目录下修改,为了便于管理,我们进入/etc/nginx/conf.d/目录为每个子域名分别创建一个文件。

1
2
$ cd /etc/nginx/conf.d/
$ vim mail.conf

将以下配置写入mail.conf

1
2
3
4
5
6
7
8
server {
    listen       80;
    server_name  mail.your.domain;

    location / {
        proxy_pass http://127.0.0.1:8081;
    }
}

这表示Nginx会一直监听80端口,如果是访问mail.your.domain的请求,就转发给8081端口。之前我们将8081端口映射给了ewomail docker中的80端口,因此在浏览器中打开mail.your.domain就可以访问到邮箱登录界面了。到这里,邮箱已经可以正常收发邮件了。

关闭邮箱的杀毒服务

我的服务器内存只有1个G,前两天服务器的内存突然爆掉,我试着重启了几次,但只要一启动邮箱的docker,内存很快就再爆掉。使用top命令可以看到,一个叫做clamd的服务占用了大量的内存,导致机器瘫痪。我通过搜索才知道,这是ewomail里面带有的一个杀毒服务,很会占用内存,因此在我的服务器内存不太够用的情况下,需要把他关掉。我首先docker exec -it ewomail bash进入ewomail的docker中,使用kill命令杀死了这一进程,防止服务器再次崩溃,然后按照官网的说明关闭了杀毒服务。

博客

我使用了Hugo来搭建我的博客,他是一种基于Go语言的静态网站生成器,快速、安全、易于部署且方便管理。

在服务器上安装Hugo

因为Hugo是基于Go的,所以我们要先安装Go:

1
$ yum -y install golang

如果能通过go version看到以下输入的Go的版本,说明安装成功。

/img/how-to-play-with-a-server/5.png

接下来添加Hugo的源,vim /etc/yum.repos.d/hugo.repo后输入以下内容并保存:

1
2
3
4
5
6
7
8
9
[daftaupe-hugo]
name=Copr repo for hugo owned by daftaupe
baseurl=https://copr-be.cloud.fedoraproject.org/results/daftaupe/hugo/epel-7-$basearch/
type=rpm-md
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://copr-be.cloud.fedoraproject.org/results/daftaupe/hugo/pubkey.gpg
repo_gpgcheck=0
enabled=1

执行并安装Hugo:

1
$ yum -y install hugo

输入hugo version如果能输入如下的版本信息,说明Hugo就安装好啦。

/img/how-to-play-with-a-server/6.png