繁体   English   中英

docker容器上的Nginx反向代理:404重定向

[英]Nginx Reverse Proxy on docker containers : 404 redirections

我正在尝试部署一个包含 Nginx 服务的 docker-compose 堆栈来管理 Jenkins 或 Grafana 等其他服务。 但是,当我以http://myapp.fr/jenkins之类的 Jenkins 服务为目标时,该服务的主页将重定向到此 URL 的登录页面:http: //myapp.fr/login ?from=%2F。 我如何为所有服务修复此问题,以便为其所有页面的服务名称添加前缀(如http://myapp.fr/jenkins/login?from=%2F )。

我的堆栈看起来像这样:

 version: "3.7" services: ## NGINX ## web: image: nginx container_name: myapp_nginx volumes: - ./config/nginx/templates:/etc/nginx/templates - ./config/nginx/include.d:/etc/nginx/include.d - ./config/nginx/www:/var/www/certbot ports: - "80:80" - "443:443" environment: - NGINX_HOST=myapp.fr - NGINX_PORT=80 networks: - myapp ## JENKINS ## jenkins: build: context: ./dockerfile/jenkins dockerfile: Dockerfile container_name: myapp_jenkins hostname: jenkins.myapp.fr privileged: true user: root ports: - 8080:8080 - 50000:50000 volumes: - ~/jenkins:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock - /usr/local/bin/docker:/usr/local/bin/docker restart: always networks: - myapp ## GRAFANA ## grafana: image: grafana/grafana-enterprise:8.2.0 container_name: myapp_grafana hostname: grafana.myapp.fr ports: - 3000:3000 user: "104" networks: - myapp networks: myapp: driver: bridge

我的 nginx 的 default.conf 位于我的 docker 卷之一中,它看起来像这样:

 server { listen 80; listen [::]:80; server_name myapp.fr; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } location /jenkins/ { proxy_set_header Host $host; add_header Access-Control-Allow-Origin '*'; proxy_pass http://jenkins.myapp.fr:8080/; } location /grafana/ { proxy_set_header Host $host; add_header Access-Control-Allow-Origin '*'; proxy_pass http://grafana.myapp.fr:3000/; } add_header Access-Control-Allow-Origin '*'; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; add_header Access-Control-Allow-Headers 'User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,Access-Control-Allow-Origin'; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }

当我开始部署时,我使用 docker-compose up -d 命令并且所有服务都在运行。 myapp.fr 显示 nginx 索引。 但是,如果我指定了子路径 myapp.fr/jenkins,由于重定向到http://myapp.fr/login?from=%2F ,它将显示 404 错误

我如何为所有服务修复此问题,为其所有页面添加前缀服务名称(如http://myapp.fr/jenkins/login?from=%2F )。

谢谢

您必须告诉 Jenkins 您正在使用额外的上下文路径,因此它会生成所有带有添加上下文的重定向。 您可以通过在启动时传递--prefix=/jenkins来做到这一点。 您也可以通过JENKINS_OPTS环境变量传递它。 以下是如何将其传递给docker run

docker run --name myjenkins -p 8080:8080 -p 50000:50000 --env JENKINS_OPTS="--prefix=/jenkins" jenkins/jenkins:lts

更新

以下是您可以使用的示例 NginX 配置。 请注意指定的proxy_redirect选项,它确保所有重定向 URL 都更改为您的正确主机名。

server {
    listen 80;
    server_name jenkins.ycr.com;

    location /jenkins {
            proxy_pass  http://127.0.0.1:8081;
            proxy_redirect http://127.0.0.1:8081/ http://jenkins.ycr.com/;
        }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM