天道酬勤,学无止境

反向代理混淆(reverse proxy confusion)

问题

目前我使用 nginx +passenger 来为我的 rails 应用程序提供服务。 我一直在对反向代理进行一些研究,并弹出了一些名称(主要是鱿鱼、清漆和 nginx)。

  1. 现在,如果我使用 nginx 作为我的 Web 服务器,我可以将它用作我的反向代理吗?

  2. 一般而言,大多数站点使用 nginx 来代理静态内容,使用 apache/mongrel 或类似的东西来代理动态内容。 如果我想坚持我的 nginx,乘客设置,当我引入反向代理时,我的架构会是什么样子? 它是一个单独的盒子还是 nginx 的实例?

  3. 如果我要引入一个像 HAProxy 这样的负载均衡器,它会是什么样子。

  4. 最后,这些选择在早期有多重要? 所以如果我最终后悔一个选择(比如 Varnish,因为它不适合饼干等),是否容易改变?

谢谢

回答1

反向代理是位于您的实际应用程序 (rails) 和客户端浏览器之间的服务器,并代表客户端检索文件。 配置反向代理只需要在客户端和app之间架设一个服务器即可; 由于您已经在使用 nginx,因此您也可以将其用作反向代理。

1这里有一个关于 SO 的链接:nginx 既是反向代理又是 Web 服务器

2可以在同一个实例中设置反向代理,也可以不设置。 如果它是一个不同的盒子或进程,你需要将动态请求从一个盒子传递到另一个盒子。

