出于开发目的,我需要在 Docker 中启动一些用 Asp.net core WebApi 编写的应用程序。
撰写:
version: '3.7'
services:
nginx:
image: nginx:stable-alpine
ports:
- "127.0.0.1:81:80"
- "127.0.0.1:443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/conf.d:/etc/nginx/conf.d
restart: unless-stopped
container_name: nginx
extra_hosts:
- "host.docker.internal:host-gateway"
代理本身的配置位于./nginx/conf.d/test.conf路径下的文件中,填写如下:
server {
listen 127.0.0.1:80;
location /foo/ {
proxy_pass http://host.docker.internal:1002;
}
}
那些。我希望当我访问http://localhost:81/foo/swagger时可以看到我的服务的 swagger(位于 http://localhost:1002/swagger)。然而,相反,在 nginx 日志中我看到错误消息:
[error] 29#29: *1 open() "/usr/share/nginx/html/foo/swagger" failed (2: No such file or directory), client: 192.168.240.1, server: _, request: "GET /foo/swagger HTTP/1.1", host: "localhost"
但是,如果您不使用 /foo 前缀,而是仅使用重定向到根“/”,那么一切都会正常工作,并且我会看到大摇大摆的效果。告诉我设置有什么问题吗?
更新:
我尝试通过内部docker网络转发proxy_pass(在第一个comp文件中,创建一个网络并为正在运行的网络分配一个名称,在nginx中,连接到该网络并通过nginx代理内部网络。)最后,结果是相同的,如果您不使用 /foo 前缀并将其配置为 root,则一切正常。我正在寻求建议/想法。
这是在小范围内广为人知的配置特征。
proxy_pass
你在配置中写了
末尾没有
/
URL ,因此proxy_pass
重定向遵循原始请求中使用的相同路径。你要求了吗/foo/swagger
?收到上诉http://host.docker.internal:1002/foo/swagger
如果你不需要前缀
/foo/
那么你需要写注意最后的斜杠!一般规则是:规则中的前缀被 URL 中指定的路径替换。也就是说,在您的情况下,请求将
/foo/swagger
被服务为/swagger
:将用URL替换规则中的nginx
前缀。/foo/
/