前景提要

作为一名热爱互联网的程序员,一直以来,拥有并维护我的个人站点是我的爱好。经过不断的学习,终于,我弄懂了构建一个个人站点的全部流程和知识。相比网上各种一键搭建的来说,我这篇文章会着重于描述各个细节,以及很多容易被坑的地方。示例站点:https://www.amrom.tk 虽然说搭建个人站点很简单,但是简单的背后仍然涉及到各方面的知识。我总结了以下大概有以下仿方面的知识:

  1. Linux操作
  2. 域名注册,域名解析
  3. DNS解析
  4. CDN加速
  5. Nginx配置
  6. ssl证书配置
  7. nginx隐藏服务器IP
  8. nginx强制http流量转https
  9. nginx配置server_name参数

… 需要了解的知识很多,每一个环节都有很多细究地方。

准备工作

需要准备什么呢?

  1. 购买域名
  2. 购买服务器
  3. Linux相关知识

域名可以使用frenom的tk免费域名,服务器推荐vultr的5$每月的即可

名词解释

域名

域名是指浏览网页时输入的特定字符,例如http://www.amrom.tk中,http://是指使用协议,amrom.tk是域名,即我从域名服务商手中购买的域名。再细一步解释,tk是顶域,和com一样,一般用国家名缩写,我们只能注册tk下的子域,wwwamrom.tk的子域,我注册了amrom.tk域名,即拥有其所有子域的控制。www是一般通用表示网页的子域。不加任何子域,例如http://amrom.tk也是一个合法地址。且和http://www.amrom.tk不是代表同一个。

DNS

DNS是负责解释IP和域名的对应关系,例如DNS服务器会把amrom.tk解析到104.31.64.219,使用ping命令即可看出:

C:\Users\linji>ping amrom.tk
正在 Ping amrom.tk [104.31.64.219] 具有 32 字节的数据:
来自 104.31.64.219 的回复: 字节=32 时间=226ms TTL=52
来自 104.31.64.219 的回复: 字节=32 时间=226ms TTL=52
来自 104.31.64.219 的回复: 字节=32 时间=224ms TTL=52
来自 104.31.64.219 的回复: 字节=32 时间=204ms TTL=52
104.31.64.219 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 204ms,最长 = 226ms,平均 = 220ms

当你在浏览器地址栏输入http://amrom.tk的时候,浏览器并不知道要访问那个服务器,所有当DNS服务器告诉浏览器http://amrom.tk对应的IP是104.31.64.219的时候,浏览器就会和这个IP建立通信,达到连接。

使用nslookup检测DNS解析地址:

C:\Users\linji>nslookup amrom.tk
DNS request timed out.
    timeout was 2 seconds.
服务器:  UnKnown
Address:  2400:3200::1
DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
*** 请求 UnKnown 超时
C:\Users\linji>nslookup amrom.tk 8.8.8.8
服务器:  dns.google
Address:  8.8.8.8
非权威应答:
名称:    amrom.tk
Addresses:  2606:4700:3032::681f:40db
          2606:4700:3033::681f:41db
          104.31.64.219
          104.31.65.219
C:\Users\linji>nslookup amrom.tk 114.114.114.114
服务器:  public1.114dns.com
Address:  114.114.114.114
非权威应答:
DNS request timed out.
    timeout was 2 seconds.
名称:    amrom.tk
Addresses:  104.31.64.219
          104.31.65.219
C:\Users\linji>

以上进行了3次nslookup查询,第一次使用系统默认DNS解析服务器查询,没有查询结果,原因是查询服务器不可用; 第二次指定了查询服务器地址8.8.8.8,这是谷歌提供的DNS服务器,返回的结果表明站点的IP有4个,两个IPv6的和两个IPv4的。 第三次指定了查询服务器地址114.114.114.114,DNS服务器为我返回了站点的IP是104.31.64.219104.31.65.219; 由于国内的IPv6服务不够普及,电信的DNS服务器114,没有给出该站点的IPv6地址。

