如何配置Nginx,使http://localhost/tut/转到命名容器而不显示其端口号,并且不会抛出404错误

2nc8po8w  于 2023-03-22  发布在  Nginx
关注(0)|答案(1)|浏览(140)

我正在学习Nginx。我有一个示例设置,一个容器中有nginx:1.23.3-alpine,另一个容器中有docker/getting-started,在端口4444上运行。
我有一个默认的index.html在http://localhost,它显示了我正确的“着陆页”。
我可以在http://localhost:4444上找到我的入门教程容器,它解析为http://localhost:4444/tutorial/
现在,我想了解如何配置它,以便通过http://localhost/tut/访问教程,并将其解析为至少http://localhost:4444/tutorial/,但更好的是http://localhost/tutorial/。所有这些都是为了准备设置我的实际堆栈,我想使用特定的公共URL访问各种端口上的容器,但不显示它们的端口号,最终都在HTTPS上。因此,这个简单的初始测试。
所以...
docker compose up-没有错误。
http://localhost返回200
http://localhost:4444http://localhost:4444/tutorial/返回200

问题是:

http://localhost/tut/返回404,因为根据日志,它正在查找/usr/share/nginx/html/tutorial/index.html

my-nginx  | 2023/03/11 03:14:16 [error] 31#31: *6
"/usr/share/nginx/html/tutorial/index.html" is not found (2: No such file or directory), 
client: 172.18.0.1, server: , request: "GET /tutorial/ HTTP/1.1", host: "localhost", 
referrer: "http://localhost/tut/"

我尝试过不同的服务器块和各种各样的东西建议在其他职位,但这是最接近我来到一个不太工作的解决方案!
我的停靠文件:

FROM nginx:1.23.3-alpine
EXPOSE 80 443

# Copy in your SSL certs
# For when I test it with HTTPS
COPY certs/* /etc/nginx/ssl/localhost/

# Copy in your nginx config
COPY config/localhost.conf /etc/nginx/nginx.conf

# Copy in your landing page example
COPY static-html /usr/share/nginx/html

我的Docker合成文件

version: '3'

services:

  my-nginx:
    container_name: my-nginx

    build: ./nginx/.

    ports:
      - "80:80"
      - "443:443"

    networks:
      - my-network

  my-test:
    container_name: my-test
    image: docker/getting-started

    ports:
      - "4444:80"

    networks:
      - my-network

networks:
  my-network:
    name: my-network
    driver: bridge

我的nginx localhost.conf文件:

events {}
http {

  server {
      listen       80;
      listen  [::]:80;

      location / {
          root   /usr/share/nginx/html;
          index  index.html index.htm;
      }

      location /tut/ {
        proxy_pass http://my-test:80/;
      }
  }
}
hgc7kmma

hgc7kmma1#

这个问题原来是Nginx的某种模式匹配RegEx?问题。不是真正的bug?不确定。
入门容器被设计为重定向到/tutorial并显示页面内容。

  • 然而 *...如果位置是/tutorial的任何部分匹配,则会导致404。因此,对于上面我的conf文件中的第二个位置块:
/xxx works
/yes works
/tat works

but these result in 404
/t
/tu
/tut

and so on

日志上写着:

[error] 39#39: *10 "/usr/share/nginx/html/orial/index.html" is not found 
(2: No such file or directory), client: 192.168.160.2, server: localhost,
request: "GET /orial/ HTTP/1.0", host: "my-test", referrer: "http://localhost/tut/"

注意url路径:“/usr/share/nginx/html/orial/index.html”和“GET /orial/ HTTP/1.0”

相关问题