Node.js nginx按docker主机映射路由,对于每个路由,调用不同的容器
我试图通过docker主机映射路由,对于每个路由,调用不同的容器 我有一个docker compose,包含2个服务,该服务位于:5000端口。My nginx.conf映射如下代码:Node.js nginx按docker主机映射路由,对于每个路由,调用不同的容器,node.js,docker,nginx,routes,nodes,Node.js,Docker,Nginx,Routes,Nodes,我试图通过docker主机映射路由,对于每个路由,调用不同的容器 我有一个docker compose,包含2个服务,该服务位于:5000端口。My nginx.conf映射如下代码: location /template-api { rewrite ^/template-api/?(.*) /$1 break; proxy_pass http://template-api:5000; proxy_redirect off
location /template-api {
rewrite ^/template-api/?(.*) /$1 break;
proxy_pass http://template-api:5000;
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-Forwarded-Host $server_name;
}
location /api-plan {
rewrite ^/api-plan/?(.*) /$1 break;
proxy_pass http://api-plan:5000;
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-Forwarded-Host $server_name;
}
当调用localhost:8000/api模板/文档时,调用静态文件的路由或返回静态文件的路由。他在localhost:8000/swaggerui中返回错误,未找到文件。
出现这种错误是因为swagger ui文件夹位于localhost:8000/api template/swagger ui和localhost:8000/api plan/swagger ui中
为了修复该错误,我将添加到ngix,即映射/
路由的配置:
server {
listen 8000;
access_log /var/log/nginx/api.log;
error_log /var/log/nginx/api_error.log;
server_name localhost;
location / {
proxy_pass http://api-plan:5000;
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-Forwarded-Host $server_name;
}
现在,当我调用localhost:8000/api plan/documentation时,结果是成功的,但是当我调用localhost:8000/template api/documentation时,api重定向到localhost:8000/api plan/导致错误的路径。尝试以下方法:
server {
listen 8000;
access_log /var/log/nginx/api.log;
error_log /var/log/nginx/api_error.log;
server_name localhost;
location / {
proxy_pass http://$server_name:8080/swaggerUi;
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-Forwarded-Host $server_name;
}
location /template-api {
rewrite ^/template-api/?(.*) /$1 break;
proxy_pass http://template-api:5000;
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-Forwarded-Host $server_name;
}
location /api-plan {
rewrite ^/api-plan/?(.*) /$1 break;
proxy_pass http://api-plan:5000;
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-Forwarded-Host $server_name;
}
}
您可以使用cookies来检测哪个后端应该接收
/swaggerui
请求。这是非常不安全的,因为用户可以编辑cookie并尝试访问其他主机,但由于它是一个本地测试环境,所以它可以正常工作
server {
listen 8000;
access_log /var/log/nginx/api.log;
error_log /var/log/nginx/api_error.log;
server_name localhost;
location ~ ^/swaggerui {
resolver 127.0.0.11 ipv6=off;
proxy_pass http://$cookie_origin:5000;
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-Forwarded-Host $server_name;
}
location /template-api {
rewrite ^/template-api/?(.*) /$1 break;
proxy_pass http://template-api:5000;
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-Forwarded-Host $server_name;
add_header Set-Cookie "origin=template-api;Domain=localhost;Path=/;Max-Age=100000";
}
location /api-plan {
rewrite ^/api-plan/?(.*) /$1 break;
proxy_pass http://api-plan:5000;
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-Forwarded-Host $server_name;
add_header Set-Cookie "origin=plan-api;Domain=localhost;Path=/;Max-Age=100000";
}
}
你不能只创建两个不同的位置而不是根路由吗/?如果,我删除了那个位置,当浏览器调用localhost:5000/swagger时,他不知道在哪里必须查找静态文件:/event如果你保留3个不同的位置?静态文件的根位置和这些swaggerui端点的另外两个位置。我想这会管用的是的!我想在这种可能性下,我正在寻找我是如何做这件事的哈哈哈,这是完全相同的方法,我会采取!$servername返回第3Works-to-me行中定义的服务器名称!但是,现在,当斯威格请求时,他正在呼叫
http://api-plan/v1/
当正确值为http://localhost:8000/api-计划/v1/