基于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配置文件。
参考资料
- 搭建nginx反向代理用做内网域名转发,http://www.ttlsa.com/nginx/use-nginx-proxy/
- nginx 域名跳转一例~~~(rewrite、proxy),http://blog.51cto.com/storysky/486338
- Nginx多域名多Server反向代理配置,https://www.cnblogs.com/tonykan/p/3507082.html
- 在Windows7 系统上部署DNS服务器,http://blog.csdn.net/hyman_c/article/details/53560891