通过nginx反向代理在docker容器内的phpMyAdmin

时间:2017-06-12 12:34:31

标签: nginx docker phpmyadmin reverse-proxy

我安装了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会在浏览器标签上显示favicon,但只显示空白页而不是登录页面。删除前面的" /"并重新启动nginx只能得到404。

# docker logs phpmyadmin
除了php和nginx服务启动信息之外,

没有显示任何内容,与phpmyadmin无关。

本地nginx访问日志显示几个304和404代码,大约200个,错误日志不存在。可以找到详细日志here on pastebin

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

如果遗失了一些重要信息,请告知我们。

4 个答案:

答案 0 :(得分: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/

如果您运行的是docker phpmyadmin的4.6.5或更高版本,则应该设置。要更新你可以使用docker pull来拉下最新的。即。

docker pull phpmyadmin/phpmyadmin

答案 1 :(得分:0)

只需删除/pma/的结尾反斜杠:

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

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

答案 2 :(得分:0)

没有什么可以做的。问题是phpmyadmin正在从本地主机提供其页面,即使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 :(得分:0)

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