簡體   English   中英

無法使用 Docker-Compose 連接到 NGINX

[英]Can not connect to NGINX with Docker-Compose

我只需要將我的開發環境轉移到新的 Mac 並在新機器上設置 Docker。 我正在使用 docker-compose 通過 nginx 托管本地 wordpress。 所有容器都在啟動,但 nginx 容器拒絕工作。 所以我無法訪問 localhost:8000 下的站點

我在我的舊電腦上有相同的配置,它運行順利。 我錯過了什么嗎?

所以,這是我的 dockerfile:

version: "2"

services:
  mariadb:
    image: wodby/wordpress-mariadb
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: 1
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    volumes:
      - ./docker-runtime/mariadb:/var/lib/mysql

  php:
    image: wodby/wordpress-php
    environment:
      PHP_SITE_NAME: dev
      PHP_HOST_NAME: localhost:8000
      PHP_SENDMAIL_PATH: /usr/sbin/sendmail -t -i -S mailhog:1025
      PHP_XDEBUG_ENABLED: 0 
    volumes:
      - ./:/var/www/html

  nginx:
    image: wodby/wordpress-nginx
    environment:
      NGINX_SERVER_NAME: localhost
      NGINX_UPSTREAM_NAME: php
    volumes_from:
      - php
    ports:
      - "8000:80"

  pma:
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_HOST: mariadb
      PMA_USER: wordpress
      PMA_PASSWORD: wordpress
      PHP_UPLOAD_MAX_FILESIZE: 1G
      PHP_MAX_INPUT_VARS: 1G
    ports:
     - "8001:80"

  mailhog:
    image: mailhog/mailhog
    ports:
      - "8002:8025"

使用 Kitematic 我收到以下 nginx 錯誤:

/docker-entrypoint.sh: running /docker-entrypoint-init.d/wordpress-nginx.sh
nginx: [emerg] no port in upstream "backend" in /etc/nginx/conf.d/wordpress.conf:83

似乎端口沒有真正正確設置。 將舊計算機上的 nginx 容器的端口與新安裝的端口進行比較可以更清楚地表明:

舊電腦: 在此處輸入圖片說明

新電腦: 在此處輸入圖片說明

你知道我做錯了什么或者我如何設置正確的端口嗎?

編輯:

這是/etc/nginx/conf.d/wordpress.conf

    server {
        server_name wordpress;
        listen 80;

        root /var/www/html/;
        index index.php;

        fastcgi_keep_conn on;
        fastcgi_index index.php;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        add_header Cache-Control "store, must-revalidate, post-check=0, pre-check=0";

        location ~* ^/.well-known/ {
            allow all;
        }

        location = /favicon.ico {
            try_files $uri =204;
            log_not_found off;
            access_log off;
        }

        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }

        location = /readme.html {
            return 404;
        }

        location ~* ^.*(\.(?:git|svn|htaccess|txt|pot?))$ {
            return 404;
        }

        location ~ /\. {
            deny all;
        }

        location ~* /(?:uploads|files)/.*\.php$ {
            deny all;
        }

        location ~* \.flv$ {
            flv;
        }

        location ~* .*\.(?:m4a|mp4|mov)$ {
            mp4;
            mp4_buffer_size     1M;
            mp4_max_buffer_size 5M;
        }

        location ~* ^.+\.(?:ogg|pdf|pptx?)$ {
            expires max;
            tcp_nodelay off;
        }

        location / {
            try_files $uri $uri/ /index.php?$args;
        }

        # Add trailing slash to */wp-admin requests.
        rewrite /wp-admin$ $scheme://$host$uri/ permanent;

        # Directives to send expires headers and turn off 404 error logging.
        location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|woff2|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
            access_log off; log_not_found off; expires max;
        }

        location ~ [^/]\.php(/|$) {
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            if (!-f $document_root$fastcgi_script_name) {
                return 404;
            }

            include fastcgi.conf;
            fastcgi_index index.php;
            fastcgi_pass backend;
            track_uploads uploads 60s;
        }
    }

第 83 行的/etc/nginx/conf.d/wordpress.conf有一個錯誤,其中fastcgi_pass backend配置指的是不存在的backend服務。

查看 nginx 文檔,此配置需要 FastCGI 服務器的 IP 地址或 DNS 名稱端口。 IOW,即使您將 docker-compose.yml 中的php服務重命名為backend ,nginx 仍然會因另一個nginx: [emerg] no port in upstream "backend" in /etc/nginx/conf.d/wordpress.conf:83失敗nginx: [emerg] no port in upstream "backend" in /etc/nginx/conf.d/wordpress.conf:83錯誤,因為缺少端口號。

由於此wordpress.conf已烘焙到wodby/wordpress-nginx映像中,因此您必須基於此映像創建自己的 Dockerfile,或覆蓋其/etc/nginx/conf.d/wordpress.conf文件。

要覆蓋wordpress.conf文件,請從容器中獲取原始副本,並將fastcgi_pass部分更改為php:80

location ~ [^/]\.php(/|$) {
  fastcgi_split_path_info ^(.+?\.php)(/.*)$;
  if (!-f $document_root$fastcgi_script_name) {
    return 404;
  }

  include fastcgi.conf;
  fastcgi_index index.php;
  fastcgi_pass php:80;
  track_uploads uploads 60s;
}

然后更新nginx在泊塢窗,compose.yaml服務定義使用您的版本wordpress.conf使用volumes ,如下圖所示。

nginx:
  image: wodby/wordpress-nginx
  environment:
    NGINX_SERVER_NAME: nginx
    NGINX_UPSTREAM_NAME: php
  ports:
    - "8000:80"
  depends_on:
    - php
  volumes:
    - ./wordpress.conf:/etc/gotpl/wordpress.conf.tpl

請注意,容器中的目標路徑是/etc/gotpl/wordpress.conf.tpl因為這是容器的/docker-entrypoint.sh腳本復制到/etc/nginx/conf.d文件夾中的源。

最后,正如我在原始答案中指出的那樣,不要忘記將 docker-compose.yaml 文件中localhost所有引用更改為正確的服務名稱。

原始答案:

嘗試將NGINX_SERVER_NAME環境變量從localhost更改為nginx

當您將應用程序作為 Compose 項目運行時,Compose 會為您的應用程序設置一個默認的單一網絡 該網絡以您的 Compose 項目命名,您可以通過運行docker network ls命令查看該項目。 項目中的所有容器都加入該網絡,並且可以通過它們的主機名相互訪問和發現,主機名設置為與容器名稱相同。 您可以在docs 中閱讀有關 Docker Compose Networking 的更多信息。

在您的情況下,您的應用程序中的其他容器無法訪問localhost

您必須對PHP_HOST_NAME環境變量進行相同的更改。

聚會有點晚了,但是就像您在錯誤日志中看到的那樣,問題出在fastcgi_pass backend;這一行fastcgi_pass backend; .

backend不是有效的上游。 在您的情況下,您應該引用 php 服務( docker-compose文件中的php ),並像fastcgi_pass php:9000;一樣引用它fastcgi_pass php:9000; (我假設您用於 php fpm 的端口是 9000,但可能是另一個,在這種情況下您應該相應地更改)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM