我只需将我的开发环境转移到新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;
}
}
答案 0 :(得分:0)
第83行的/etc/nginx/conf.d/wordpress.conf
中存在一个错误,其中fastcgi_pass backend
配置指的是不存在的backend
服务。
查看nginx docs,此配置需要FastCGI服务器的IP地址或DNS名称 AND 一个端口。 IOW,即使您将docker-compose.yml中的php
服务重命名为backend
,nginx仍会因另一个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;
}
然后更新docker-compose.yaml中的nginx
服务定义,以使用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会为您的应用程序设置默认单network。此网络以Compose项目命名,您可以通过运行docker network ls
命令查看该项目。项目中的所有容器都加入该网络,并且可以通过其主机名相互访问和发现,这些主机名设置为与容器名称相同。您可以在docs中阅读有关Docker Compose Networking的更多信息。
在您的情况下,您的应用中的其他容器无法访问localhost
。
您必须对PHP_HOST_NAME
环境变量进行相同的更改。
答案 1 :(得分:0)
聚会晚了一点,但是就像您在错误日志中看到的那样,问题出在fastcgi_pass backend;
行中。
backend
不是有效的上游。在您的情况下,您应该引用php服务(在php
文件中的docker-compose
),并像fastcgi_pass php:9000;
一样引用它(我假设您用于php fpm的端口是9000 ,但也可以是另一种,在这种情况下,您应该进行相应的更改。)