[英]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.