502 – 通过完全不受限制的unix套接字连接到上游的错误网关/“连接被拒绝”
TL; DR:
我有一个应用程序组成一个链接到一个php
容器的nginx
容器,我得到一个connection refused
的connection refused
( 502 - Bad Gateway
在浏览器中的502 - Bad Gateway
),如果我试图到达我的应用程序,而使用完全不受限制的(0777模式)可使用。
我使用docker-compose
来pipe理我的应用程序,并使用docker-machine在OSX
上运行。
我的问题 :
我已经build立了一个有两个容器(nginx + php)的小项目,并且可以和TCP套接字一起使用。
但是我想切换到unix套接字,并且在尝试访问我的应用程序时遇到502 - Bad Gateway
和以下日志:
nginx_1 | 2017/07/27 19:12:09 [error] 5#5: *1 connect() to unix:/sock/php.sock failed (111: Connection refused) while connecting to upstream, client: 192.168.99.1, server: 192.168.99.100, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/sock/php.sock:", host: "192.168.99.100:10080" nginx_1 | 192.168.99.1 - - [27/Jul/2017:19:12:09 +0000] "GET / HTTP/1.1" 502 173 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:52.0) Gecko/20100101 Firefox/52.0" nginx_1 | 192.168.99.1 - - [27/Jul/2017:19:12:09 +0000] "GET /favicon.ico HTTP/1.1" 502 173 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:52.0) Gecko/20100101 Firefox/52.0"
我已经把包含套接字的目录放在两个容器上(参见docker-compose.yml
)
我不明白为什么既然这两个容器都可以访问unix套接字,并且完全不受限制:
从php
容器:
/sock # ls -la total 8 drwxrwxrwx 2 root root 4096 Jul 27 17:56 . drwxr-xr-x 57 root root 4096 Jul 27 17:33 .. -rwxrwxrwx 1 root root 0 Jul 27 17:30 php.sock
从nginx
容器中:
# cd /sock # ls -la total 8 drwxrwxrwx 2 root root 4096 Jul 27 17:56 . drwxr-xr-x 31 root root 4096 Jul 27 17:33 .. -rwxrwxrwx 1 root root 0 Jul 27 17:30 php.sock
我检查:修改一个容器中的/sock
内容也会修改另一个容器中相同目录的内容。
问题是什么?
有关我的项目的详情:
我的项目包括以下树木:
. ├── docker-compose.yml ├── index.php ├── services │ ├── app │ │ └── Dockerfile │ └── nginx │ └── nginx.conf ├── [Other php sources files and directories] └── static └── foo.html
这是我docker-compose.yml
:
version: '3' services: db: # I have no problem with the DB so far. image: mysql environment: - MYSQL_ROOT_PASSWORD=XXXXXXXX - MYSQL_USER=XXXXXXXX - MYSQL_PASSWORD=XXXXXXXX - MYSQL_DATABASE=XXXXXXXX volumes: - /var/lib/app/app_DB:/var/lib/mysql nginx: image: nginx volumes: - /var/lib/app/media:/var/www/media:ro - /Users/vmonteco/Code/web/app/static:/var/www/static:ro - /Users/vmonteco/Code/web/app/services/nginx/nginx.conf:/etc/nginx/nginx.conf:ro - /Users/vmonteco/Code/web/app:/var/www/html:ro - unix_socket:/sock ports: - "10080:80" - "10443:443" app: build: context: services/app # ports: # - "19000:9000" links: - db volumes: - /var/lib/app/media:/var/www/media - /Users/vmonteco/Code/web/app/static:/var/www/static:ro - /Users/vmonteco/Code/web/app:/var/www/html:ro - unix_socket:/sock depends_on: - db volumes: unix_socket:
这里是app
Dockerfile:
FROM php:7.1-fpm-alpine RUN docker-php-ext-install pdo pdo_mysql RUN mkdir /sock && chmod -R 777 /sock VOLUME /sock RUN sed -i '/;listen.mode = 0660/c\listen.mode = 0777' /usr/local/etc/php-fpm.d/www.conf && sed -i '/listen = 127.0.0.1:9000/c\listen = /sock/php.sock' /usr/local/etc/php-fpm.d/www.conf
nginx
configuration文件:
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; root /var/www/html/; server { listen 80; server_name 192.168.99.100; location /media/ { alias /var/www/media/; autoindex off; } location /static/ { alias /var/www/static/; autoindex off; } location / { try_files $uri $uri/ /index.php; index index.html index.php; } location ~ \.php$ { #try_files $uri =404; #fastcgi_pass 192.168.99.100:19000; fastcgi_pass unix:/sock/php.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param HTTPS off; fastcgi_index index.php; } } }
(请注意,访问/static/
或/media/
URL是没有问题的。)
和php
容器中的/usr/local/etc/php-fpm.d/www.conf
文件中的所有未注释的行,在构build时修改:
[www] user = www-data group = www-data listen = /sock/php.sock listen.mode = 0777 pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3
我终于find了解释:
configurationfpm服务的文件不是/usr/local/etc/php-fpm.d/www.conf
(或者至less不是),但是它是/usr/local/etc/php-fpm.d/zz-docker.conf
:
[global] daemonize = no [www] listen = [::]:9000
在这个文件中修改listen
指令解决了这个问题。
- 从dockerfile运行项目依赖项命令
- Dockered Django + Celery(`celeryd`和`celerybeat`),任务被执行,但数据库(SQLite)不被修改。 哪里不对?
- Docker卷,更改文件权限/所有者
- 如何使用JavaScript获取Docker容器的名称?
- 在主机目录中挂载mysql容器的日志
- 在Windows上运行docker镜像的结果是“oci runtime error:exec:”bash“:可执行文件在$ PATH中找不到。
- Docker组成不显示控制台输出的链接
- sudo:docker-machine:command not found
- 如何使用docker-compose链接两个容器