我们在SOA
模式下松散地有一些同质的应用程序。由于同质性,我们已经能够在Nginx中定义一些简洁的模式,通过一种配置代理我们所有的SOA
应用程序。遵循Nginx配置绝对是与DNSmasq
一起工作的绝对奇迹来解决anything.yourdomain.devel
,例如。 a.stackoverflow.devel
,b.stackoverflow.devel
域并通过地图通过指定端口将其路由到项目文件夹下的相应应用服务器。
worker_processes 2;
events {
worker_connections 1024;
}
http {
map $host $static_content_root {
hostnames;
default /path/to/project/folder;
# For typical standalone apps living in your project directory
# *.myapp.local.devel -> /path/to/project/myapp/public
~^([^\.]+\.)*(?<app>[^\.]+)\.devel$ /path/to/project/folder/$app/public; #rails pattern
}
map $app $devel_proxy_port1 {
default 3000;
domain1 3000;
domain2 4000;
}
map $app $devel_proxy_port2 {
default 3001;
domain1 3001;
domain2 4001;
}
server {
listen 127.0.0.1;
server_name ~^([^\.]+\.)*(?<app>[^\.]+)\.[^\.]+.devel$;
location / {
root $static_content_root; # Using the map we defined earlier
try_files $uri $uri/index.html @dynamic;
}
location @dynamic {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forward-Proto http;
proxy_set_header X-Nginx-Proxy true;
proxy_redirect off;
proxy_pass http://127.0.0.1:$devel_proxy_port1;
}
}
}
现在,为了模拟 Nginx 负载均衡器后面的多个服务器。我想到了以下代理配置,它指向上游而不是直接指向一个服务器:端口对。
proxy_pass http://backend;
upstream backend {
server http://127.0.0.1:$devel_proxy_port1;
server http://127.0.0.1:$devel_proxy_port2;
}
我认为上面会有效,但它始终会发出以下错误,暗示上游上下文中 map 块的变量不可用。
[emerg] 69478#0: invalid host in upstream "http://127.0.0.1:$devel_proxy_port1" in /usr/local/etc/nginx/nginx.conf:57
这是预期的行为吗?
答案 0 :(得分:0)
是的,变量不能在上游使用。您可以使用不同的名称(upstream backend
,upstream backend_domain
等)创建一些上游块,通过map
解析上游名称并将此变量放到proxy_pass
:
upstream backend {
server http://127.0.0.1:3000;
server http://127.0.0.1:3001;
}
upstream backend_domain1 {
server http://127.0.0.1:3002;
server http://127.0.0.1:3003;
}
upstream backend_domain2 {
server http://127.0.0.1:3004;
server http://127.0.0.1:3005;
}
...
upstream backend_domain30 {
server http://127.0.0.1:3060;
server http://127.0.0.1:3061;
}
map $app $devel_proxy {
default backend;
domain1 backend_domain1;
domain2 backend_domain2;
...
domain30 backend_domain30;
}
...
proxy_pass $devel_proxy;
...
在某些情况下,您可以使用map
$app
内的proxy_pass
来跳过proxy_pass backend_$app;
阻止,但需要对$app
值进行额外检查。此外,map
允许将不同的“域”映射到相同的应用程序。