背景
今天有一个需求,就是想让指定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;
}
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上的请求来达到限制内网访问的目的。
没有评论:
发表评论