4我认为这相当容易,如果您熟悉 HTTP 和配置这些服务器。 我在 apache 上遇到了困难只是因为我错过了一个斜杠

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 使用 nginx 正则表达式位置匹配将 URI 动态映射到多个反向代理的不同端口(Using nginx regex location matching to dynamically map URI's to different ports for multiple reverse proxies)
    问题 我正在使用 nginx 为可能位于防火墙后面的 Web 应用程序创建反向代理。 对于我最初的概念证明,我使用了以下位置块来确保它有效。 location / { proxy_pass https://localhost:2222; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } 我使用ssh -f -N -T -R2222:localhost:443 user@nginx-ip在我的网络应用程序上打开我的反向隧道。 这完全符合我的喜好。 我在浏览器中输入我的nginx-ip并从我的网络应用程序获取 https 流量,但被nginx-ip等混淆了。 我想允许潜在的几千个反向隧道跨越几千个端口(而不是在上面的情况下只有 2222 个)。 在阅读 nginx 时,我想使用正则表达式来动态使用包含端口号的 URI,以通过 proxy_pass 到该特定端口。 也就是说,我希望https://nginx-ip/2222/到proxy_pass https://localhost:2222; 我想要https://nginx-ip/1111/到proxy_pass https://localhost:1111; . 我已经尝试了很多变体,但据我所知,我认为这应该可行:
  • 4. 正向代理与反向d代理的区别、Nginx反向代理配置语法、正向代理反向代理的详解
    1.Nginx代理服务常见模式 Nginx作为代理服务,按照应用场景模式进行总结,代理分为正向代理,反向代理正向代理,(内部上网)客户端<–>代理–>服务端访问过程:客户端向代理发送连接网站请求,代理向DNS发送域名解析请求,然后返回给代理,代理向网站发起三次握手请求(代理和网站发起的连接),最后把数据传输给客户端反向代理,用于公司集群架构中,如何在公网上访问到公司内网的服务器客户端–>代理<–>服务端访问过程:简单理解首先客户端请求DNS然后给我们返回真实IP地址,客户端和服务端(代理)发起连接请求,把用户的请求抛给我们内网的一台服务器.详细解释客户端请求DNS然后给我们返回真实IP地址,客户端通过代理访问公网IP的某个端口,代理会把公网IP转发或者映射到后端的内网IP的某个端口.最后后端服务器会把数据返回给代理,代理再返回给用户.用公网的服务器代理着内网的服务器,通过这种方式能够让用户访问到没有公网的服务器 2.正向代理与反向代理的区别 区别在于形式上服务的对象不一样(正向代理服务的是用户)正向代理代理的对象是客户端,为客户端服务反向代理大力的对象是服务端,微服务端服务(当互联网上的用户请求我们局域网的服务的时候,我们通过代理的方式,让互联网上的用户,访问到我们的局域网内) 3.Nginx代理协议: HTTP ------------>nginx-------------
  • 具有SNI的Apache HTTPS反向代理,代理上没有密钥(Apache HTTPS reverse proxy with SNI without key on the proxy)
    问题 example1.com和example2.com解析为host0。 host0运行带有两个VirtualHost的Apache反向代理。 它将对example1.com的请求委派给host1,将对example2.com的请求委派给host2。 在所有地方都使用http,显然可以使其正常工作。 使用https,我可以将example1.com和example2.com的密钥粘贴在host0上,然后让host0与host1和host2对话http或https。 鉴于SNI,这也应该起作用。 我的问题:在host0上没有example1.com或example2.com密钥的情况下能否使它工作? 我想避免host0处于执行中间人攻击的位置。 如果我正确理解SNI,则仅在客户端将所需的虚拟主机传达给host0之后才交换密钥材料。 对于Apache来说,这应该是足够的信息(?),以便从根本上将连接转发到host1或host2,而无需查看传输的内容。 这根本不需要关键材料。 回答1 您是否真的需要Apache反向代理,还是需要解决的问题? 我遇到了同样的问题,并按以下说明在tcp模式下使用HAProxy进行了解决:http://blog.haproxy.com/2012/04/13/enhanced-ssl-load-balancing-with-server-name
  • nginx反向代理多个后端(nginx reverse proxy multiple backends)
    问题 这是我的情况:我将有一台运行nginx的前端服务器,以及多台运行apache + passenger且具有不同rails应用程序的后端服务器。 我没有尝试进行任何负载平衡。 我需要做的是设置nginx来基于URL代理到特定服务器的连接。 IE,client.domain.com应指向xxx100:80,client2.domain.com应指向xxx101:80,依此类推。 我对nginx不太熟悉,但是在网上找不到适合我情况的特定配置。 谢谢。 回答1 您可以将不同的URL与server {}块进行匹配,然后在每个服务器块内进行反向代理设置。 下面是一个插图; server { server_name client.domain.com; # app1 reverse proxy follow proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://x.x.x.100:80; } server { server_name client2.domain.com; # app2 reverse proxy settings follow
  • 可以独立的 Jetty 用作反向代理(没有 Apache mod-proxy)(Can stand-alone Jetty be used as a reverse proxy (without Apache mod-proxy))
    问题 我有一个应用程序,其中包含一个 Jetty Web 服务器,我们将其分发给多个用户以部署在他们的服务器上。 基于一些新的需求,我们需要包含反向代理功能。 Jetty 文档在 Jetty 前面谈到了使用 Apache 作为反向代理。 虽然这有效,但只使用 Jetty 而不必随身携带 Apache 会容易得多。 有没有办法将独立的 Jetty 配置为反向代理? 回答1 当然,如果需要,您应该能够使用完全异步且可完全自定义的 ProxyServlet: http://www.eclipse.org/jetty/documentation/current/proxy-servlet.html
  • 向heroku添加反向代理(Add a reverse proxy to heroku)
    问题 我有一个在 heroku 上运行的 rails 应用程序,例如 myapp.herokuapp.com。 现在,我想从反向代理myapp.heroku.com/proxy/到somewhereelse.com/ (即: myapp.heroku.com/proxy/stuff反向proxifed到somewhereelse.com/stuff )是可能在Heroku? 如何实现这一目标? 回答1 对于通过搜索来解决这个问题的任何人,都可以这样做。 查看 https://github.com/ryandotsmith/nginx-buildpack 将供应商 nginx 放入您的 heroku 实例。 这会将 nginx 放在您的 rails 应用程序的前面,并允许您在此域上反向代理请求,将您的 heroku 应用程序配置为 apex 并允许其他地方访问其他网站。 回答2 您无权访问前端路由基础设施,因此无法添加诸如基于 nginx 位置的反向代理或 apache 的 modproxy 之类的内容。 根据我的理解,您也只能绑定到 dyno 中的一个端口($PORT),因此不可能使用您自己的供应商版本的 nginx 来隐藏您的 Rails 应用程序(除非可以通过非 TCP/IP 套接字进行通信) nginx 和您的机架/导轨应用程序,如果是这种情况,那么也许您可以让机架收听
  • 代理服务器和反向代理服务器之间有什么区别? [关闭](What's the difference between a proxy server and a reverse proxy server? [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 7个月前关闭。 改善这个问题 代理服务器和反向代理服务器有什么区别? 回答1 先前的答案是准确的,但也许太简洁了。 我将尝试添加一些示例。 首先,“代理”一词描述的是某人或代表某人行事的事物。 在计算机领域,我们正在谈论一个服务器代表另一台计算机。 出于可访问性的目的,我将讨论仅限于Web代理-但是,代理的想法并不限于网站。 转发代理 Web代理的大多数讨论都涉及称为“转发代理”的代理类型。 在这种情况下,代理事件是“转发代理”代表原始被请求者从另一个网站检索数据。 3台电脑的故事(第一部分) 例如,我将列出三台连接到互联网的计算机。 X =您的计算机,或Internet上的“客户端”计算机 Y =代理网站,proxy.example.org Z =您要访问的网站www.example.net 通常,可以直接从X --> Z.连接X --> Z. 但是,在某些情况下,最好让Y --> Z代表X ,其链接如下: X --> Y --> Z X为什么要使用转发代理服务器的原因: 这是(非常)部分使用转发代理服务器的列表: 1)X无法直接访问Z,因为 a)对X的互联网连接具有管理权限的人已决定禁止对站点Z所有访问。 例子:
  • 用于流量加密的公共反向代理背后的 WCF(WCF behind a public reverse proxy which is used for traffic encryption)
    问题 我有一个连接到 WCF 服务的 Silverlight 应用程序。 在我习惯的基本配置下,把这个应用程序连接到它对应的WCF服务是没有问题的。 但是,最近,我的一位客户开始使用 Apache 反向代理。 此代理是公共服务器,它仅用于通过 SSL (HTTPS) 在客户端和它之间加密 HTTP 流量。 此代理将所有流量从它传递到托管我的应用程序的实际 Web 服务器。 公共代理和 IIS 服务器之间的流量只是普通的 HTTP。 所以流量是这样的:最终用户浏览器---HTTPS---->公共反向代理-----HTTP---->承载WCF服务的IIS服务器。 反向代理和 IIS 位于两个单独的服务器上。 我无法使 Silverlight 应用程序正常运行。 我不确定如何配置端点? 每当我使用公共代理的地址作为我的端点地址时,我都会遇到问题。 Silverlight 应用程序通常具有以下配置: <configuration> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IPOTemplateEditorSrv" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"> <security
  • 反向循环混淆中的 NSUInteger?(NSUInteger in reversed loop confusion?)
    问题 我想知道是否有人可以解释一些东西,我设置了一个循环,我想从 10 倒数到 0 : for(NSUInteger index = 10; index >= 0; index--) { NSLog(@"INDEX: %ld", (long)index); } 这个循环永远运行,它不会在 0 处停止,而是不断进入负数。 当我注意到这一点时,我将代码更改为: for(NSInteger index = 10; index >= 0; index--) { NSLog(@"INDEX: %ld", (long)index); } 以上工作正常,但我很好奇,为什么第一个例子不起作用,因为生成的数字都是无符号整数? 回答1 无符号类型不能“继续变成负数”。 index=0的迭代后,index--变成了0xFFFFFFFF,仍然大于零。 很容易犯的错误,我自己做过。 静态分析器实际上会就此警告您(“条件索引 >= 0 始终为真”或类似的内容。)我强烈建议将其设置为在调试版本中自动运行。 回答2 请注意, NSUInteger 始终 >= 0,因此,您的循环条件将始终为真。
  • 反向代理 Java(Reverse Proxy Java)
    问题 我正在使用 Java Web 应用程序,并且我想要一个反向代理来屏蔽我的一些内部端点。 要求 1. 反向代理映射需要在运行时可修改,例如,如果我们将某些组件移动到另一台服务器,我们应该能够修改映射,以便将新请求路由到此端点。 2. 这必须可以嵌入到像 Jetty 这样的标准 servlet 容器中。 大多数 Java 反向代理(例如 J2EP)都需要在启动应用程序之前提供可用的映射信息。 回答1 Undertow 提供了一个可嵌入的反向代理服务器,可以在运行时以编程方式进行更改。 如果您想通过 API 在更高级别进行操作,则可以使用 Backflow。 它支持使用 REST 调用添加/删除代理后端。 回答2 据我所知,http://www.membrane-soa.org/service-proxy/ 支持您的所有要求: Membrane 有一个 WebUI,您可以在其中添加和删除运行时的代理连接,例如将虚拟主机在端口 80 上的传入请求转发到目标主机:端口 Membrane 可以作为独立应用程序运行或部署在应用程序服务器中。 Membrane 是 ASF 2.0 许可下的开源项目
  • 反向代理背后的Oauth提供者(Oauth provider behind reverse proxy)
    问题 我尝试在Apache反向代理后面使用PHP(PECL包)中的OAuth Provider 客户使用 POST https://api.com/resource/oauth/request-token 但是我的oauth提供者收到了 POST http://api.com/mywebservice/resource/oauth/request-token 签名无法验证,因此请求失败 您是否有解决此问题的想法? 回答1 我不得不做一次。 我最终修改了OAuth代码,以传递提供者将收到的实际URL以及我需要从代理后面发送给的URL。 前者用于签名,后者用于HTTP请求。 这是一种痛苦,并且无法移植(如果代理中发生任何更改,代码将停止工作) 回答2 我们遇到了同样的问题(在我们的反向代理将网络内部的HTTPS更改为HTTP的情况下,事情变得更简单了)。 您可以启用负载平衡器(无论您用作反向代理)转发正确的标头方案(以及更多)。 例如,在Nginx中,您可以同时利用以下两者: proxy_set_header X-Forwarded-Proto https; 和 proxy_redirect .... ; 对于这个旧问题,这可能不是直接的上下文解决方案,但是我花了7个小时尝试调试我们的问题,因此,我相信这对某些人来说很方便。
  • 带有重写的 IIS 反向代理无法处理从我们代理到的服务器的重定向(IIS reverse proxy with rewrites can't handle a redirect from the server we proxy to)
    问题 我们拥有服务器 A,在某些情况下,我们会向服务器 B 上的合作伙伴重写请求。 在某些情况下,服务器 B 将响应重定向到一个完全不同的网站,这是预期的,假设服务器 C。但是,当该重定向形式服务器 B 返回服务器 A 时,服务器 A 将其解释为重定向到本身 (A) 上的位置,而不是重定向到其他网站 - 服务器 C。 我如何注意到重定向到外部网站并实际去那里,而不是假设重定向在我的服务器上(和 404ing)? 我们正在运行带有重写模块的 IIS 7。 非常感谢任何帮助。 回答1 转到 ARR 代理设置(它们隐藏在 IIS -> 应用程序请求路由缓存 -> 服务器代理设置下)并取消选中“响应标头中的反向重写主机”复选框。 那应该就够了。 回答2 如果您无法在 GUI 中更改此设置,则可以通过命令行设置配置。 这样的事情应该工作: appcmd.exe set config -section:system.webServer/proxy /reverseRewriteHostInResponseHeaders:"False" -commit:apphost 回答3 “响应标头中的反向重写主机”复选框对我来说位于不同的位置。 我正在使用 Windows Server 2012 R2。 它位于 Connections -> Server Farms -> -> Proxy 下
  • CouchDB 代理? Apache 作为反向代理?(CouchDB proxy? Apache As a Reverse Proxy?)
    问题 我有带有公共 IP 地址的 VM(Ubuntu 10.04、Apache、CouchDB 1.0,...)。 是否可以从公共 IP 地址(即 187.323.132.232:5984)而不是从 http://localhost:5984访问 CouchDB(主要是 Futon) ? 或者在我的本地机器上,设置一个 ssh 隧道? 回答1 是的,进入 Futon配置并将http部分中的bind_address设置为0.0.0.0 或者,您也可以使用 SSH。 基本思想是从本地机器转发到远程 CouchDB: ssh -L 5984:localhost:5984 remoteuser@remotemachine 现在您可以从本地机器通过 http://localhost:5984/ 访问 Futon。 祝你好运! 回答2 您还可以通过 Apache 代理: ProxyRequests Off <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass / http://localhost:5984/ ProxyPassReverse / http://localhost:5984/ 您还应该能够使用 RewriteRule 上的[P]标志来执行此操作,假设 mod_proxy 已启用。
  • jupyterhub nginx 反向代理(jupyterhub nginx reverse proxy)
    问题 我正在尝试让反向代理 (nginx) 与 juypterhub 一起使用。 我希望在 myurl.com/jhub/ 上提供该服务。 我在配置中放置了以下内容: location /jhub/ { proxy_pass http://127.0.0.1:8000/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-NginX-Proxy true; #WebSocket support proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 86400; } 但是,当我在重新启动代理后尝试 url 时,jupyterhub 不可用,并且出现“404”未找到错误。 我已经尝试了所有端口和地址的组合,但都没有运气。 同样的方法适用于 RStudio 服务器......我错过了什么?
  • nginx 既是反向代理又是 Web 服务器(nginx be both reverse proxy and web server)
    问题 我目前使用带有乘客的 nginx 来服务我的 rails 应用程序。 考虑在方程中包含一个缓存反向代理。 我是否可以使用相同的 nginx 实例作为反向代理(在端口 80 上运行,提供静态和电子标记操作),或者我是否需要不同的 nginx 实例或完全不同类型的反向代理? 谢谢! 回答1 我认为您可以使用相同的 NGINx 实例来执行这两项操作,但您必须将应用程序配置为侦听不同的端口。 您可以在仅侦听本地主机的端口 8080 上运行您的应用程序,并在端口 80 上运行反向代理。 nginx 配置的服务器部分可能如下所示 server { listen 127.0.0.1:8080; server_name localhost; root /webapps/foo.com/public; passenger_enabled on; } server { listen 80; server_name www.foo.com; location / { proxy_pass http://127.0.0.1:8080; } } 请不要在确切的语法上钉我,这只是为了展示想法。 希望这可以帮助。
  • 反向代理与websocket mod_proxy_wstunnel(Reverse proxy with websocket mod_proxy_wstunnel)
    问题 Web套接字和反向代理Apache出现问题,我已经在最新版本2.4.5中进行了升级,并加载了mod_proxy_wstunnel模块。 httpd.conf: <VirtualHost *:80> ServerAdmin webmaster@localhost ServerName www.toto.fr ServerAlias toto.fr ProxyPass /my_app http://1X.X.X.1:8080/my_app ProxyPassReverse /web_pmr http://1X.X.X.1:8080/my_app ProxyPassReverseCookiePath /my_app / ProxyPassReverseCookieDomain localhost my_app ProxyRequests off ProxyTimeout 15 #WEBSOCKETS ProxyPass /my_app/BasicWebsocketServlet ws://1X.X.X.1:8080/my_app/BasicWebsocketServlet retry=0 ProxyPassReverse /my_app/BasicWebsocketServlet ws://1X.X.X.1:8080/web_pmr/BasicWebsocketServlet
  • 在 apache httpd 反向代理和 Tomcats 之间进行双向 SSL 身份验证(Making a two way SSL authentication between apache httpd reverse proxy and Tomcats)
    问题 我有一个用作反向代理的 Apache HTTPD 和 Tomcat(6.0.35) 服务器,我试图实现的是 Tomcat 服务器和反向代理之间将存在相互信任。 这意味着当反向代理转发请求时,它将提供自己的证书,该证书将被导入到 Tomcat 的信任库文件中,从而使 Tomcat 仅在请求确实是由反向代理发出时才接受请求(如果可能,甚至可以检查 tomcat 的证书是否是某个特定的证书)。 我已经设法设置了一个需要客户端证书的 Tomcat,并且它运行良好,但正确的反向代理配置似乎无法实现。 回答1 您应该尝试 SSLProxyMachineCertificateFile 选项并将其指向包含您的客户端证书及其 PEM 格式的(未加密的)私钥的文件。
  • NginX反向代理服务器(Reverse Proxy)——【二】NginX配置文件修改
    我的要求: 外网访问xxx.homeserver.com时,我要求代理自动将请求转向内网IP为192.168.1.20(我的Home Server的IP)的服务器。 访问xxx.homeserver.com,可以是http的请求,也可以是https,但服务器是要求加密的,所以需要同时监听80和443两个端口,并都指向192.168.1.20这个IP 其他请求,如mail.DIYPCs.com,则根据关键字mail转向Exchange服务器(还没开启,不过这是未来的一个部署),此服务器IP肯定不是192.168.1.20 具体操作: 执行以下命令: sudo vi /etc/nginx/sites-enabled/whs.conf 其中whs.conf为配置文件的文件名(自己随便改,但后缀必须是.conf),以下为我的whs.conf文件内容: server { listen 80; server_name xxx.homeserver.com; location / { proxy_pass http://192.168.1.20:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x
  • nginx反向代理背后的Gitlab 5.3(Gitlab 5.3 behind nginx reverse proxy)
    问题 我已经成功安装了 Gitlab 5.3 并且一切正常。 我想在我设法做到的 nginx 反向代理后面运行服务器,但所有资产都丢失了: 我在 /git 上运行 Gitlab,这是我的反向代理服务器上的 nginx 配置: server { listen 80 default; listen [::]:80 ipv6only=on default; server_name reverseproxy; ## redirect http to https rewrite ^ https://$server_name$request_uri? permanent; } server { access_log /var/log/nginx/ssl_access.log; error_log /var/log/nginx/ssl_error.log; index index.html index.htm index.php; ## start ssl config listen 443; server_name reverseproxy; ## ssl server specifics ssl on; ssl_certificate /root/reverseproxy/reverseproxy.crt; ssl_certificate_key /root/reverseproxy
  • 反向代理和 getServerPort() 背后的 WebSphere Portal(WebSphere Portal behind reverse proxy and getServerPort())
    问题 我在访问部署在反向代理(使用 Apache)之后的 WebSphere Portal 时遇到问题。 问题是在检查浏览器发出的 HTTP 请求时,有些请求是针对代理的,有些则直接针对 WebSphere Portal。 我的Apache配置: ProxyPassReverseCookieDomain backend-server proxy-server ProxyPass / http://backend-server:10039/ ProxyPassReverse / http://backend-server:10039/ 问题是,一些生成的资源包含针对后端服务器的绝对 URI:10039... 我还应该配置什么才能正确访问反向代理后面的 WebSphere Portal? 回答1 因为我可以回答我自己的问题,所以问题是: 在服务器端,WebSphere Portal 中的 portlet 和 JSP 使用request.getServerHost()和request.getServerPort() 。 为了使这些方法在反向代理(发送Host:标头)之后工作。 我不得不补充: ProxyPreserveHost On 到 apache 配置和: com.ibm.ws.webcontainer.extractHostHeaderPort = true