关于网友提出的“ 一台server,一个域名,不同端口上运行不同服务,如何使用Nginx来进行根据不同路径转发到不同服务?”问题疑问,本网通过在网上对“ 一台server,一个域名,不同端口上运行不同服务,如何使用Nginx来进行根据不同路径转发到不同服务?”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 一台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加上去了。
请问如何解决这个问题!
解决方案1:如果你的后端服务不支持指定路径的话,不建议这么做。即使能够 rewrite 掉一部分,再拿 body filter 改写正文里的部分,还是可能漏掉一些,或者把 js 搞坏什么的。
还是用不同的域名吧。或者去改后端服务的代码让它支持指定 prefix path。
解决方案2:一般用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的匹配规则
解决方案3:可以考虑做二级域名,server_name来控制
解决方案4:我之前想了很久很久,还是没有方法。/(ㄒoㄒ)/~~
解决方案5:楼上的好麻烦
说个我的方案
目标方案: