我已经注册了一个域名,比方说 – www.example.com.我在注册商网站上配置了所有内容,ping www.example.com和www.*.example.com成功.
我在我的机器上运行Apache Tomcat监听端口8080.我想设置动态proxy_pass.
因此,如果我的应用程序MyApp在tomcat中运行并且可以通过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/; } }
当我访问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/; } }
然后一切都像一个魅力.我知道它必须对解析器做一些事情,我已经尝试过将解析器放在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; } }
卷曲:
* 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
编辑://
非常感谢泽维尔!添加以下两行有助于:
proxy_pass http://backend/prefix-$domain$request_uri; proxy_redirect http://$host/prefix-$domain http://$host;
2但更多问题:
>此配置对性能有很大影响吗?
>我可以过滤掉$request_uri中的内容(例如JSESSIONID = 1233 ….)吗?
再次,非常感谢!我花了一个星期的时间才想出这个!
解决方法
>目标服务器被声明为IP地址
>目标服务器名称是上游服务器组的一部分
>目标服务器名称已经解析(例如,它与另一个服务器块中的服务器名称匹配)
此处,运行时解析程序无法提供帮助,因为DNS可能无法解析localhost.运行时解析也是一种浪费,因为你可以在这里清楚地避免它.
那么,两个简单的解决方案
>使用127.0.0.1
>如果您有服务器名称或目标服务器池,则声明upstream block
现在您需要代理服务器重定向才是正确的.所以要么:
>您的代理目标处理主机头,并通过以下方式传递:
proxy_set_header“Host”$host;
>您的代理目标无法处理重定向的主机标头,您需要使用以下命令使用Nginx重写它们:
proxy_redirect http:// $proxy_host / $sub_domain http:// $host;