【问题标题】:phpMyAdmin inside docker container via nginx reverse proxydocker容器内的phpMyAdmin通过nginx反向代理
【发布时间】:2017-11-13 22:34:30
【问题描述】:

我安装了phpMyAdmin docker image 并运行它

# docker run --name phpmyadmin -d --link mariadb:db -p 8081:80 -e PMA_ABSOLUTE_URI=http://servm3/pma --restart unless-stopped phpmyadmin/phpmyadmin

访问http://servm3:8081 工作正常。变量 PMA_ABSOLUTE_URI 用于反向代理,如 docker page 所示。

然后我设置 nginx(本地安装,而不是在 docker 内)充当反向代理(适用于 guacamole 等其他几个应用程序)。

在我的 nginx.conf 中,我有:

location /pma/ {               
    proxy_pass http://localhost:8081/;                                 
    proxy_buffering off;                                     
}

访问http://servm3/pma 会在浏览器选项卡上显示网站图标,但不会显示登录页面,而是只显示一个空白页面。删除前面的“/”并重新启动nginx只会给出404。

# docker logs phpmyadmin

除了 php 和 nginx 服务启动信息外,什么都不显示,与 phpmyadmin 无关。

本地 nginx 访问日志显示几个 304 和 404 代码以及一些 200,错误日志不存在。详细日志可以查看here on pastebin

我希望有人能告诉我如何让 nginx 作为 phpMyAdmin docker 容器的反向代理。

如果缺少一些重要信息,请告诉我。

【问题讨论】:

  • afaik proxy_pass 还会从您的位置转发上下文“pma”。您需要相应地重写
  • @gamma 感谢您的提示。我用谷歌搜索了一下,然后尝试“重写 /pma(.*) /$1 break;”但没有成功。你有提示重写应该是什么样子吗?
  • 正如@robert 所说:删除尾部斜杠,然后尝试:重写 ^/pma (/?.*?)$ $1 break;
  • 感谢@gamma,但仍然没有运气。 Nginx 抱怨““重写”指令中的参数数量无效”,所以我删除了 ^/pma 之后的附加空白。还是空白页。我现在有location /pma { rewrite ^/pma(/?.*?)$ $1 break; proxy_pass http://localhost:8081/; proxy_buffering off; }。当然,在配置更改后,nginx 会像往常一样重新启动。我快要投降了……

标签: nginx docker phpmyadmin reverse-proxy


【解决方案1】:

不知道你是否还在寻找答案。 只需从Joshua Ostrom 关注此answer。 问题是我不知道为什么它的行为不像它应该的那样,但是你需要在末尾添加 index.php,如https://yourdomain.com/pma/index.php。 我有同样的问题

【讨论】:

    【解决方案2】:

    没有什么可以做的。问题是 phpmyadmin 正在从 localhost 为其页面提供服务,即使 nginx 将访问从 http://servm3/pma 转换为 http://localhost,HTML 内容中的所有链接都会忽略最新的链接,即使它们是相对的,它们也不会考虑/pma 部分。因此,您看到的所有这些 404 错误都来自在 HTML 中被引用为像 styles.css 这样的相对链接的资源,当被引用/单击时变成 http://servm3/styles.css,这在服务器中不存在。

    不幸的是,反向代理在标头级别工作,因此,即使它们能够即时更改 Location 之类的标头,它们也不会影响 HTML 内容,因此会出现问题。有一些涉及动态更改 HTML 代码的解决方法,但它们并不容易,最多不可靠,并且会严重影响性能,因此唯一实用的解决方案是网站明确支持某种基本路径设置。在这种情况下,解决方案是 phpmyadmin Docker 映像允许使用 docker-compose.yaml 中的环境变量设置基本路径,而不是默认为 root。

    同时,另一种解决方法是不使用相对路径,而是使用子域。如果您可以控制 servm3 的 DNS 设置,则可以使用 phpmyadmin.servm3 和 proxy_pass 之类的设置,而不会出现问题。

    【讨论】:

      【解决方案3】:

      一定要包括重写:

      location  ~ \/pma {
        rewrite ^/pma(/.*)$ $1 break;
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://localhost:8081;
      }
      

      您还需要在 docker-compose.yml 中设置 PMA_ABSOLUTE_URI 环境变量:

      PMA_ABSOLUTE_URI: https://yourdomain.com/pma/
      

      如果您正在运行 4.6.5 或更高版本的 docker phpmyadmin,您应该进行设置。要更新,您可以使用 docker pull 来拉取最新的。即

      docker pull phpmyadmin/phpmyadmin
      

      【讨论】:

        【解决方案4】:

        只需去掉/pma/的结尾反斜杠:

        location /pma {               
            proxy_pass http://localhost:8081/;                                 
            proxy_buffering off;                                     
        }
        

        浏览器将其视为目录并相应地请求资产,这对于 PMA 来说是意料之外的。

        【讨论】:

        • 这给了我相同的空白页面,nginx 日志看起来与最初问题中的链接相同。
        • @släker 让我去办公室看看
        猜你喜欢
        • 2020-01-19
        • 2021-05-04
        • 2018-03-20
        • 1970-01-01
        • 2017-03-21
        • 2020-02-26
        • 2020-09-10
        • 2019-05-04
        • 1970-01-01
        相关资源
        最近更新 更多