Nginx 请教一个 nginx 反向代理的问题

pobing · 2014年05月20日 · 最后由 pobing 回复于 2014年06月12日 · 10344 次阅读

现有 A(主站),B(API),C (后台管理) 3 个独立的项目,现在要用 A 的域名(www.a.com)进行反向代理访问 B,C, nginx 反向代理部分代码:

server {
  server_name www.a.com;

  location /api/ {
    proxy_pass http://0.0.0.0:9003/;
  }
  location /admin/ {
    proxy_pass http://0.0.0.0:9004/;
  }
}

现用 www.a.com/api 访问 API 没问题,但用 www.a.com/admin 访问后台管理,所有的静态资源和 页面 url 链接都找不到,因为地址重定向到了 www.a.com ,链接加上 /admin 前缀可以正常访问。如果给页面所有的链接加 /admin 前缀工作量似乎挺大的。 所以请教大家类似这种情况的 nginx 反向代理应该怎么配置,或者有别的方法解决? 当然 C 项目有自己的域名最方便。忘了说 C 项目是 基于 padrino 开发的。

没有用过 padrino ,但是刚才稍微看了下它源代码感觉一些用法和 Rails 差不多。 其中在 https://github.com/padrino/padrino-framework/blob/master/padrino-helpers/lib/padrino-helpers/asset_tag_helpers.rb 225 行起有 asset_path 的源代码。

如果是 Rails 的话,我的思路是在 config/initializers(应该 padrino 也有类似作用的地方吧)下新建一代码

module Padrino
  module Helpers
    module AssetTagHelpers

      alias asset_path__ptsroot__ asset_path

      def asset_path(kind, source = nil)
          "想加什么就什么了/#{asset_path__ptsroot__}"
      end

    end
  end
end

以上代码没有核实过可行不,就是一个思路而已,可能有不对的地方,也请各位楼下指正。 另外也可以判断 Rails 的 env 去决定是否覆盖函数。

把 admin 的静态文件直接放到 www 目录下,用 nginx 做代理,这样可行么?

#2 楼 @showlovel 对,其实静态文件很好处理,可以指定静态文件目录,如下面的配置:

location ~ .*\.(css|js|gif|jpg|jpeg|png|bmp|swf)$  
{  

      root html;  

}  

现在最麻烦的是用 url_for, link_to 这些函数生成的链接不好处理

#1 楼 @special 谢谢回复,你这种思路可以,所有链接带上一个全局的变量,根据环境判断,只是当时写代码时没考虑到这种情况,没有给所有链接前加参数,改起来的地方挺多的

你的 padrino 的 config.ru 长什么样?可以用 Rack::Map

#7 楼 @nouse padrino 的 config.ru 和 rails 差不多

#!/usr/bin/env rackup
# encoding: utf-8

# This file can be used to start Padrino,
# just execute it from the command line.

require File.expand_path("../config/boot.rb", __FILE__)

run Padrino.application

刚查了下 Rack:Map

估计可以这样用,先试下

map '/route1' do
  run SampleApp.new
end

map '/route2' do
  run SampleApp.new
end

批量替换链接呗

LZ,不好意思,由于新手还不能发帖,只能借你的帖子提出我的问题了,见谅。

现有三个项目:A(部署于 tomcat 上),B(search,部署于 Nignix 上),C(manager,部署于 tomcat 上),打算通过 A 的 ip 地址 (eg.118.211.53.100) 进行反向代理访问 B,C(B,C 位于内部网络的同一台机器),即通过匹配 location 的不同来转发不同请求。通过调研的资料,配置反向代理部分代码如下: server { listen 80; server_name 118.211.53.100; location /search { proxy_pass http://20.2.5.188/search; } location /manager { proxy_pass http://20.2.5.188:8080/manager; } } 现在通过 118.211.53.100/search 和 118.211.53.100/manager,两个项目都访问不了。请教各位,问题出在哪?

加个 sub domain 不能解决问题吗?

#10 楼 @_littledream 访问不了,有什么错误信息, 修改成端口号试试

proxy_pass http://20.2.5.188:port  #search
需要 登录 后方可回复, 如果你还没有账号请 注册新账号