基于nginx反向代理的同IP多域名解析

基于nginx反向代理的同IP多域名解析

一般的自建网站系统中,一个域名对应一个公网IP地址;但现在公网IP资源有限,所以想到能够将多域名映射到同一IP,然后由软件进行对应域名请求的分发,本文介绍了使用nginx对多域名请求进行服务分发。

1 网站架构变化

一般情况下,不存在关联的多个网站的架构为:

网站域名 →→→ DNS解析公网IP地址→→→ 网站服务器
www.a.com 100.100.10.11 web server A
www.b.com 100.100.10.12 web server B
www.c.com 100.100.10.13 web server C

也就是说,浏览器通过网站域名访问,由DNS服务器解析为公网IP地址,然后由对应IP地址的服务器提供http服务。

一般情况下,如果是企业只有一个网站,且有一个公网IP地址,那么这种访问方式是不存在问题的。但当企业存在多个域名,但IP资源相对不足时,就需要从技术上进行改造网站架构。而增加nginx服务器之后,网站的架构为:

网站域名 →→→ DNS解析公网IP地址→→→ nginx服务器→→→ 网站服务器 内网地址
www.a.com     web server A 192.168.1.11
www.b.com 100.100.10.11 nginx server web server B 192.168.1.12
www.c.com     web server C 192.168.1.13

也就是说,多个域名可以映射为同一个公网IP地址,然后由nginx服务器根据用户请求转发到各自的网站服务器上,网站服务器仅需要内网地址就可以。

2 nginx的安装与使用

yum安装nginx

#因nginx的依赖关系较多,建议采取yum的安装方式
yum install nginx

nginx的配置文件为

/etc/nginx/nginx.conf

nginx的启动与停止

#开启nginx,默认配置文件为/etc/nginx/nginx.conf
nginx

#重启加载nginx配置
nginx -s reload

#重启nginx
nginx -s reopen

#优雅的关闭nginx,完成当前请求
nginx -s quit

#快速关闭nginx
nginx -s stop

3 nginx反向代理配置

修改主配置文件/etc/nginx/nginx.conf

