我正在寻找一种方法来实现本地 Web 开发与其他应用和服务集成的代理策略。我尝试开发的应用与同一网站上的其他几个应用集成(例如https://example.com/myapp
/login
、/app2
)。
挑战
以下是一些挑战:
由于其他应用程序的依赖性/专有系统,在本地环境中建立它们非常困难。将集成指向实际部署的环境(例如 stage)会更容易。
可以配置出站集成,但入站集成会中断。例如,如果用户未登录
local/myapp
,则我们会重定向到stage/login
(目标集成中的另一个应用程序),该应用程序会登录用户并重定向回stage/myapp
,但域是错误的。此外,登录 cookie 被写入错误的域上下文(阶段,而不是本地)。设计 stage/login 以便它可以使用返回参数返回到任意位置,例如 url=local/myapp 存在安全风险。
SSL 由另一层提供,这意味着本地开发未配置 SSL,但本地到阶段集成需要切换上下文:
http://local/myapp -> https://stage/login -> http://local/myapp
。
实验
我的本地开发副本运行在 上http://myworkstation.dhcp.example.com:3000/myapp
。
我想要的是能够设置代理,以便流量流向:
https://example.com/myapp/*
->http://myworkstation.dhcp.example.com:3000/myapp/*
- 其余内容将转到最初请求的 URL
https://example.com/*
->https://example.com/*
我想要达到的效果就像 Charles Proxy 的地图远程功能,允许本地服务的站点“覆盖”远程站点。
我读过关于各种 Apache 模块 mod_proxy、mod_rewrite 的文章,基本上想要一个转发代理,用于除所选子目录之外的所有东西(可能是重写?可能是反向代理?)。我还研究过 Squid。
我尝试了几种组合,但缺乏通用方法。使用 Apache mod_proxy 和/或 mod_rewrite 可以实现类似的效果吗?
以下是我迄今为止的尝试,但我只能让正向代理工作。我使用的是 Firefox,并将所有协议的代理设置为myworkstation.dhcp.example.com:8118
Listen 8118
<VirtualHost *:8118>
# Enable forward proxy
ProxyRequests On
# Add "Via" header
ProxyVia On
<Proxy *>
Order deny,allow
Deny from all
Allow from example.com # local devs only!
</Proxy>
# local Rails app, e.g. $ rails s -e stage
# local request: http://myworkstation.dhcp.example.com:3000/myapp
# normal stage requests: https://stage.example.com/myapp
# app logs in via another app: https://stage.example.com/login
# which I want to delegate to without standing up another local app.
# which to use? hmmm...
#ProxyRemote "https://stage.example.com/myapp/" "http://myworkstation.dhcp.example.com:3000/myapp/"
#ProxyPass /myapp http://myworkstation.dhcp.example.com:3000/myapp
#ProxyPassReverse /myapp/ http://myworkstation.dhcp.example.com:3000/myapp/
#RewriteEngine on
#RewriteBase "/myapp/"
#RewriteRule "^/myapp/(.*)$" "http://myworkstation.dhcp.example.com:3000/myapp/$1" [P]
#ProxyPassReverse "/myapp/" "http://myworkstation.dhcp.example.com:3000/myapp/"
# another approach, maybe via Passenger?
ServerName integration-proxy
ErrorLog "/var/log/apache2/integration-proxy-error.log"
</VirtualHost>
答案1
我之前已经解决了这个问题,但一直没有发布解决方案。以下是其中一种方法:
鉴于:
- http://test.example.com- 您的集成站点由另一个团队拥有
- http://test.example.com/myapp- 您的应用已部署至集成站点(/myapp 是你的应用的子目录)。
- http://localhost/myapp- 你的应用程序在 Passenger/Apache 上本地运行
- /local/myapp 是你的 rails 应用在本地文件系统上的位置
首先,将以下内容添加/etc/apache2/sites-available/mysite.conf
到您的<VirtualHost *:80>
块中:
PassengerFriendlyErrorPages on
IncludeOptional /etc/apache2/apps/*.conf
ProxyPass / http://test.example.com/
ProxyPassReverse / http://test.example.com/
接下来,在您的/etc/apache2/apps/myapp.conf
:ProxyPass /myapp!
<Location /myapp>
PassengerRuby /local/rvm/gems/ruby-2.3.5@myapp/wrappers/ruby
PassengerAppRoot /local/myapp
PassengerAppEnv development
PassengerBaseURI /myapp
SetEnv RAILS_RELATIVE_URL_ROOT /myapp
</Location>
Alias /myapp /local/myapp/public
<Directory /local/myapp/public>
Allow from all
Options -MultiViews
# Uncomment this if you're on Apache >= 2.4:
Require all granted
</Directory>
此配置将允许您的本地 Rails 应用程序提供来自其子目录的任何内容(即http://localhost/myapp) 以及来自您的集成站点的任何内容。
例如,假设你的集成站点有以下图片:http://test.example.com/images/*. 这些将在http://localhost/图片因此,如果您在 Rails 应用程序中使用绝对相对图像标签(如下所示),它们就会起作用:
<img src="/images/wave.jpg">
希望这能帮助其他具有类似集成测试场景的开发人员!