有的时候只有一个域名。想让其他的服务也用这个域名和 80 端口。用 nginx 做代理就是一种方式。websocket 通常也会用到。
业务场景
在这里,有一个域名 xxx.com
,通常使用 https
来访问,比如 https://xxx.com
。加入
, 已经有正在使用的业务。下边的场景都不能去干涉已有的业务场景。https://xxx.com
- 我有一个 node.js 的服务,其端口后是 3000,那么就可以通过代理来实现域名的访问。只是,这里要在 url 上做文章。 比如我请求
https://xxx.com/blog/xxx
这个服务,就让其转发到 node.js 的服务的/xxx
上。那么,nginx 可以这样配置。
# Upgrade Connection websockets 和 升级的 http 协议才会用到
location ^~/blog/ {
proxy_pass http://blog:3000/;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection 'upgrade';
# proxy_cache_bypass $http_upgrade;
}
这里的代理 http://blog:3000/
是因为 docker 构建的同一个网络中的服务叫做 blog,所以可以这么写。如果仅仅是宿主机,可以通过具体的 ip 来弄。
其实,之前我是想通过 rewrite 来实现。代码就是下边这样。只是这样虽然 url 修改了,但是似乎又重新发起请求了,并不是直接到代理那边。以至于添加的 location 无效。具体是什么情况,也不是很了解。毕竟 nginx 不精通,遇到具体的需要就去查询。所以想实现修改 url 又能实现代理,可以用上边的 location 语法。
# Upgrade Connection websockets 和 升级的 http 协议才会用到
location /blog {
rewrite ^/dss(.*)$ $1 last;
proxy_pass http://blog:3000;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Host $host;
# proxy_set_header Connection 'upgrade';
# proxy_cache_bypass $http_upgrade;
}
主要是因为 node 那边定义的路由就是 /xxx/xxx
, 没有 blog
这一节。