这里列举几个应用场景,下文会针对这几个场景并结合代码进行分析。nginx
1:proxy_pass + upstream服务器
upstream foo.example.com { server 127.0.0.1:8001; } server { listen 80; server_name localhost; location /foo { #匹配/foo结尾的域名 proxy_pass http://foo.example.com; #反向代理到foo.example.com
} }
访问http://localhost/foo时,proxy模块会将请求转发到127.0.0.1的8001端口上。spa
2:只有proxy_pass,没有upstream与resolver代理
server { listen 80; server_name localhost; location /foo { proxy_pass http://foo.example.com; } }
其实是隐式建立了upstream,upstream名字就是foo.example.com。upstream模块利用本机设置的DNS服务器(或/etc/hosts),将foo.example.com解析成IP,访问http://localhost/foo,proxy模块会将请求转发到解析后的IP上。code
若是本机未设置DNS服务器,或者DNS服务器没法解析域名,则nginx启动时会报相似以下错误:server
nginx: [emerg] host not found in upstream "foo.example.com" in /path/nginx/conf/nginx.conf:110
3:proxy_pass + resolver(变量设置域名)blog
server { listen 80; server_name localhost; resolver 114.114.114.114; location /foo { set $foo foo.example.com; proxy_pass http://$foo; } }
访问http://localhost/foo,nginx会动态利用resolver设置的DNS服务器(本机设置的DNS服务器或/etc/hosts无效),将域名解析成IP,proxy模块会将请求转发到解析后的IP上get