需求:自己搭建一台dns服务器,使局域网内的主机能通过服务器解析域名,访问具体的服务
linux主机(dns服务器):
- 操作系统:ubuntu14.0.4
- ip: 10.0.22.20(ifconfig的内网ip)
windows主机(用于测试):
- ip: 10.0.10.8(ifconfig的内网ip)
- 程序端口:8030
一.搭建dns服务器
以下操作都在DNS服务器主机操作:
1.完全卸载bind9(清除之前所有bind9的配置,首次安装请忽略)
sudo apt-get purge bind9
2.安装bind9
sudo apt-get -y install bind9
3.bind9配置文件的介绍
Bind的配置文件,放在/etc/bind9/目录下,主要的配置文件有以下4个,分别是:
/etc/bind9/named.conf(主配置文件)
/etc/bind9/named.default-zones;
/etc/bind9/named.conf.options;
/etc/bind9/named.conf.local(域名和数据文件的配置)
其中,/etc/bind9/named.conf是Bind的主配置文件,不过他并不包含DNS数据。查看/etc/bind9/named.conf文件可以发现,主配置文件里面使用了include关键字来加载其它3个配置文件。
在/etc/bind9/named.conf.options文件中,有一句默认的配置(如下),该语句的所示的目录的作用是存放正向解析以及反向解析的一些配置文件,该配置告诉Bind,到/var/cache/bind目录下去寻找数据文件
4.添加正向解析配置(我们这里只做正向解析,即解析域名为ip)
- 修改/etc/bind/named.conf.local文件
sudo vim /etc/bind/named.conf.local
- 添加以下信息
zone "pppercy.com" { //设置你要配置的域名
type master;
file "db.pppercy.com"; //这里指向了数据文件,具体位置在/var/cache/bind/db.pppercy.com
};
- 创建db.pppercy.com文件
因为这时db.pppercy.com文件是不存在的,我们复制一个现有的文件作为db.pppercy.com文件的模板
sudo cp /etc/bind/db.local /var/cache/bind/db.pppercy.com
- 修改db.pppercy.com文件
sudo vim /var/cache/bind/db.pppercy.com
- 将其改为如下内容(这里的10.0.10.8为我运行了项目的windows主机ip。注意文件内容不要缺失)
;
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA localhost. root.localhost. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns.
@ IN A 10.0.10.8
www IN A 10.0.10.8
@ IN AAAA ::1
- 重启bind9
sudo service bind9 restart
以下操作都在windows测试主机操作:
测试
- 修改dns
- 启动项目(端口我这里设置的为8030。如果没有测试的项目也可以不用。我们搭建的目的是看到底dns服务器是否解析了我们的域名,则跳过此步)
- 刷新dns缓存(打开cmd运行)
ipconfig /flushdns
- 测试(如果有响应则表示搭建成功,dns成功解析域名)
- 这样我们就可以在浏览器通过域名加端口访问项目了
二.实现nginx的端口转发:
这时我们的dns服务器已经搭建好了。只要是局域网内的主机,将dns都配置为你的dns主机ip。都可以通过
域名加端口访问你的项目了。但是平时我们访问一个网站,难道还要加上端口访问吗?现在,我们就用nginx的端
口转发,把这个讨厌的端口去掉
以下操作都在DNS服务器主机操作:
- 安装nginx
sudo apt-get install nginx
- 修改db.pppercy.com文件
sudo vim /var/cache/bind/db.pppercy.com
- 将其改为如下内容(这里的10.0.22.20是dns服务器主机ip。注意文件内容不要缺失)
;
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA localhost. root.localhost. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns.
@ IN A 10.0.22.20
www IN A 10.0.22.20
@ IN AAAA ::1
- 修改nginx的配置文件
sudo vim /etc/nginx/sites-available/default
我们知道nginx.conf是nginx的主配置文件
但是在http模块中有这两行代码,一种包含关系
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*
sites-available是存放当前的server的配置, 在这里修改
而sites-enabled是激活并使用的server配置(从sites_available的文件创建快捷方式到sites-enabled)
你会发现sites-available里面增加的内容,会立即复制到sites-enabled里面
之间遇到一个问题,如果我直接把server的配置增加到主配置文件的http模块,配置一个可以正常启动,配置两个就启动失败,然后将server的配置都放到了sites-available/default这个文件就可以了
5. 添加以下内容
server {
listen 80;
server_name pppercy.com;
location / {
proxy_pass http://10.0.10.8:8030;
}
}
- 重启nginx
sudo service nginx restart
- 重启bind9
sudo service nginx restart
以下操作都在windows测试主机操作:
测试
- 刷新dns缓存(打开cmd运行)
ipconfig /flushdns
- 成功访问
总结
- 解析流程:
访问pppercy.com域名——>dns服务器进行解析——>找到db.pppercy.com数据文件——>数据文件指向dns服务器主机ip的80端口(80端口可以省略)——>nginx监听了当前主机的80端口——>匹配nginx的配置文件的server项的server_name——>匹配成功——>成功转发到http://10.0.10.8:8030 - 讨论一个问题:nginx到底应该安装在哪里?
1.跑项目的主机(按道理来说项目应该是跑在linux主机的,这里为了测试方便就直接拿了个跑在windows主机的项目进行测试了)
2.dns服务器
如果安装到跑服务的主机 nginx的默认端口是80 而我们在bind9的数据文件中指向的正是10.0.10.8:80 当我们访问pppercy.com的时候 nginx配置的server的server_name将会匹配这一个域名 再转发到10.0.10.8:8030。这时我们同样可以实现端口转发。同样的,这台主机在8020端口又跑了一个服务,我们同样给nginx增加一个server配置 再到dns服务器配置一个pppercy2.com的域名,其数据文件也指向10.0.10.8:80,当我们访问pppercy2.com的时候 nginx又会转发到10.0.10.8:8020
但是 如果另一个项目跑在另一个主机 那又要重新安装一个nginx 这就导致了每一台跑服务的主机都需要安装nginx进行配置 所以 索性我们直接将nginx安装在dns服务器 无论哪台主机的项目 都需要先经过dns服务器进行解析 解析后再通过安装到当前dns服务器的nginx进行端口转发