一台server,一个域名,不同端口上运行不同服务,如何使用Nginx来进行根据不同路径转发到不同服务?

1,目前我的server在80端口上跑了一个shipyard,在19999端口上跑了一个netdata,在8000端口上跑了一个lets chat,现在我希望能够统一这三个服务的入口,只要一个域名就能狗使用这三个功能。
2,目前使用location根据不同路径来匹配,但是每次匹配之后都只会单纯做一个请求的转发,所以当请求到达相应的服务时,携带了请求的原始路径,也无法正常访问。
3,我尝试了使用rewrite规则,例如:

将/netdata/这个路径的请求全部定位到19999端口,我的配置如下:

        location ^~ /netdata/ {
#               proxy_cache js_cache;
                proxy_set_header Host spdocker.rd.tp-link.net;
                rewrite /netdata/(.+)$ /$1 break;
                proxy_pass http://localhost:19999;
        }

无论是在nginx.conf还是sites-enabled的default中,当我访问域名+/netdata的时候都会出现file not exist的问题,看了下请求的路径也把/netdata加上去了。

请问如何解决这个问题!

阅读 10.2k
5 个回答

楼上的好麻烦
说个我的方案
目标方案:

  • /netdata => 转发19999
  • /lets chat => 转发8000
  • /shipyard => 80是nginx自己的端口,不做转发
location /netdata {
    proxy_pass http://localhost:19999/;
}
location /lets chat { // 这里你问题应该有问题,最好不要有空格
    proxy_pass http://localhost:8000/;
}

记住proxy_pass 地址的最后一个斜杠是关键

我之前想了很久很久,还是没有方法。/(ㄒoㄒ)/~~

可以考虑做二级域名,server_name来控制

一般用vhost配合子域名实现吧。 比如访问shipyard.xxxxx.com 到 127.0.0.1:8080

upstream shipyard {
  server 127.0.0.1:8080;
}

server{
  server_tokens off;
  listen 80;
  server_name shipyard.xxxxx.com;
  access_log /var/log/nginx/rd.shipyard.log;

  gzip on;
  gzip_types *;
  gzip_proxied any;

  location /{
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass       http://shipyard;
  }
}

要是只能用一个域名你试试改下location的匹配规则

如果你的后端服务不支持指定路径的话,不建议这么做。即使能够 rewrite 掉一部分,再拿 body filter 改写正文里的部分,还是可能漏掉一些,或者把 js 搞坏什么的。

还是用不同的域名吧。或者去改后端服务的代码让它支持指定 prefix path。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题