用于本地 Web 开发的 Apache mod_proxy 配置

用于本地 Web 开发的 Apache mod_proxy 配置

我正在寻找一种方法来实现本地 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

我之前已经解决了这个问题,但一直没有发布解决方案。以下是其中一种方法:

鉴于:

首先,将以下内容添加/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">

希望这能帮助其他具有类似集成测试场景的开发人员!

相关内容