在同一端口上使用nginx反向代理

时间:2013-11-12 17:03:09

标签: nginx reverse-proxy

我更像是一个程序员而不是服务器管理员,所以这个问题对某些人来说似乎微不足道,但我无法让我的nginx反向代理将我的请求转发到正确的服务器......首先,这是我的配置文件(在站点可用的情况下,在启用站点的情况下使用符号链接)

upstream nodejs1 {
    server 127.0.0.1:3000;
}

upstream nodejs2 {
    server 127.0.0.1:3001;
}

server {
    server_name nodejs_proxy;
    listen 0.0.0.0:80;
    access_log /var/log/nginx/nodejs.log;
    location /otherlocation/ {
            rewrite /otherlocation/(.*) /$1 break;
            proxy_pass      http://nodejs1/;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_set_header   X-NginX-Proxy true;
    }

    location / {
            proxy_pass      http://nodejs2/;
            proxy_redirect  off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_set_header   X-NginX-Proxy true;
    }
}

因此,如果我尝试访问http://myserver.com/,一切正常,我在端口3001上重定向。但是,如果我尝试访问http://myserver.com/otherlocation/,我也会被重定向到端口3001(所以我得到了404)。

当我尝试访问http://myserver.com/otherlocation/时,上述代码段中是否有某些内容无法正确重定向到正确的服务器?

谢谢

PS:myserver.com是一个容易多次更改的临时域(dev,pre-prod,prod),这就是为什么我要写一些可以在所有环境中工作的东西

1 个答案:

答案 0 :(得分:3)

首先,您应检查正确的服务器是否正在处理请求并调试最重要的内容。在http块内的nginx.conf文件(不在已启用站点的文件中)中放置此

log_format mcombined '$server_name - $host - $remote_addr - $remote_user [$time_local]  '
                '"$request" $status $body_bytes_sent '
                '"$http_referer" "$http_user_agent"';

以上是nginx的默认log format,添加了$server_name$host。您可以添加您认为可能有用的任何variable

然后更改启用网站的配置以使用此日志格式:

access_log /var/log/nginx/nodejs.log mcombined;

但真正的问题是:/otherlocation/块中,您有一个重写规则,将所有内容重写为/,因此当请求到达/ otherlocation时/ block,它们被重定向到/

因此,您最终启用网站的内容将如下所示:

upstream nodejs1 {
  server 127.0.0.1:3000;
}

upstream nodejs2 {
  server 127.0.0.1:3001;
}

server {
  server_name nodejs_proxy;
  listen 0.0.0.0:80;
  access_log /var/log/nginx/nodejs.log mcombined;
  location ^~ /otherlocation/ {
        proxy_pass      http://nodejs1/;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   X-NginX-Proxy true;
  }

  location / {
        proxy_pass      http://nodejs2/;
        proxy_redirect  off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   X-NginX-Proxy true;
  }
}