user root root;
worker_processes auto; #由nginx自己判断最适合的工作进程数
error_log  /var/log/nginx/error.log; #nginx错误日志
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    use epoll;
    worker_connections 1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type application/octet-stream;
    
	log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'; #nginx日志格式

    access_log  /var/log/nginx/access.log  main; #nginx访问日志
    client_max_body_size 200M;	#代理用户请求缓冲区大小
    sendfile on;
    keepalive_timeout 65;
    gzip on;
    client_body_buffer_size 256k;
    client_header_timeout 3m;
    client_body_timeout 3m;
    send_timeout 3m;
    proxy_connect_timeout 300s; #反向代理连接超时时间
    proxy_read_timeout 300s;
    proxy_send_timeout 300s;
    proxy_buffer_size 64k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    proxy_ignore_client_abort on;
	
	include /etc/nginx/conf.d/*.conf; #各个代理分开配置,便于扩展
}

修改各个代理配置文件/etc/nginx/conf.d/*.conf

vim /etc/nginx/conf.d/a.conf
server
{
    listen 80;
    server_name www.a.com; #定义访问域名
    location / {
        proxy_redirect off;
        proxy_set_header Host $host; #将用户访问Nginx的请求转发为后端服务器的请求,修改对应的IP地址
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.1.11:80; #网站服务器内网地址
    }
    access_log /var/log/web/a.log; #指定nginx访问日志
}

vim /etc/nginx/conf.d/b.conf
server
{
    listen 80;
    server_name www.b.com;
    location / {
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.1.12:80;
    }
    access_log /var/log/web/b.log;
}	

vim /etc/nginx/conf.d/c.conf
server
{
    listen 80;
    server_name www.c.com;
    location / {
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.1.13:80;
    }
    access_log /var/log/web/c.log;
}	

将配置文件置于/conf.d/ 文件夹下是为了方便扩展,后期如果有新增域名,直接新增配置文件重新加载nginx配置文件即可。

4 多域名解析测试

4.1 真实域名和公网IP的测试

当域名a.con/b.com/c.com均真实存在,且存在一个公网IP地址时,可以直接在DNS服务提供商处将这些域名均绑定为nginx服务器的外网地址,然后在浏览器中输入www.a/b/c.com域名即可完成验证。

但是,作为我们实验来说,如果不存在真实的域名和公网IP地址,我们也可以搭建自己的DNS服务器来进行验证。

4.2 基于内网DNS的解析测试

DNS服务器的搭建

参考文档:在Windows7 系统上部署DNS服务器,http://blog.csdn.net/hyman_c/article/details/53560891 修改域名解析配置文件name.conf:

#增加如下解析配置
// a.com  
zone "a.com" IN {  
    type master;  
    file "a.com.zone";  
};

// b.com  
zone "b.com" IN {  
    type master;  
    file "b.com.zone";  
};

// c.com  
zone "c.com" IN {  
    type master;  
    file "c.com.zone";  
};

新增配置文件:a.com.zone、b.com.zone、c.com.zone

#a.com.zone
a.com.    IN  SOA   ns1.a.com.  root.a.com. (  
        2007091701         ; Serial  
        30800              ; Refresh  
        7200               ; Retry  
        604800             ; Expire  
        300 )              ; Minimum  
        IN    NS        ns1.a.com.  
*       IN    A         192.168.1.10
#IP地址192.168.1.10为nginx服务器的内网IP

#b.com.zone
b.com.    IN  SOA   ns1.b.com.  root.b.com. (  
        2007091701         ; Serial  
        30800              ; Refresh  
        7200               ; Retry  
        604800             ; Expire  
        300 )              ; Minimum  
        IN    NS        ns1.b.com.  
*       IN    A         192.168.1.10

#c.com.zone
c.com.    IN  SOA   ns1.c.com.  root.c.com. (  
        2007091701         ; Serial  
        30800              ; Refresh  
        7200               ; Retry  
        604800             ; Expire  
        300 )              ; Minimum  
        IN    NS        ns1.c.com.  
*       IN    A         192.168.1.10

在win7上将DNS服务器设置为:127.0.0.1,即可完成DNS服务器的配置。

访问测试

在这台win7电脑上,直接浏览器访问www.a/b/c.com域名,能够正常访问各自的网站,完成验证。

5 nginx服务器其他主题探讨

5.1 nginx服务器双机问题

当使用nginx代理多个网站时,nginx服务器本身的稳定性就显得尤为重要,我们可以选择keepalived软件搭建高可用的nginx双机环境。

5.2 网站服务器负载均衡问题

前面提到的网站均只有一个服务器,当网站访问量上升以后就需要搭建网站服务器集群,而此时也需要在nginx服务器上做出对应的配置,以网站www.a.com为例,修改配置文件:/etc/nginx/conf.d/a.conf

upstream www.a.com {
    server 192.168.1.111;
    server 192.168.1.112;
    #网站www.a.com的服务器集群内网地址,可以含有很多个
}

server
{
    listen 80;
    server_name www.a.com; #定义访问域名
    location / {
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://www.a.com;
    }
    access_log /var/log/web/a.log; #指定nginx访问日志
}

即在配置文件中增加upstream配置网站服务器集群,然后重新载入nginx配置文件。

参考资料

  1. 搭建nginx反向代理用做内网域名转发,http://www.ttlsa.com/nginx/use-nginx-proxy/
  2. nginx 域名跳转一例~~~(rewrite、proxy),http://blog.51cto.com/storysky/486338
  3. Nginx多域名多Server反向代理配置,https://www.cnblogs.com/tonykan/p/3507082.html
  4. 在Windows7 系统上部署DNS服务器,http://blog.csdn.net/hyman_c/article/details/53560891

如有疑问,欢迎交流

Table of Contents