簡體   English   中英

帶有PHP7 fpm和nginx的多Docker容器

[英]Multi Docker container with PHP7 fpm and nginx

我在設置多docker容器環境時遇到問題。 這個想法很標准:

  • 一個容器運行php-fpm
  • 另一個是Nginx代理

我的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.conf

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上完美運行。 但是,在我的本地泊塢窗上,出現以下錯誤:

2016/11/17 09:55:36 [錯誤] 6#6:* 1((111:連接被拒絕)連接到上游時失敗(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” 502575“-”“ Mozilla / 5.0(Macintosh; Intel Mac OS X 10_12_1)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 54.0.2840.71 Safari / 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

我想念什么?

經過與R0MANARMY的長時間交談以及他的大量幫助,我認為我終於了解了問題的根源。

這里的主要問題是我沒有使用Docker,因為它原本可以正常工作。

另一個原因是fpm不是Web服務器,並且代理到它的唯一方法是通過fastcgi(或者不是唯一的方法,但是在這種情況下,簡單的proxy_pass不起作用)。

因此,正確的設置方法是:

  1. 將代碼卷安裝到兩個容器中。
  2. 通過fastcgi為PHP腳本配置fastcgi到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-compose和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提供服務。

我的default.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腳本到外部的cURL'ing,花了很長時間,甚至不確定如何調試。

暫無
暫無

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

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