【非权威应答】的解释: 由于当前得到查询结果的DNS服务器不是目标站点配置的解析服务器,是通过递归查询得到的,所以认为是非权威应答,想要得到权威应答就需要指定DNS查询服务器地址为站点配置的地址:

C:\Users\linji>nslookup amrom.tk max.ns.cloudflare.com
服务器:  max.ns.cloudflare.com
Address:  173.245.59.132
名称:    amrom.tk
Addresses:  2606:4700:3033::681f:41db
          2606:4700:3032::681f:40db
          104.31.64.219
          104.31.65.219
C:\Users\linji>

以上即得到了权威的应答。

备注:站点同时支持IPv4和IPv6的部署方式叫做双线部署,在ipv4资源匮乏的今天,ipv6越来越普遍,以后的ipv6站点会成为常态化。但是也有理论认为,仅仅物联网才需要使用ipv6地址,一般站点仍会采用ipv4。。。。。不做讨论。

CDN

CDN中文名是内容分发网络,用作站点访问的加速。CDN加速的原理可以这样解释:我的服务器物理地址在美国,那么每次当我从杭州访问的时候,肯定要经过海底光缆等很长时间的传输才能访问到内容,这个时间很长,再加上很多防火墙的限制,丢包率也会很高。CDN服务在杭州给我分配一台机器,把我美国的机器上的内容复制了一份在杭州,那么我访问站点的时候,直接把IP解析成杭州的CDN服务器即可,速度大大提升。使用CDN的好处有以下几点: 1. 加速站点访问,具体来说就是加速静态资源的防范,至于动态的资源是无效的。 2. 隐藏站点的真实机器IP,使用CDN加速的站点是无法直接通过ping等命令显示出源站的,例如上述的104.31.64.219就是cloudflare的CDN节点IP,并且在不同的物理位置得到的站点IP是不一样的。 使用tracert路由跟踪站点amrom.tk

C:\Users\linji>tracert amrom.tk
通过最多 30 个跃点跟踪
到 amrom.tk [104.31.65.219] 的路由:
  1     *        *        *     请求超时。
  2    <1 毫秒   <1 毫秒   <1 毫秒 172.16.0.1			## 本地局域网路由地址
  3     1 ms    <1 毫秒   <1 毫秒 192.168.1.1		## 同上
  4    31 ms    16 ms    97 ms  115.192.112.1		## 杭州电信主干网IP
  5     1 ms     1 ms     1 ms  61.164.19.8			## 同上
  6     6 ms     4 ms    13 ms  61.164.22.153		## 同上
  7     7 ms     6 ms    15 ms  202.97.92.41		## 同上
  8    29 ms     *       22 ms  202.97.57.25		## 同上
  9     6 ms     6 ms     4 ms  202.97.12.194		## 北京电信
 10     *      153 ms   157 ms  202.97.58.170		## 中国电信主干网	
 11   167 ms     *      169 ms  202.97.50.26		## 中国电信主干网
 12   188 ms     *      175 ms  218.30.54.214		## 美国加利福利亚机房IP
 13   151 ms   149 ms   149 ms  104.31.65.219		## CloudFlare机房IP
跟踪完成。
C:\Users\linji>

以上路由跟踪可以看出,站点当前笔者所用计算机到站点amrom.tk的路由地址先出本地局域网,到达当代电信运营商出口,再到北京电信骨干网,最后通过北京的国际出口到达美国的目的机房。 整个过程经过了多次的DNS查询,最终的结果是我使用的CDN的IP,并没有暴露我本省的IP,我的真实IP是45.*.*.*

nginx配置

