【问题标题】:Docker compose nginx + phpmyadmin seperate hostnameDocker 撰写 nginx + phpmyadmin 单独的主机名
【发布时间】:2021-12-30 06:01:46
【问题描述】:

我正在尝试使用 nginx、php、mysql、phpmyadmin 设置 docker 环境,我想知道如何配置它,以便我可以通过另一个主机名访问 phpmyadmin。

例如访问我想使用 site.com 的站点和访问我想使用 database.site.com 的 phpmyadmin

我的 /etc/hosts 是这样配置的

127.0.0.1      localhost example.com database.example.com

我的 docker 作曲家是这样的

version: '3'
services:
    web:
        image: nginx:alpine
        container_name: nginx
        volumes:
            - "./etc/nginx/default.conf:/etc/nginx/conf.d/default.conf"
            - "./etc/ssl:/etc/ssl"
            - "./repo:/var/www/html"
            - "./etc/nginx/default.template.conf:/etc/nginx/conf.d/default.template"
        ports:
            - "80:80"
            - "443:443"
        environment:
            - NGINX_HOST=site.com
        networks:
            - my-network
        command: /bin/sh -c "envsubst '$site.com' < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
        restart: always
        depends_on:
            - php
            - mysql
    php:
        image: bitnami/php-fpm:8.0.10
        container_name: php
        restart: always
        volumes:
            - "./etc/php/php.ini:/usr/local/etc/php/conf.d/php.ini"
            - "./repo:/var/www/html"
    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        container_name: phpmyadmin
        ports:
            - "8080:80"
        environment:
            - PMA_ARBITRARY=1
            - PMA_HOST=mysql
        networks:
            - my-network
        restart: always
        depends_on:
            - mysql
    mysql:
        image: mysql:8.0.27
        container_name: mysql
        restart: always
        env_file:
            - ".env"
        environment:
            - MYSQL_DATABASE=database
            - MYSQL_ROOT_PASSWORD=root
            - MYSQL_USER=admin
            - MYSQL_PASSWORD=admin
        ports:
            - "8989:3306"
        volumes:
            - "./data/db/mysql:/var/lib/mysql"
networks:
  my-network: null

我的 nginx 配置文件看起来像这样

server {
    listen 80;
    server_name example.com;
    root /var/www/html/public;
    ...
    location ~ \.php$ {
      fastcgi_split_path_info ^(.+\.php)(/.+)$;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME$document_root$fastcgi_script_name;
      fastcgi_intercept_errors on;
      fastcgi_pass unix:/run/php/php8.0-fpm.sock;
    }
    ...
 }

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com;
    root /var/www/html/public;
    ...
    location / {
      if ($args ~* _escaped_fragment_) {
        # Pass to phantom proxy
        proxy_pass http://127.0.0.1:443;
      }
      proxy_redirect off;
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Client-Verify SUCCESS;
      proxy_set_header X-SSL-Subject $ssl_client_s_dn;
      proxy_set_header X-SSL-Issuer $ssl_client_i_dn;
      proxy_set_header HTTPS on;
      proxy_buffers 16 4k;
      proxy_buffer_size 2k;
      proxy_pass http://127.0.0.1:433;
    }
    ...
 }

server {
    listen 80;
    server_name database.example.com;
    location / {       
         proxy_pass  http://phpmyadmin:80;
     }
 }

【问题讨论】:

    标签: docker nginx docker-compose containers


    【解决方案1】:

    不要使用 site.com 作为this reason 的示例。我已将所有内容更改为 example.com

    1. 更改端口绑定,以便 nginx 从主机 443:44380:80 绑定正确的端口(而不是 9080:803000:443)。否则,您的网络请求将需要包含端口,例如https://example.com:3000
    2. 通过公共网络将您的容器连接在一起(请参阅here)。
    3. 更新您的 nginx 配置以将流量代理到您的 phpmyadmin 容器。应该是这样的:
    ...
    server {
      listen        80;
      server_name   database.example.com;
    
      location / {
        proxy_pass  http://phpmyadmin;
      }
    }
    ...
    

    这应该会产生以下结果:

    • http://database.example.com 的请求解析为127.0.0.1
    • Web 浏览器在端口 80 上发出请求。
    • 127.0.0.1:80 被转发到您的 nginx 容器中的端口 80
    • nginx 将流量代理到http://phpmyadmin,它能够解析并通过 docker 网络连接。

    您应该能够获得https://database.example.com 并且之后该网站可以相当轻松地运行。我相信https://example.com 在修复端口绑定后应该可以正常工作。要修复 http://example.com 端点,请将您的侦听器从 127.0.0.1:9080 更改为 nginx 配置中的 80

    【讨论】:

    • 非常感谢,我已经按照您的建议更改了端口绑定,我还在我的 nginx 和 phpymyadmin 容器之间创建了一个网络连接,并尝试了解我应该如何配置我的 nginx.. 我遇到了什么问题现在,当尝试连接到example.comdatabase.example.com 时,连接到上游时连接被拒绝。我应该为我的 example.com 设置什么 proxy_pass 以及为什么我应该将 phpmyadmin:3306 设置为我 database.example.com 的 proxy_pass 谢谢!
    • 好吧,这是有道理的,我会尝试做一些改变。我现在还用我所做的更改以及配置现在的外观更新了我的答案。代理不应该是 phpmyadmin:8080,因为我的 phpmyadmin 有那个端口吗?我将 3306 用于 mysql 容器?谢谢
    • 抱歉,我的意思是端口 80 用于 phpmyadmin,而不是 3306,更新了答案。例如.com,您只是从 nginx 容器 (/var/www/html/public) 中本地提供内容,因此您不需要代理到另一个容器。希望这是有道理的,随时发布一些更新的配置,我可以看看。
    • 我注意到的另外两个项目。您不应该在 nginx 的 phpmyadmin 配置中需要 root 元素,因为您没有从本地容器中提供内容。您应该将 phpmyadmin 上的位置从 /phpmyadmin 更改为 /。您想提供来自 database.example.com 而不是 database.example.com/phpmyadmin 的内容。
    • 是的,这是有道理的,我再次更新了我的答案。当我尝试访问database.example.com 时,它会下载我的 /var/www/html/public/index.php 文件??知道为什么会这样吗?
    猜你喜欢
    • 2018-12-10
    • 2019-07-11
    • 2019-10-06
    • 2017-06-10
    • 2021-09-13
    • 2020-02-29
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    相关资源
    最近更新 更多