2014年6月26日星期四

Nginx中虚拟主机配置原理

背景

今天有一个需求,就是想让指定HOST的http请求可以访问某个服务,但是其他HOST过来的请求无法使用HTTP协议; 查了一下NGINX中关于虚拟主机的配置信息,Nginx中关于虚拟主机的配置原理是这样的,假设现在配置了三个server,例如:
server {
    listen      80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      80;
    server_name example.net www.example.net;
    ...
}

server {
    listen      80;
    server_name example.com www.example.com;
    ...
}
这三个虚拟主机配置,server_name限定了访问的HOST,当example.org,example.net,example.com的host请求来临时,会访问到对应的server下的配置服务上。 当然,如果来了一个localhost,或者其他的HOST请求时,此时会访问到第一个server配置,Nginx中会默认第一个server配置为default配置。 当然,可以通过default_server来指定默认服务配置是哪一个,例如:
server {
    listen      80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      80 default_server;
    server_name example.net www.example.net;
    ...
}

server {
    listen      80;
    server_name example.com www.example.com;
    ...
}
此时会使用第二个配置作为默认配置; (注:default_server从Nginx 0.8.2以后的版本有效,以前使用default关键字) OK,了解这个原理之后,上面的需求也变得非常简单了,只需要在default配置中不配置指定的服务,而将服务proxy配置到对应的虚拟主机下即可达到效果;

深入配置

如何限制不带HOST的请求?可以通过如下配置:

server {
    listen       80;
    server_name  "";
    return       444;
}
如何监听某一个IP地址上的端口?
server {
    listen      192.168.1.1:80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      192.168.1.1:80 default_server;
    server_name example.net www.example.net;
    ...
}

server {
    listen      10.10.1.192:80 default_server;
    server_name example.com www.example.com;
    ...
}
上面的配置展示了监听指定IP地址+端口上的请求,当一个来自192.168.1.1:80端口上的请求来临时,如果match到了配置的HOST会按虚拟主机配置的服务进行中转,没有match则会走default配置。
值得注意的是,不同ip+端口可以有自己的default_server.
所以当配置一个内网请求的时候,可以通过指定监听IP地址的方式,通过监听内网IP+port上的请求来达到限制内网访问的目的。

没有评论:

发表评论