node.js - Nginx 反向代理路径名冲突
问题描述
我目前在同一台机器上运行两个网络服务器,一个通过 Gunicorn 使用 Django,这是我的原始站点,另一个用作使用相同域的在线商店,这个使用 Nestjs(Nodejs)。两台服务器都有一个/admin
路径,原始路径位于 example.com/admin,另一个我想位于 example.com/store/admin。但是,每当我在浏览器中输入第二个 URL(即 example.com/store/admin)时,它都会返回另一个管理页面 example.com/admin(没有 /store 前缀)。这是我认为需要修改的配置片段:
server {
server_name example.com www.example.com;
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
location /store {
proxy_pass http://127.0.0.1:3000/;
}
location = /store/admin {
proxy_pass http://127.0.0.1:3000/admin/;
}
...
}
我已经尝试了一些 /store 和 /store/admin 位置块的组合,但似乎无法让它将我引导到商店的服务器管理站点。使用 nodejs 服务器进行测试时,它可以在我的本地开发机器上运行。转到http://example.com/store会返回我期望从 Nestjs 服务器看到的内容。
解决方案
文档指出:
...要查找与给定请求匹配的位置,nginx 首先检查使用前缀字符串(前缀位置)定义的位置。其中,匹配前缀最长的位置被选中并记忆。...
所以你只需要两个位置块:
首先 :
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
另一个是重写:
location /store {
rewrite ^/store(.*) $1 break;
proxy_pass http://127.0.0.1:3000;
}
这意味着它将重写每个以 URL 开头/store
的 URL,并将其从 URL 中删除,然后再传递到上游。这也包括/admin
, 因为它是相同的。
/
另请注意 -末尾没有后缀,proxy_pass
它指示 NGINX 采用用户提供的 URI。
推荐阅读
- shared-libraries - 比 LD_PRELOAD 更细粒度的控制?
- python-3.x - 为不同类型重新定义函数
- angular - 拖放带有对象数组的拖放
- spring-boot - 如何镜像 Maven 存储库
- mysql - 替换 SQL 表中的值
- finite-automata - 设计一个 FA 来接受 L,其中 L = 'a' 总是出现三倍的字符串
- c# - 使用 observable 按字母顺序排序数据
- java - NPE 很难从 logcat 中发现它似乎是 Arraylist 但应该设置每个项目
- docker - Docker 拒绝挂载 NFS 共享
- sql - Laravel Eloquent:选择一个字段等于另一个字段的记录