Stu*_*gal 7 domain-name-system nginx proxy proxypass
我在配置 nginx 时遇到问题,我在网上搜索了解决方案,我有一些零碎的东西,但我仍然无法提出正确的配置。
我已经注册了一个域,比方说 - www.example.com。我已经在注册商网站上配置了所有内容,ping www.example.com 和 www.*.example.com 成功。
我的机器上运行着 Apache Tomcat,监听端口 8080。我想设置动态 proxy_pass。因此,如果我在 tomcat 中运行应用程序 MyApp 并可通过 localhost:8080/MyApp 访问,我希望能够使用 www.MyApp.example.com 访问它,所以基本上子域将是应用程序在 tomcat 中的名称。
这是我的 nginx 配置:
server {
server_name ~^(www\.)?(?<sub_domain>.+)\.example\.com$;
listen 80;
location / {
proxy_pass http://localhost:8080/$sub_domain/;
}
}
Run Code Online (Sandbox Code Playgroud)
当我访问 www.myapp.example.com 时,我被重定向到http://localhost:8080/myapp- 我的意思是我最终进入了http://localhost:8080/myapp我的浏览器。
但是,如果我将 nginx 设置中的正则表达式更改为:
server {
server_name www.myapp.example.com myapp.example.com
listen 80;
location / {
proxy_pass http://localhost:8080/myapp/;
}
}
Run Code Online (Sandbox Code Playgroud)
然后一切都像魅力一样。我知道它必须对解析器做些什么,我已经尝试将解析器放在 nginx 中,但它没有任何改变。
我在这里缺少什么?
//编辑:
这是我的配置。我仍然被重定向到 www.myapp.example.com/myapp/login 而不是 www.myapp.example.com/login。我已经改变了正则表达式,还是一样。
http {
upstream backend {
server 127.0.0.1:8080;
}
server {
server_name ~^(www\.)?(?<sub_domain>.+)\.example\.com$;
listen 80;
location / {
proxy_set_header "Host" $host;
proxy_pass http://backend/prefix-$sub_domain/;
proxy_redirect http://$host/prefix-$sub_domain/ http://$host;
}
}
Run Code Online (Sandbox Code Playgroud)
卷曲:
* Hostname was NOT found in DNS cache
* Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET /prefix-myapp/ HTTP/1.1
> User-Agent: curl/7.35.0
> Accept: */*
> Host: www.myapp.example.com
>
< HTTP/1.1 302 Found
* Server Apache-Coyote/1.1 is not blacklisted
< Server: Apache-Coyote/1.1
< Set-Cookie: JSESSIONID=E609EB96D8F27FD6F4E7F9ED9ACA5245; Path=/prefix-myapp/; HttpOnly
< Location: http://www.myapp.example.com/prefix-myapp/login;jsessionid=E609EB96D8F27FD6F4E7F9ED9ACA5245
< Content-Length: 0
< Date: Tue, 21 Oct 2014 16:48:05 GMT
<
* Connection #0 to host 127.0.0.1 left intact
Run Code Online (Sandbox Code Playgroud)
编辑://
非常感谢泽维尔!添加以下两行有助于:
proxy_pass http://backend/prefix-$domain$request_uri;
proxy_redirect http://$host/prefix-$domain http://$host;
Run Code Online (Sandbox Code Playgroud)
2 更多问题:
再次,非常感谢!我花了一个星期才弄明白这个!
Xav*_*cas 11
当您在proxy_pass指令中使用变量时,nginx 将使用运行时解析,除非:
在这里,运行时解析器无济于事,因为 localhost 可能无法由 DNS 解析。此外,运行时解析也是一种浪费,因为您可以在这里清楚地避免它。
所以,两个简单的解决方案:
127.0.0.1现在您需要正确的代理服务器重定向。所以要么:
您的代理目标处理主机标头,并通过以下方式传递它:
proxy_set_header "Host" $host;
您的代理目标无法处理重定向的 Host 标头,您需要使用 nginx 重写它们:
proxy_redirect http://$proxy_host/$sub_domain http://$host;
但是,如果它根本不支持 Host 标头,链接将被破坏。