当前位置: 首页 > 知识库问答 >
问题:

带有PHP7 fpm和nginx的多码头集装箱

封烨伟
2023-03-14

我在设置多docker容器环境时遇到问题。这个想法相当标准:

  • 一个容器运行php fpm

我的phpfpm Docker文件非常简单:

FROM php:7.0-fpm

# install the PHP extensions we need
RUN apt-get update && apt-get install -y libpng12-dev libjpeg-dev && rm -rf /var/lib/apt/lists/* \
    && docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \
    && docker-php-ext-install gd mysqli opcache

# set recommended PHP.ini settings
# see https://secure.php.net/manual/en/opcache.installation.php
RUN { \
        echo 'opcache.memory_consumption=128'; \
        echo 'opcache.interned_strings_buffer=8'; \
        echo 'opcache.max_accelerated_files=4000'; \
        echo 'opcache.revalidate_freq=2'; \
        echo 'opcache.fast_shutdown=1'; \
        echo 'opcache.enable_cli=1'; \
    } > /usr/local/etc/php/conf.d/opcache-recommended.ini

VOLUME /var/www/html

CMD ["php-fpm"]

Nginx更是如此:

FROM nginx

COPY conf.d/* /etc/nginx/conf.d/

其中conf.d文件夹中有一个文件default。形态

server {
    listen 80;
    server_name priz-local.com;
    root /var/www/html;

    index index.php;

    location / {
        proxy_pass  http://website:9000;
        proxy_set_header   Connection "";
        proxy_http_version 1.1;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

还有docker-compose.yml

website:
  build: ./website/
  ports:
   - "9000:9000"
  container_name: website
  external_links:
     - mysql:mysql
nginx-proxy:
  build: ./proxy/
  ports:
    - "8000:80"
  container_name: proxy
  links:
       - website:website

这种精确的设置在AWS Elastic Beanstalk上非常有效。但是,在我的本地docker上,我遇到了如下错误:

2016/11/17 09:55:36[错误] 6#6:*1连接()失败(111:连接拒绝),同时连接到上游,客户端:172.17.0.1,服务器:priz-local.com,请求:"GET/HTTP/1.1",上游:"http://127.0.0.1:9000/",主机:"priz-local.com:8888"172.17.0.1--[17/Nov/2016:09:55:36 0000]"GET/HTTP/1.1"502 575"-"Mozilla/5.0(Macintosh; Intel Mac OS X10_12_1)AppleWebKit/537.36(KHTML, like Gecko)Chrome/54.0.2840.71Safari /537.36"-"

如果我登录到代理容器并尝试卷曲到另一个容器,则进行更新,我将获得以下信息:

root@4fb46a4713a8:/# curl http://website
curl: (7) Failed to connect to website port 80: Connection refused
root@4fb46a4713a8:/# curl http://website:9000
curl: (56) Recv failure: Connection reset by peer

我试过的另一件事是:

server {
    listen 80;
    server_name priz-local.com;
    root /var/www/html;

    #index index.php;
    #charset UTF-8;

    #gzip on;
    #gzip_http_version 1.1;
    #gzip_vary on;
    #gzip_comp_level 6;
    #gzip_proxied any;
    #gzip_types text/plain text/xml text/css application/x-javascript;

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

    location /nginx_status {
        stub_status on;
        access_log off;
    }

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

    location ~ \.php$ {

        set $nocache "";
        if ($http_cookie ~ (comment_author_.*|wordpress_logged_in.*|wp-postpass_.*)) {
           set $nocache "Y";
        }

        fastcgi_pass  website:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;
        include fastcgi_params;

        #fastcgi_cache_use_stale error timeout invalid_header http_500;
        #fastcgi_cache_key $host$request_uri;
        #fastcgi_cache example;
        #fastcgi_cache_valid 200 1m;
        #fastcgi_cache_bypass $nocache;
        #fastcgi_no_cache $nocache;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        allow all;
        expires max;
        log_not_found off;

        fastcgi_pass  wordpress:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;
        include fastcgi_params;
    }
}

该网站开始工作,但所有资源(js | css | png | jpg | jpeg | gif | ico)现在都返回403

我错过了什么?

共有1个答案

魏鸿
2023-03-14

在与R0经理进行了很长时间的交谈并得到了他的大量帮助后,我想我终于明白了问题的根源。

这里的主要问题是,我没有使用docker,因为它是为了工作。

另一个原因是fpm不是一个网络服务器,代理到它的唯一方法是通过快速cgi(或者可能不是唯一的,但简单的proxy_pass在这种情况下不起作用)。

所以,正确的设置方式是:

  1. 将代码卷安装到两个容器中。
  2. 通过nginx将php脚本配置到php容器中
  3. 将虚拟主机配置为直接由nginx为静态资产服务。

这里有几个如何做到这一点的例子:

http://geekyplatypus.com/dockerise-your-php-application-with-nginx-and-php7-fpm/

https://ejosh.co/de/2015/08/wordpress-and-docker-the-correct-way/

更新添加对我有效的实际解决方案:

为了更快的周转,我决定使用docker-comment,docker-compose.yml如下所示:

website:
  build: ./website/
  container_name: website
  external_links:
    - mysql:mysql
  volumes:
    - ~/Dev/priz/website:/var/www/html
  environment:
    WORDPRESS_DB_USER: **
    WORDPRESS_DB_PASSWORD: ***
    WORDPRESS_DB_NAME: ***
    WORDPRESS_DB_HOST: ***
proxy:
  image: nginx
  container_name: proxy
  links:
    - website:website
  ports:
    - "9080:80"
  volumes:
    - ~/Dev/priz/website:/var/www/html
    - ./deployment/proxy/conf.d/default.conf:/etc/nginx/conf.d/default.conf

现在,这里最重要的一条信息是,我正在将完全相同的代码装载到两个容器中。这是因为fastcgi不能提供静态文件(至少据我所知),所以我们的想法是直接通过nginx提供。

我的默认设置。conf文件如下所示:

server {
    listen 80;
    server_name localhost;
    root /var/www/html;

    index index.php;

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

    location /nginx_status {
        stub_status on;
        access_log off;
    }

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

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass website:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_intercept_errors on;
        include fastcgi_params;
    }
}

所以,这个配置通过php请求代理由fpm容器处理,而其他所有内容都从本地装入的卷中获取。

就这样了。我希望它能帮助某人。

它唯一的几个问题是:

  1. 只是有时http://localhost:9080下载index.php文件而不是执行它
  2. 从php脚本到外部世界,需要很长时间,甚至不知道如何调试,在这一点上。
 类似资料:
  • 我们有计划实施AWS弹性豆茎与多集装箱码头。我有一个对所有服务具有完全访问权限的IAM用户。我已经创建了docker图像,并成功地推到AWS弹性容器服务。当我使用AWS弹性Beanstalk将docker映像(.json)部署到服务器时,我遇到了以下问题。请指导我解决问题。我已经检查了IAM用户策略,并添加了Amazon ECS,弹性Beanstalk完全访问.我已经为您的引用列出了我的.json

  • 第三点我不太清楚。如果我错了就纠正我。如果这两者之间还有其他不同之处,让我知道。

  • 我需要在docker容器中同时运行mozzidto和mongoDB,所以我写了这个docker文件 但这样做的话,只有莫斯奎托能跑。如果我设置为entrypoint only MOSQUITO或only mongodb,它可以工作,我甚至可以从外部访问,但我不能让两者都在同一个容器中运行。有办法吗?

  • 我在获取经过身份验证的用户时遇到问题。在它之前,我得到了令牌和用户ID。现在我需要使用访问令牌和id从服务器获取用户。我有页眉格式 现在我正在尝试使用拦截器添加带有用户令牌和id的标头。 我的代码: 接口: 不同的变体抛出401错误,不知道做什么日志:

  • 问题内容: 我是Docker的新手,正在尝试制作一个演示Rails应用程序。我做了一个看起来像这样的dockerfile: 然后,我像这样构建它: 并调用命令来启动服务器,该服务器会在端口8080上启动服务器: 然后,我尝试找到正确的IP以导航至: 我导航到http://192.168.99.100:8080并收到错误消息192.168.99.100拒绝连接,无法访问此站点。 我可能做错了什么?

  • 我正在努力正确配置nginx,以确保它可以处理Express(端口8081)和Socket的代理。io(端口3000)。下面是我的配置,它当前为整个请求(不仅仅是Socket.io)产生了502错误: 据我所知,我需要确保Socket使用的Websocket。io已升级到HTTP,但这正是我努力掌握自己需要做什么的地方。可能是两个插座。io和Express需要在不同的端口上运行,然后需要根据我上面