วิธีเชื่อมโยงคอนเทนเนอร์ php-fpm และ Nginx Docker อย่างถูกต้อง?


105

ฉันกำลังพยายามเชื่อมโยง 2 คอนเทนเนอร์แยกกัน:

ปัญหาคือสคริปต์ php ไม่ทำงาน บางทีการกำหนดค่า php-fpm ไม่ถูกต้อง นี่คือรหัสแหล่งที่มาซึ่งอยู่ในของฉันพื้นที่เก็บข้อมูล นี่คือไฟล์docker-compose.yml:

nginx:
    build: .
    ports:
        - "80:80"
        - "443:443"
    volumes:
        - ./:/var/www/test/
    links:
        - fpm
fpm:
    image: php:fpm
    ports:
        - "9000:9000"

และDockerfileสิ่งที่ฉันใช้ในการสร้างอิมเมจที่กำหนดเองตาม nginx one:

FROM nginx

# Change Nginx config here...
RUN rm /etc/nginx/conf.d/default.conf
ADD ./default.conf /etc/nginx/conf.d/

สุดท้ายนี่คือการกำหนดค่าโฮสต์เสมือน Nginx ที่กำหนดเองของฉัน:

server {
    listen  80;

    server_name localhost;
    root /var/www/test;

    error_log /var/log/nginx/localhost.error.log;
    access_log /var/log/nginx/localhost.access.log;

    location / {
        # try to serve file directly, fallback to app.php
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/.+\.php(/|$) {
        fastcgi_pass 192.168.59.103:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
    }
}

ใครช่วยฉันกำหนดค่าคอนเทนเนอร์เหล่านี้ให้ถูกต้องเพื่อเรียกใช้สคริปต์ php ได้ไหม

ป.ล. ฉันเรียกใช้คอนเทนเนอร์ผ่านนักเทียบท่านักแต่งเพลงดังนี้:

docker-compose up

จากไดเร็กทอรี root ของโปรเจ็กต์


1
คุณพยายามกำหนดค่าอย่างไรจนถึงตอนนี้หรือคุณใช้รหัสอะไร โปรดอย่าทำให้ฉันเดาว่าฉันเป็นขยะที่ต้องเดา
Matthew Brown หรือที่รู้จักกันในชื่อ Lord Matt

1
@MatthewBrown หึฉันใส่รหัสของฉันลงในที่เก็บสาธารณะบน GitHubและคิดว่ามันจะเพียงพอ แต่คุณพูดถูกดีกว่าที่จะแสดงรหัสที่นี่ในคำถามของฉันด้วย
Victor Bocharsky

เมื่อภาพหมุนขึ้นคุณสามารถdocker execเข้าไปในคอนเทนเนอร์ที่กำลังทำงานอยู่และ ping fpm ได้หรือไม่?
Vincent De Smet

1
@MatthewBrown ใช่ฉันชนะแล้วขอบคุณ
Victor Bocharsky

1
ป.ล.ฉันยังประสบความสำเร็จในการแก้ปัญหาในการเชื่อมโยงNginxและPHP-FPM ร่วมกับ Vagrant และ Ansible ตรวจสอบ repo github.com/bocharsky-bw/vagrant-ansible-dockerของฉันหากคุณต้องการ
Victor Bocharsky

คำตอบ:


33

อย่าฮาร์ดโค้ด ip ของคอนเทนเนอร์ในการกำหนดค่า nginx ลิงก์นักเทียบท่าจะเพิ่มชื่อโฮสต์ของเครื่องที่เชื่อมโยงไปยังไฟล์โฮสต์ของคอนเทนเนอร์และคุณควรจะ ping ตามชื่อโฮสต์ได้

แก้ไข: Docker 1.9 Networking ไม่ต้องการให้คุณเชื่อมโยงคอนเทนเนอร์อีกต่อไปเมื่อหลายคอนเทนเนอร์เชื่อมต่อกับเครือข่ายเดียวกันไฟล์โฮสต์ของพวกเขาจะได้รับการอัปเดตเพื่อให้สามารถเข้าถึงกันได้ด้วยชื่อโฮสต์

ทุกครั้งที่คอนเทนเนอร์นักเทียบท่าหมุนขึ้นจากอิมเมจ (แม้กระทั่งหยุด / เริ่มต้นคอนเทนเนอร์ที่มีอยู่) คอนเทนเนอร์จะได้รับไอพีใหม่ที่โฮสต์นักเทียบท่ากำหนด ip เหล่านี้ไม่ได้อยู่ในเครือข่ายย่อยเดียวกันกับเครื่องจริงของคุณ

ดูเอกสารการเชื่อมโยงนักเทียบท่า (นี่คือสิ่งที่ใช้ในการเขียนในพื้นหลัง)

แต่อธิบายชัดเจนกว่าในdocker-composeเอกสารเกี่ยวกับลิงก์ & เปิดเผย

ลิงค์

links:
 - db
 - db:database
 - redis

รายการที่มีชื่อแทนจะถูกสร้างขึ้นใน / etc / hosts ภายในคอนเทนเนอร์สำหรับบริการนี้เช่น:

172.17.2.186  db
172.17.2.186  database
172.17.2.187  redis

เปิดเผย

เปิดเผยพอร์ตโดยไม่ต้องเผยแพร่ไปยังเครื่องโฮสต์ - พวกเขาเท่านั้นที่จะสามารถเข้าถึงการบริการที่เชื่อมโยง สามารถระบุได้เฉพาะพอร์ตภายในเท่านั้น

และหากคุณตั้งค่าโครงการของคุณเพื่อรับพอร์ต + ข้อมูลรับรองอื่น ๆ ผ่านตัวแปรสภาพแวดล้อมลิงก์จะตั้งค่าตัวแปรระบบจำนวนมากโดยอัตโนมัติ :

docker-compose run SERVICE envหากต้องการดูว่าตัวแปรสภาพแวดล้อมที่มีอยู่ให้บริการวิ่ง

name_PORT

URL แบบเต็มเช่น DB_PORT = tcp: //172.17.0.5: 5432

name_PORT_num_protocol

URL แบบเต็มเช่น DB_PORT_5432_TCP=tcp://172.17.0.5:5432

name_PORT_num_protocol_ADDR

ที่อยู่ IP ของคอนเทนเนอร์เช่น DB_PORT_5432_TCP_ADDR=172.17.0.5

name_PORT_num_protocol_PORT

หมายเลขพอร์ตที่เปิดเผยเช่น DB_PORT_5432_TCP_PORT=5432

name_PORT_num_protocol_PROTO

โปรโตคอล (tcp หรือ udp) เช่น DB_PORT_5432_TCP_PROTO=tcp

name_NAME

ชื่อคอนเทนเนอร์ที่มีคุณสมบัติครบถ้วนเช่น DB_1_NAME=/myapp_web_1/myapp_db_1


2
คุณไม่จำเป็นต้องเผยแพร่พอร์ต 9000 บนโฮสต์พอร์ตจะเปิดระหว่างคอนเทนเนอร์นักเทียบท่าที่เชื่อมโยงเว้นแต่คุณต้องการแก้ไขปัญหาพอร์ตโดยตรงจากโฮสต์ของคุณ
Vincent De Smet

ใช่คุณพูดถูกขอบคุณ ในกรณีของฉันฉันควรใช้fastcgi_pass fpm: 9000แทน direct ip ฉันไม่รู้ว่า Docker เพิ่มไปยังโฮสต์โดยอัตโนมัติฉันไม่ดี
Victor Bocharsky

แล้วพอร์ตล่ะจะดีกว่าที่จะใช้exposeแทนพอร์ต ? หรือฉันไม่สามารถใช้พอร์ตนี้และแสดงคำสั่งได้เนื่องจากคอนเทนเนอร์ที่เชื่อมโยงจะสามารถเข้าถึงพอร์ตนี้ได้?
Victor Bocharsky

ขออภัยที่ตอบช้า - ฉันคิดว่าคุณอาจต้องใช้ expose ขอโทษตอนนี้ตรวจสอบไม่ได้
Vincent De Smet

3
--linksตอนนี้ล้าสมัยแล้วตามเอกสารนักเทียบท่าที่คุณอ้างอิง พวกเขายังคงได้รับการสนับสนุนในขณะนี้แต่แผนชัดเจนสำหรับพวกเขาที่จะล้าสมัย
therobyouknow

86

ฉันรู้ว่ามันเป็นโพสต์เก่า ๆ แต่ฉันมีปัญหาเดียวกันและไม่เข้าใจว่าทำไมโค้ดของคุณถึงใช้ไม่ได้ หลังจากการทดสอบมากมายฉันพบว่าทำไม

ดูเหมือนว่า fpm ได้รับเส้นทางแบบเต็มจาก nginx และพยายามค้นหาไฟล์ในคอนเทนเนอร์ fpm ดังนั้นจึงต้องเหมือนกับserver.rootในการกำหนดค่า nginx แม้ว่าจะไม่มีอยู่ในคอนเทนเนอร์ nginx ก็ตาม

เพื่อแสดงให้เห็น:

docker-compose.yml

nginx:
    build: .
    ports:
        - "80:80"
    links:
        - fpm
fpm:
    image: php:fpm
    ports:
        - ":9000"

    # seems like fpm receives the full path from nginx
    # and tries to find the files in this dock, so it must
    # be the same as nginx.root
    volumes:
        - ./:/complex/path/to/files/

/etc/nginx/conf.d/default.conf

server {
    listen  80;

    # this path MUST be exactly as docker-compose.fpm.volumes,
    # even if it doesn't exist in this dock.
    root /complex/path/to/files;

    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/.+\.php(/|$) {
        fastcgi_pass fpm:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Dockerfile

FROM nginx:latest
COPY ./default.conf /etc/nginx/conf.d/

4
ทำได้ดี!!! นั่นคือประเด็น! ฉันตั้งค่ารูท nginx เป็นเส้นทางอื่นที่ไม่ใช่/var/www/htmlด้วยความล้มเหลว
Alfred Huang

3
นอกจากนี้โปรดทราบว่า:9000เป็นพอร์ตที่ใช้ในคอนเทนเนอร์ไม่ใช่พอร์ตที่สัมผัสกับโฮสต์ของคุณ ฉันใช้เวลา 2 ชั่วโมงในการคิดออก หวังว่าคุณไม่จำเป็นต้อง
shriek

1
services.fpm.ports is invalid: Invalid port ":9000", should be [[remote_ip:]remote_port[-remote_port]:]port[/protocol]
030

4
คุณไม่จำเป็นต้องรวมportsส่วนใดส่วนหนึ่งไว้ที่นี่ คุณอาจจำเป็นต้องexposeใช้หากยังไม่ได้อยู่ในภาพ (ซึ่งอาจเป็น) หากคุณกำลังทำการสื่อสารระหว่างคอนเทนเนอร์คุณไม่ควรเปิดเผยพอร์ต PHP-FPM
ผู้เห็น

กำลังมองหาวิธีแก้ปัญหาAH01071: Got error 'Primary script unknown\n'และคอนเทนเนอร์ php-fpm ต้องแชร์ไดเร็กทอรีเดียวกันกับเว็บโหนดเป็นทางออก!
cptPH

23

ตามที่ระบุไว้ก่อนหน้านี้ปัญหาคือไฟล์ไม่สามารถมองเห็นได้จากที่เก็บ fpm อย่างไรก็ตามในการแชร์ข้อมูลระหว่างคอนเทนเนอร์รูปแบบที่แนะนำคือการใช้คอนเทนเนอร์ข้อมูลเท่านั้น (ตามที่อธิบายไว้ในบทความนี้ )

ยาวสั้นเรื่อง: volumes_fromสร้างคอนเทนเนอร์ที่เพิ่งเก็บข้อมูลของคุณร่วมกับไดรฟ์และเชื่อมโยงปริมาณนี้ในปพลิเคชันของคุณด้วย

เมื่อใช้การเขียน (1.6.2 ในเครื่องของฉัน) docker-compose.ymlไฟล์จะอ่าน:

version: "2"
services:
  nginx:
    build:
      context: .
      dockerfile: nginx/Dockerfile
    ports:
      - "80:80"
    links:
      - fpm
    volumes_from:
      - data
  fpm:
    image: php:fpm
    volumes_from:
      - data
  data:
    build:
      context: .
      dockerfile: data/Dockerfile
    volumes:
      - /var/www/html

โปรดทราบว่าdataเผยแพร่ไดรฟ์ข้อมูลที่เชื่อมโยงกับnginxและfpmบริการ จากนั้นDockerfileสำหรับบริการข้อมูลที่มีซอร์สโค้ดของคุณ:

FROM busybox

# content
ADD path/to/source /var/www/html

และDockerfileสำหรับ nginx นั้นแทนที่การกำหนดค่าเริ่มต้น:

FROM nginx

# config
ADD config/default.conf /etc/nginx/conf.d

เพื่อความสมบูรณ์นี่คือไฟล์กำหนดค่าที่จำเป็นสำหรับตัวอย่างในการทำงาน:

server {
    listen 0.0.0.0:80;

    root /var/www/html;

    location / {
        index index.php index.html;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass fpm:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    }
}

ซึ่งบอกให้ nginx ใช้โวลุ่มที่ใช้ร่วมกันเป็นรูทเอกสารและตั้งค่าการกำหนดค่าที่เหมาะสมสำหรับ nginx เพื่อให้สามารถสื่อสารกับคอนเทนเนอร์ fpm ได้ (เช่น: ทางขวาHOST:PORTซึ่งfpm:9000ต้องขอบคุณชื่อโฮสต์ที่กำหนดโดยการเขียนและSCRIPT_FILENAME)


ดูเหมือนว่าข้อมูลจะไม่ได้รับการอัปเดตจากโฮสต์ไปยังคอนเทนเนอร์และเมื่อฉันทำการเทียบท่า ps -a ฉันเห็นที่เก็บข้อมูลหยุดทำงานนั่นเป็นปัญหาหรือไม่
Aftab Naveed

2
นั่นคือพฤติกรรมที่คาดหวัง คอนเทนเนอร์ข้อมูลอย่างเดียวไม่เรียกใช้คำสั่งใด ๆ และจะแสดงรายการว่าหยุดทำงาน นอกจากนี้Dockerfileที่เก็บข้อมูลกำลังคัดลอกแหล่งที่มาของคุณไปยังคอนเทนเนอร์ตามเวลาสร้าง นั่นคือเหตุผลที่พวกเขาจะไม่ได้รับการอัปเดตหากคุณเปลี่ยนไฟล์ในโฮสต์ หากคุณต้องการแชร์แหล่งที่มาระหว่างโฮสต์และคอนเทนเนอร์คุณต้องต่อเชื่อมไดเร็กทอรี เปลี่ยนdataบริการในแฟ้มการเขียนภาระimage: busyboxและในvolumesส่วนป้อน./sources:/var/www/htmlที่./sourcesเป็นเส้นทางไปยังแหล่งที่มาของคุณในโฮสต์
iKanor

17

คำตอบใหม่

อัปเดต Docker Compose แล้ว ตอนนี้มีรูปแบบไฟล์เวอร์ชัน 2แล้ว

ไฟล์เวอร์ชัน 2 ได้รับการสนับสนุนโดย Compose 1.6.0+ และต้องใช้ Docker Engine เวอร์ชัน 1.10.0+

ตอนนี้พวกเขาสนับสนุนคุณสมบัติเครือข่ายของ Docker ซึ่งเมื่อเรียกใช้จะตั้งค่าเครือข่ายเริ่มต้นที่เรียกว่าmyapp_default

จากเอกสารของพวกเขาไฟล์ของคุณจะมีลักษณะดังนี้:

version: '2'

services:
  web:
    build: .
    ports:
      - "8000:8000"
  fpm:
    image: phpfpm
  nginx
    image: nginx

เนื่องจากคอนเทนเนอร์เหล่านี้ถูกเพิ่มลงในเครือข่ายmyapp_defaultเริ่มต้นโดยอัตโนมัติพวกเขาจึงสามารถพูดคุยกันได้ จากนั้นคุณจะมีในการกำหนดค่า Nginx:

fastcgi_pass fpm:9000;

นอกจากนี้ยังเป็นที่กล่าวถึงโดย @treeface ในความคิดเห็นที่จำได้ว่าเพื่อให้แน่ใจว่า PHP-FPM ฟังพอร์ต 9000 นี้สามารถทำได้โดยการแก้ไขที่คุณจะต้อง/etc/php5/fpm/pool.d/www.conflisten = 9000

คำตอบเก่า

ฉันเก็บข้อมูลด้านล่างไว้ที่นี่สำหรับผู้ที่ใช้ Docker / Docker รุ่นเก่าเขียนและต้องการข้อมูล

ฉันยังคงสะดุดกับคำถามนี้ใน Google เมื่อพยายามหาคำตอบสำหรับคำถามนี้ แต่มันก็ไม่ใช่สิ่งที่ฉันกำลังมองหาเนื่องจาก Q / A เน้นเรื่องนักเทียบท่า (ซึ่งในขณะที่เขียนมีเพียงการสนับสนุนการทดลองสำหรับ คุณสมบัติเครือข่ายนักเทียบท่า) นี่คือสิ่งที่ฉันได้เรียนรู้

เมื่อเร็ว ๆ นี้นักเทียบท่าได้เลิกใช้งานคุณลักษณะการเชื่อมโยงเพื่อสนับสนุนคุณลักษณะเครือข่าย

ดังนั้นการใช้คุณสมบัติ Docker Networks คุณสามารถเชื่อมโยงคอนเทนเนอร์ได้โดยทำตามขั้นตอนเหล่านี้ สำหรับคำอธิบายทั้งหมดเกี่ยวกับตัวเลือกต่างๆให้อ่านในเอกสารที่ลิงก์ไว้ก่อนหน้านี้

ก่อนอื่นให้สร้างเครือข่ายของคุณ

docker network create --driver bridge mynetwork

จากนั้นเรียกใช้คอนเทนเนอร์ PHP-FPM ของคุณเพื่อให้แน่ใจว่าคุณเปิดพอร์ต 9000 และกำหนดให้กับเครือข่ายใหม่ของคุณ ( mynetwork)

docker run -d -p 9000 --net mynetwork --name php-fpm php:fpm

บิตที่สำคัญที่นี่คือ --name php-fpmท้ายคำสั่งซึ่งเป็นชื่อเราจะต้องใช้ในภายหลัง

จากนั้นเรียกใช้คอนเทนเนอร์ Nginx ของคุณอีกครั้งกำหนดให้กับเครือข่ายที่คุณสร้างขึ้น

docker run --net mynetwork --name nginx -d -p 80:80 nginx:latest

สำหรับคอนเทนเนอร์ PHP และ Nginx คุณสามารถเพิ่มได้ --volumes-fromคำสั่งและอื่น ๆ ได้ตามต้องการ

ตอนนี้การกำหนดค่า Nginx มาแล้ว ซึ่งควรมีลักษณะคล้ายกับสิ่งนี้:

server {
    listen 80;
    server_name localhost;

    root /path/to/my/webroot;

    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php-fpm:9000; 
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

สังเกตfastcgi_pass php-fpm:9000;ในบล็อกสถานที่ นั่นคือการบอกว่า contact container php-fpmบนพอร์ต 9000เมื่อคุณเพิ่มคอนเทนเนอร์ลงในเครือข่าย Docker bridge พวกเขาทั้งหมดจะได้รับการอัปเดตไฟล์โฮสต์โดยอัตโนมัติซึ่งทำให้ชื่อคอนเทนเนอร์เทียบกับที่อยู่ IP ดังนั้นเมื่อ Nginx เห็นว่าจะติดต่อกับคอนเทนเนอร์ PHP-FPM ที่คุณตั้งชื่อphp-fpmไว้ก่อนหน้านี้และกำหนดให้กับmynetworkเครือข่าย Docker ของคุณ

คุณสามารถเพิ่มการกำหนดค่า Nginx นั้นได้ในระหว่างขั้นตอนการสร้างคอนเทนเนอร์ Docker ของคุณหรือหลังจากนั้นขึ้นอยู่กับคุณ


อย่าลืมตรวจสอบให้แน่ใจว่าphp-fpmกำลังฟังอยู่บนพอร์ต 9000 ซึ่งจะอยู่listen = 9000ใน/etc/php5/fpm/pool.d/www.conf.
treeface

ขอบคุณ @treeface จุดดี ฉันได้อัปเดตตามความคิดเห็นของคุณแล้ว
DavidT

8

ตามที่คำตอบก่อนหน้านี้ได้รับการแก้ไขแล้ว แต่ควรระบุไว้อย่างชัดเจน: โค้ด php ต้องอยู่ในคอนเทนเนอร์ php-fpm ในขณะที่ไฟล์คงที่ต้องอยู่ในคอนเทนเนอร์ nginx เพื่อความง่ายคนส่วนใหญ่เพิ่งแนบรหัสทั้งหมดกับทั้งสองอย่างตามที่ฉันได้ทำไว้ด้านล่าง หากในอนาคตฉันจะแยกส่วนต่างๆของโค้ดออกจากโครงการของตัวเองเพื่อลดคอนเทนเนอร์ที่เข้าถึงส่วนใดให้เหลือน้อยที่สุด

อัปเดตไฟล์ตัวอย่างของฉันด้านล่างด้วยการเปิดเผยล่าสุดนี้ (ขอบคุณ @alkaline)

ดูเหมือนว่าจะเป็นการตั้งค่าขั้นต่ำสำหรับ docker 2.0 ไปข้างหน้า (เพราะสิ่งต่าง ๆ ทำได้ง่ายขึ้นมากใน docker 2.0)

นักเทียบท่า - compose.yml:

version: '2'
services:
  php:
    container_name: test-php
    image: php:fpm
    volumes:
      - ./code:/var/www/html/site
  nginx:
    container_name: test-nginx
    image: nginx:latest
    volumes:
      - ./code:/var/www/html/site
      - ./site.conf:/etc/nginx/conf.d/site.conf:ro
    ports:
      - 80:80

( อัปเดต docker-compose.yml ด้านบน : สำหรับไซต์ที่มี css, javascript, ไฟล์คงที่ ฯลฯ คุณจะต้องมีไฟล์เหล่านั้นที่เข้าถึงได้ไปยังคอนเทนเนอร์ nginx ในขณะที่ยังคงมีโค้ด php ทั้งหมดที่เข้าถึงได้ในคอนเทนเนอร์ fpm อีกครั้งเนื่องจาก รหัสพื้นฐานของฉันคือการผสม css, js และ php ที่ยุ่งเหยิงตัวอย่างนี้เพียงแค่แนบรหัสทั้งหมดกับทั้งสองคอนเทนเนอร์)

ในโฟลเดอร์เดียวกัน:

site.conf:

server
{
    listen   80;
    server_name site.local.[YOUR URL].com;

    root /var/www/html/site;
    index index.php;

    location /
    {
        try_files $uri =404;
    }

    location ~ \.php$ {
        fastcgi_pass   test-php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

ในรหัสโฟลเดอร์:

./code/index.php:

<?php
phpinfo();

และอย่าลืมอัปเดตไฟล์โฮสต์ของคุณ:

127.0.0.1 site.local.[YOUR URL].com

และเรียกใช้นักเทียบท่าของคุณเขียนขึ้น

$docker-compose up -d

และลองใช้ URL จากเบราว์เซอร์ที่คุณชื่นชอบ

site.local.[YOUR URL].com/index.php

1
ไฟล์กำหนดค่า nginx ของคุณถือว่าเว็บไซต์ของคุณมีเฉพาะไฟล์ php แนวทางปฏิบัติที่ดีที่สุดในการสร้างกฎตำแหน่ง nginx สำหรับไฟล์แบบคงที่ (jpg, txt, svg, ... ) และหลีกเลี่ยงตัวแปล php ในกรณีนั้นทั้งคอนเทนเนอร์ nginx และ php จำเป็นต้องเข้าถึงไฟล์เว็บไซต์ คำตอบของ @iKanor ข้างต้นดูแลเรื่องนั้น
เบอร์นาร์ด

ขอบคุณ @Alkaline ไฟล์คงมีปัญหากับคำตอบเดิมของฉัน ในความเป็นจริง nginx ต้องการไฟล์ css และ js เป็นอย่างน้อยในเครื่องนั้นเพื่อให้ทำงานได้อย่างถูกต้อง
Phillip

7

ฉันคิดว่าเราต้องให้ปริมาตรคอนเทนเนอร์ fpm ด้วยใช่ไหม ดังนั้น =>

fpm:
    image: php:fpm
    volumes:
        - ./:/var/www/test/

หากฉันไม่ทำเช่นนี้ฉันพบข้อยกเว้นนี้เมื่อเริ่มการร้องขอเนื่องจาก fpm ไม่พบไฟล์ที่ร้องขอ:

[ข้อผิดพลาด] 6 # 6: * 4 FastCGI ส่งใน stderr: "ไม่ทราบสคริปต์หลัก" ขณะอ่านส่วนหัวการตอบกลับจากต้นน้ำไคลเอนต์: 172.17.42.1, เซิร์ฟเวอร์: localhost, คำขอ: "GET / HTTP / 1.1", อัปสตรีม: "fastcgi : //172.17.0.81: 9000 ", โฮสต์:" localhost "


1
ใช่คุณถูก! เราต้องแชร์ไฟล์กับ fpm และ nginx
Victor Bocharsky

ผมมีตัวอย่างการทำงานด้วยNginxและPHP-FPMบนGitHub
วิคเตอร์ Bocharsky

1

สำหรับใครที่ได้รับ

ข้อผิดพลาด Nginx 403: ไม่อนุญาตให้ใช้ดัชนีไดเร็กทอรีของ [โฟลเดอร์]

เมื่อใช้งานindex.phpในขณะที่index.htmlทำงานได้อย่างสมบูรณ์และรวมอยู่index.phpในดัชนีในบล็อกเซิร์ฟเวอร์ของการกำหนดค่าไซต์ในsites-enabled

server {
    listen 80;

    # this path MUST be exactly as docker-compose php volumes
    root /usr/share/nginx/html;

    index index.php

    ...
}

ตรวจสอบให้แน่ใจว่าไฟล์ nginx.conf ของคุณ/etc/nginx/nginx.confโหลดการกำหนดค่าไซต์ของคุณในhttpบล็อก ...

http {

    ...

    include /etc/nginx/conf.d/*.conf;

    # Load our websites config 
    include /etc/nginx/sites-enabled/*;
}

ขอบคุณสำหรับสิ่งนี้เก่า แต่ยังให้ข้อมูลฉันต้องใช้ / usr / share / nginx / html 👍ขอบคุณ
Simon Davies
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.