nginx的功能非常强大,可以用来做端口转发,静态资源服务器,web站点服务器,流量代理服务器等。此处介绍nginx的web站点代理和SSL证书配置。

  1. 最基本的配置

    server {
    	listen 80;
    	server_name localhsot;
    	root /home/wwwroot/3DCEList;
    	location /{
    		proxy_pass http://127.0.0.1:8000;
    		autoindex on;
    		index index.html index.jsp index.htm;
    	}
    }
    

    通过以上配置即可完成一个服务的配置,监听80端口,访问:80/**即可访问到服务:8000/**

  2. 禁止IP直接访问,要求访问者只能通过域名访问服务

    server {
    listen 80;
    server_name 45.*.*.*;
    return 301 http://baidu.com;
    }
    

    以上通过指定server_name为服务器IP,将所有直接访问IP的请求重定向到baidu.com,通过这种方式,可以达到隐藏站点IP,更加安全。

  3. 配置SSL证书

    出于安全考虑,现在大部分的站点都实现了https访问,而https访问必备的条件之一是站点配置了可信任的SSL证书,目前收费的证书很多,像赛门铁壳之类的,免费的用的比较多的有Trust Asia和Let’s Enscrpt。前者可以通过腾讯云申请,很简单,后者是自签证书,网上教程很多,不多赘述。申请好SSL证书后,在nginx中的配置如下:

    server {
    listen 443;
    ssl on;
    ssl_certificate /etc/nginx/conf/1_blog.linjinbao66.tk_bundle.crt;
    ssl_certificate_key /etc/nginx/conf/2_blog.linjinbao66.tk.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    server_name blog.linjiinbao66.tk;
    root /root/blog/linjinbao666;
    location /{
            autoindex on;
            autoindex_exact_size off;
            autoindex_localtime on;
    }
    }
    

    站点配置了SSL证书后,使用浏览器访问的时候,会在地址栏标明这是一个安全的连接。

    备注1:nginx中可以配置多个SSL证书,对应不同的server_name,也可以使用通配符证书,*.example.com

    备注2:https的安全性建立在本地证书和服务器端证书都可信的原则上,如果本地的根证书不安全,那么就会出现基于证书的中间人攻击;

    举例来说:沃通是一个根证书,可以内置在浏览器内或者操作系统内,或者主动安装在操作系统内,沃通签发一个github.com的证书,则可以自证证书的正确性;此时,如果你使用了内置了沃通证书的浏览器,如360浏览器,你在浏览器访问github.com的时候,访问的就不是真正的github.com,而是经过伪造的站点,但是此时浏览器无法识别出这个伪造站点。随着软件国产化的推进,SSL证书的安全性正在遭遇新的挑战。

    相关连接:https://www.zhihu.com/question/50298017

  4. http流量强转https流量

    由于https出现的较晚,很多人的印象还是停留在http的时代,访问站点的时候习惯性的去访问http站点;此时,http请求转成https就变得非常重要了。示例配置如下:

    server {
    listen 80;
    server_name www.amrom.tk;
    return 301 https://www.amrom.tk$request_uri;
    }
    

    以上配置,指定http的默认80端口的访问使用301跳转到https://地址,这种配置还可以在全站升级成https访问的同时兼容老旧的访问url。

  5. nginx配置支持ipv6访问

    nginx的默认编译模块不包含ipv6模块的,需要添加模块,然后配置如下:

    server {
        listen 80 default_server;
        listen   [::]:80 default_server;
        server_name _;
        return 301 https://www.amrom.tk$request_uri;
    }
    

    此处的配置兼容ipv4和ipv6双线访问;如果希望站点只支持ipv6则需要改成 listen [::]:80 ipv6only=on;

总结

总的来说,从零开始构建一个站点,对于老手来说,非常快速,但对于新手来说,则会变得异常复杂。原因就是知识面的缺乏,这中间要求的知识涉及到网络的很多知识,还有很多小窍门,一次性全部都学会是不可能的,我们需要在不断的摸索过程中了解原理。 当然,到目前位置,我们只是构建了一个最简单的静态站点,虽然使用了CDN的加速优化,但是很明显还有更多的优化空间,以及高并发访问的问题还没有做探讨。笔者也在学习中,等学会了在写。

PS: no-chache参数设置 nginx负载均衡 epoll优化 。。。。。。