কীভাবে সঠিকভাবে পিএইচপি-এফপিএম এবং এনগিনেক্স ডকার পাত্রে লিঙ্ক করবেন?


105

আমি 2 টি পৃথক পাত্রে লিঙ্ক দেওয়ার চেষ্টা করছি:

সমস্যাটি হ'ল পিএইচপি স্ক্রিপ্টগুলি কাজ করে না। সম্ভবত পিএইচপি-এফএমপি কনফিগারেশনটি ভুল। এখানে সোর্স কোডটি দেওয়া হয়েছে, যা আমার ভান্ডারে রয়েছে । ফাইলটি এখানে docker-compose.yml:

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

এবং Dockerfileযা আমি এনগিনেক্সের উপর ভিত্তি করে একটি কাস্টম চিত্র তৈরি করতে ব্যবহার করেছি:

FROM nginx

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

শেষ অবধি, এখানে আমার কাস্টম এনগিনেক্স ভার্চুয়াল হোস্ট কনফিগারেশন রয়েছে:

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;
    }
}

পিএইচপি স্ক্রিপ্টগুলি কার্যকর করতে কেউ কি আমাকে এই ধারকগুলি সঠিকভাবে কনফিগার করতে সহায়তা করতে পারে?

PS আমি এই জাতীয় ডকার-সুরকারকের মাধ্যমে পাত্রে চালাচ্ছি:

docker-compose up

প্রকল্পের রুট ডিরেক্টরি থেকে।


4
আপনি এখন পর্যন্ত কীভাবে এগুলি কনফিগার করার চেষ্টা করেছেন বা আপনি কোন কোড ব্যবহার করেছেন। অনুমান করার সময় আমি আবর্জনা করছি অনুগ্রহ করে আমাকে অনুমান করবেন না।
ম্যাথু ব্রাউন ওরফে লর্ড ম্যাট

4
@ ম্যাথেজব্রাউন হু, আমি আমার কোডটি গিটারহাবের পাবলিক ভান্ডারে রেখেছি এবং আমি মনে করি এটি যথেষ্ট হবে তবে আপনি ঠিক বলেছেন, আমার প্রশ্নেও এখানে কোড প্রদর্শন করা ভাল।
ভিক্টর বোচারস্কি

যখন চিত্রগুলি স্পিন হয়ে যায়, আপনি কি docker execচলমান ধারক এবং পিং এফপিএম-এ প্রবেশ করতে পারবেন ?
ভিনসেন্ট ডি স্মেট


4
পিএস আমি ভ্যাগ্র্যান্ট এবং উত্তরীয়দের সাথে লিঙ্ক করতে Nginxএবং PHP-FPMএকসাথে একটি কাজের সমাধান অর্জন করেছি । আপনি চাইলে আমার রেপো github.com/bocharsky-bw/vagrant-ansible- ডকার পরীক্ষা করুন ।
ভিক্টর বোচারস্কি

উত্তর:


33

Nginx কনফিগারেশনে কনটেইনারগুলির হার্ডকোড আইপি করবেন না, ডকার লিঙ্কটি কনটেইনারটির হোস্ট ফাইলটিতে লিঙ্কযুক্ত মেশিনের হোস্টনাম যুক্ত করে এবং আপনার হোস্টনামের মাধ্যমে পিং করতে সক্ষম হওয়া উচিত।

সম্পাদনা: ডকার ১.৯ নেটওয়ার্কিংয়ের জন্য আর আপনাকে ধারকগুলি লিঙ্ক করার দরকার নেই, যখন একাধিক পাত্রে একই নেটওয়ার্কের সাথে সংযুক্ত থাকে, তাদের হোস্ট ফাইলটি আপডেট হবে যাতে তারা হোস্ট-নেমে একে অপরের কাছে পৌঁছতে পারে।

প্রতিবার কোনও ডকারের ধারক একটি চিত্র থেকে স্পিন আপ করে (এমনকি কোনও বিদ্যমান ধারককে থামাতে / শুরু করা) পাত্রে ডকার হোস্ট দ্বারা নির্ধারিত নতুন আইপি পায়। এই আইপিগুলি আপনার প্রকৃত মেশিনগুলির মতো একই সাবনেটে নেই।

ডকার লিঙ্কিং ডক্স দেখুন (পটভূমিতে এটি রচনাটি ব্যবহার করে)

তবে docker-composeলিঙ্কগুলি এবং এক্সপোজে থাকা ডক্সে আরও স্পষ্টভাবে ব্যাখ্যা করা হয়েছে

লিঙ্কগুলি

links:
 - db
 - db:database
 - redis

উপনামের নামের সাথে একটি এন্ট্রি এই পরিষেবাটির জন্য ধারকগুলির ভিতরে / ইত্যাদি / হোস্টগুলিতে তৈরি করা হবে, যেমন:

172.17.2.186  db
172.17.2.186  database
172.17.2.187  redis

প্রকাশ করা

হোস্ট মেশিনে এগুলি প্রকাশ না করে পোর্টগুলি প্রকাশ করুন - তারা কেবল লিঙ্কযুক্ত পরিষেবাদিতে অ্যাক্সেসযোগ্য হবে । কেবল অভ্যন্তরীণ বন্দর নির্দিষ্ট করা যেতে পারে।

এবং যদি আপনি পরিবেশের ভেরিয়েবলের মাধ্যমে বন্দরগুলি + অন্যান্য শংসাপত্রগুলি পেতে আপনার প্রকল্পটি সেট আপ করেন তবে লিঙ্কগুলি স্বয়ংক্রিয়ভাবে সিস্টেম ভেরিয়েবলগুলির একটি গুচ্ছ সেট করে :

কোন পরিবেশে পরিবেশের ভেরিয়েবলগুলি উপলব্ধ তা দেখতে রান করুন docker-compose run SERVICE env

name_PORT

সম্পূর্ণ ইউআরএল, উদাহরণস্বরূপ DB_PORT = tcp: //172.17.0.5: 5432

name_PORT_num_protocol

সম্পূর্ণ ইউআরএল, যেমন DB_PORT_5432_TCP=tcp://172.17.0.5:5432

name_PORT_num_protocol_ADDR

ধারকটির আইপি ঠিকানা, যেমন 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


4
আপনার হোস্টে 9000 বন্দরটি প্রকাশ করার দরকার নেই, লিঙ্কযুক্ত ডকার পাত্রে পোর্টগুলি খোলা থাকে, যদি না আপনি আপনার হোস্ট থেকে সরাসরি পোর্টটির সমস্যা সমাধান করতে চান।
ভিনসেন্ট ডি স্মেট

ইয়াস, আপনি ঠিক বলেছেন, ধন্যবাদ। আমার ক্ষেত্রে আমার উচিত সরাসরি আইপি এর পরিবর্তে ফাস্টসিজি_পাস এফএম: 9000 ব্যবহার করা। আমি জানি না যে ডকার এটি স্বয়ংক্রিয়ভাবে হোস্ট করার জন্য যুক্ত করে, আমার খারাপ।
ভিক্টর বোচারস্কি

পোর্ট সম্পর্কে কী, তাই বন্দরগুলির পরিবর্তে এক্সপোজ ব্যবহার করা আরও ভাল ? বা আমি এই বন্দরগুলির কোনওটি ব্যবহার করতে পারি না এবং নির্দেশাবলী প্রকাশ করতে পারি না কারণ লিঙ্কযুক্ত পাত্রে এই বন্দরে অ্যাক্সেস থাকবে?
ভিক্টর বোচারস্কি

দেরী জবাবের জন্য দুঃখিত - আমি মনে করি আপনাকে এক্সপোজ ব্যবহারের প্রয়োজন হতে পারে, দুঃখিত আমি এখনই চেক করতে পারছি না
ভিনসেন্ট ডি স্মেট

4
--linksআপনার উল্লেখ করা ডকার ডকুমেন্টেশন অনুযায়ী এখন অপ্রচলিত। তারা এখনও করছে বর্তমানে সমর্থিত কিন্তু তাদের অচল হওয়ার জন্য আপাত পরিকল্পনা।
থেরোবাইওয়াক

88

আমি জানি এটি অত্যন্ত পুরানো পোস্ট, তবে আমার একই সমস্যা ছিল এবং আপনার কোডটি কেন কাজ করে না তা বুঝতে পারি না। অনেক পরীক্ষার পরে আমি কেন তা জানতে পেরেছি।

দেখে মনে হচ্ছে যে এফপিএম এনগিনেক্সের কাছ থেকে পুরো পাথ পেয়েছে এবং এফএমপি কনটেইনারগুলিতে ফাইলগুলি সন্ধান করার চেষ্টা করে, তাই এটি অবশ্যই ঠিক একই রকম হবে server.root এনজিঙ্ক্স কনফিগারের , যদিও এটি এনজিনেক্স ধারকটিতে বিদ্যমান না রয়েছে।

প্রদর্শন করার জন্যে:

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;
    }
}

ডকফেরফাইল

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

4
সাবাশ!!! ঠিক এটাই কথা! আমি /var/www/htmlব্যর্থতা ব্যতীত অন্য বিকল্প পথে এনজিন্সকে মূল সেট করেছি ।
আলফ্রেড হুয়াং

4
এছাড়াও, কেবল একটি নোট যা :9000পোর্টটি পাত্রে ব্যবহার করা হচ্ছে এটি আপনার হোস্টের কাছে প্রকাশিত নয়। এটি বের করতে আমাকে 2 ঘন্টা সময় নিয়েছে। আশা করি, আপনার দরকার নেই।
shriek

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

4
আপনার এখানে আসলে কোনও portsবিভাগ অন্তর্ভুক্ত করার দরকার নেই। আপনার exposeএটির প্রয়োজন হতে পারে যদি এটি ইমেজটিতে ইতিমধ্যে না থাকে (যা সম্ভবত এটি হয়)। আপনি যদি আন্ত-কন্টেইনার যোগাযোগ করছেন তবে আপনার পিএইচপি-এফপিএম পোর্টটি প্রকাশ করা উচিত নয়
দেখেন

সমাধানের সন্ধান AH01071: Got error 'Primary script unknown\n'করছিল এবং পিএইচপি-এফপিএম কনটেইনার একই ডিরেক্টরিটি ওয়েব নোডের সাথে ভাগ করে নিতে হত সমাধানটি!
সিটিপিএইচ

23

পূর্বে উল্লিখিত হিসাবে, সমস্যাটি ছিল যে ফাইলগুলি এফএমপি কনটেইনার দ্বারা দৃশ্যমান ছিল না। তবে ধারকগুলির মধ্যে ডেটা ভাগ করার জন্য প্রস্তাবিত প্যাটার্নটি কেবলমাত্র ডেটা পাত্রে ব্যবহার করা হয় ( এই নিবন্ধে ব্যাখ্যা হিসাবে )।

দীর্ঘ গল্প সংক্ষিপ্ত: একটি ধারক তৈরি করুন যা কেবলমাত্র আপনার ডেটা ধারণ করে, একটি ভলিউমের সাথে ভাগ করে এবং আপনার অ্যাপ্লিকেশনে এই ভলিউমের সাথে লিঙ্ক করে 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সাথে লিঙ্কযুক্ত একটি ভলিউম প্রকাশ করে । তারপর জন্য ডেটা সেবা, যে আপনার সোর্স কোড রয়েছে:nginxfpmDockerfile

FROM busybox

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

এবং Dockerfilenginx জন্য, যে কেবলমাত্র ডিফল্ট কনফিগার প্রতিস্থাপন:

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;
    }
}

যা কেবল নগ্নজকে ডকুমেন্ট রুট হিসাবে ভাগ করা ভলিউমটি ব্যবহার করতে বলেছে এবং এনজিএনএক্সের জন্য এফএমপি কনটেইনার (যেমন: ডান HOST:PORT, যা fpm:9000রচনা দ্বারা সংজ্ঞায়িত হোস্টনাম এবং ধন্যবাদ SCRIPT_FILENAME) এর সাথে যোগাযোগ করতে সক্ষম করার জন্য সঠিক কনফিগারেশন সেট করে ।


দেখে মনে হচ্ছে ডেটাটি হোস্ট থেকে পাত্রে আপডেট হয় না এবং আমি যখন ডকার পিএস -a করি তখন দেখি ডেটা ধারকটি বন্ধ হয়ে গেছে, এটি কি সমস্যা?
আফতাব নাভিদ

4
এটাই প্রত্যাশিত আচরণ। কেবলমাত্র একটি ডেটা-পাত্রে কোনও কমান্ড চালায় না এবং এটি কেবল বন্ধ হিসাবে তালিকাভুক্ত হবে। এছাড়াও, Dockerfileডেটা কনটেইনারটি আপনার উত্সগুলি নির্মাণের সময় ধারকটিতে অনুলিপি করছে। এজন্য আপনি হোস্টে ফাইলগুলি পরিবর্তন করলে সেগুলি আপডেট হবে না। আপনি যদি হোস্ট এবং ধারকটির মধ্যে উত্সগুলি ভাগ করতে চান তবে আপনাকে ডিরেক্টরিটি মাউন্ট করতে হবে। dataরচনা লোড করার জন্য রচনা ফাইলটিতে পরিষেবাটি পরিবর্তন করুন image: busyboxএবং volumesবিভাগটিতে প্রবেশ করুন ./sources:/var/www/html, যেখানে ./sourcesহোস্টে আপনার উত্সের পথ রয়েছে।
iKanor

17

নতুন উত্তর

ডকার রচনা আপডেট করা হয়েছে। তাদের এখন একটি সংস্করণ 2 ফাইল ফর্ম্যাট রয়েছে

সংস্করণ 2 ফাইলগুলি রচনা 1.6.0+ দ্বারা সমর্থিত এবং সংস্করণ 1.10.0+ এর একটি ডকার ইঞ্জিন প্রয়োজন।

তারা এখন ডকারের নেটওয়ার্কিং বৈশিষ্ট্যটিকে সমর্থন করে যা মাইপ_ডিফল্ট নামে একটি ডিফল্ট নেটওয়ার্ক সেট আপ করে

তাদের ডকুমেন্টেশন থেকে আপনার ফাইলটি নীচের মতো দেখতে পাবেন:

version: '2'

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

এই পাতাগুলি স্বয়ংক্রিয়ভাবে ডিফল্ট মাইএপ_ডিফল্ট নেটওয়ার্কে যুক্ত হওয়ায় তারা একে অপরের সাথে কথা বলতে সক্ষম হবে। তারপরে আপনি Nginx কনফিগারেশনে থাকবেন:

fastcgi_pass fpm:9000;

মন্তব্যগুলিতে @ পৃষ্ঠার দ্বারা উল্লিখিত হিসাবে পিএইচপি-এফপিএম 9000 পোর্টে শুনছে তা নিশ্চিত করতে ভুলবেন না, এটি আপনার /etc/php5/fpm/pool.d/www.confপ্রয়োজন যেখানে সম্পাদনা করে সম্পন্ন করা যেতে পারে listen = 9000

পুরানো উত্তর

যারা ডকার / ডকার রচনাটির পুরানো সংস্করণ ব্যবহার করছেন তাদের জন্য আমি নীচে এখানে রেখেছি এবং তথ্যটি জানতে চাই।

এই প্রশ্নের উত্তর খোঁজার চেষ্টা করার সময় আমি গুগলে এই প্রশ্নটি নিয়ে হোঁচট খেতে থাকি তবে ডকার-কমপোজ (যে লেখার সময় কেবল পরীক্ষামূলকভাবে সমর্থন করার জন্য এটি লেখার সময় কেবলমাত্র পরীক্ষার জন্য সমর্থন করেছিল) এর জন্য আমি কী খুঁজছিলাম / তা খুঁজে পেলাম না ডকার নেটওয়ার্কিং বৈশিষ্ট্য)। সুতরাং আমি যা শিখেছি তা গ্রহণ করা এখানে।

ডকার সম্প্রতি এর লিঙ্ক বৈশিষ্ট্যটিকে তার নেটওয়ার্ক বৈশিষ্ট্যের পক্ষে স্বীকৃতি দিয়েছে

সুতরাং ডকার নেটওয়ার্ক বৈশিষ্ট্যটি ব্যবহার করে আপনি এই পদক্ষেপগুলি অনুসরণ করে পাত্রে লিঙ্ক করতে পারেন। পূর্বে লিঙ্কযুক্ত দস্তাবেজগুলিতে বিকল্পগুলি সম্পর্কে পূর্ণ বিবরণের জন্য।

প্রথমে আপনার নেটওয়ার্ক তৈরি করুন

docker network create --driver bridge mynetwork

এরপরে আপনার পিএইচপি-এফপিএম ধারকটি চালান যা নিশ্চিত করে আপনি 9000 পোর্ট খোলেন এবং আপনার নতুন নেটওয়ার্কে ( mynetwork) নির্ধারণ করুন।

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

এখানে গুরুত্বপূর্ণ বিট --name php-fpm কমান্ডের শেষে যা নাম, আমাদের এটি পরে প্রয়োজন।

এরপরে আপনার এনগিনেক্স ধারকটি পুনরায় চালনা করুন আপনার তৈরি করা নেটওয়ার্কটি পুনরায় বরাদ্দ করুন।

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

পিএইচপি এবং এনগিনেক্স ধারকগুলির জন্য আপনি --volumes-fromপ্রয়োজন অনুসারে কমান্ড ইত্যাদিতেও যুক্ত করতে পারেন ।

এখন আসে এনগিনেক্স কনফিগারেশন। যা এর সাথে সাদৃশ্যপূর্ণ কিছু দেখাচ্ছে:

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;লোকেশন ব্লকে লক্ষ্য করুন । php-fpmপোর্টে যোগাযোগের ধারক বলছে 9000। আপনি যখন কোনও ডকার ব্রিজ নেটওয়ার্কে পাত্রে যুক্ত হন তারা সমস্ত স্বয়ংক্রিয়ভাবে একটি হোস্ট ফাইল আপডেট পায় যা তাদের আইপি ঠিকানার বিপরীতে তাদের ধারকটির নাম রাখে। সুতরাং যখন এনগিনেক্স দেখেন যে আপনি php-fpmআগে নামকরণ করেছেন এবং আপনার mynetworkডকার নেটওয়ার্কে নির্ধারিত পিএইচপি-এফপিএম ধারকটির সাথে যোগাযোগ করতে জানেন ।

আপনি আপনার ডকারের ধারক তৈরির প্রক্রিয়া চলাকালীন বা পরে এটি আপনার কাছে যোগ করতে পারেন N


এছাড়াও নিশ্চিত করতে মনে রাখবেন php-fpmবন্দর 9000. উপর শুনছে এই হবে listen = 9000মধ্যে /etc/php5/fpm/pool.d/www.conf
ট্রিফফেস

ধন্যবাদ @ ট্রিফেস ভাল পয়েন্ট। আমি আপনার মন্তব্য সঙ্গে আপডেট করেছি।
ডেভিডটি

8

পূর্ববর্তী উত্তরগুলির সমাধান যেমন হয়েছে, তবে খুব স্পষ্ট করে বলা উচিত: পিএইচপি কোডের পিএইচপি-এফপিএম কনটেইনারটিতে বাস করা দরকার, যখন স্থির ফাইলগুলি এনজিনেক্স ধারকটিতে বাস করা দরকার। সরলতার জন্য, বেশিরভাগ লোকেরা সমস্ত কোড দুটিই সংযুক্ত করে রেখেছেন, যেমন আমি নীচেও করেছি। ভবিষ্যতে যদি, আমি সম্ভবত আমার নিজস্ব প্রকল্পগুলিতে কোডের এই বিভিন্ন অংশগুলি আলাদা করব যাতে কোন পাত্রে কোন অংশে অ্যাক্সেস রয়েছে তা হ্রাস করতে হবে।

এই সর্বশেষ প্রকাশের সাথে নীচে আমার উদাহরণ ফাইলগুলি আপডেট করেছেন (আপনাকে ধন্যবাদ @ কালকালাইন)

এটি ডকার ২.০ ফরোয়ার্ডের ন্যূনতম সেটআপ বলে মনে হচ্ছে (কারণ ডকার ২.০ এ জিনিসগুলি অনেক সহজ হয়েছে)

ডকার-কমপোজ.আইএমএল:

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

( উপরের ডকার-রচনা.মিল আপডেট করেছেন : যে সাইটগুলিতে সিএসএস, জাভাস্ক্রিপ্ট, স্ট্যাটিক ফাইল ইত্যাদি রয়েছে, আপনার সেই ফাইলগুলি অ্যাক্সেসযোগ্য হবে। আমার বেস কোডটি সিএসএস, জেএস এবং পিএইচপি একটি অগোছালো মিশ্রণ, এই উদাহরণটি কেবল উভয় পাত্রে সমস্ত কোড সংযুক্ত করে)

একই ফোল্ডারে:

সাইট.কম:

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

4
আপনার এনজিএনএক্স কনফিগারেশন ফাইলটি ধরে নিয়েছে যে আপনার ওয়েবসাইটে কেবল পিএইচপি ফাইল রয়েছে। স্ট্যাটিক ফাইলগুলির জন্য একটি এনগিনেক্স লোকেশন রুল তৈরি করা (জেপিজি, টিএসটিএসটি, এসভিজি, ...) এবং পিএইচপি ইন্টারপ্রেটারকে এড়ানো সেরা অনুশীলন। সেক্ষেত্রে এনগিনেক্স এবং পিএইচপি উভয় ধারকই ওয়েবসাইট ফাইলগুলিতে অ্যাক্সেস প্রয়োজন। উপরের @IKanor এর উত্তর এটি যত্ন করে।
বার্নার্ড

ধন্যবাদ @ অ্যালকালাইন, স্থিতিশীল ফাইলগুলি আমার আসল উত্তরের সাথে সমস্যা। প্রকৃতপক্ষে, সঠিকভাবে কাজ করার জন্য কমপক্ষে কমপক্ষে সিএসএস এবং জেএস ফাইলগুলি অবশ্যই সেই মেশিনে স্থানীয় হওয়া দরকার n
ফিলিপ

7

আমি মনে করি আমাদের এফপিএম কনটেইনারটি ভলিউম দেওয়া দরকার, আমরা না? সুতরাং =>

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

যদি আমি এটি না করি তবে একটি অনুরোধ চালানোর সময় আমি এই ব্যতিক্রমটি ছুঁড়ে ফেলি, কারণ fpm অনুরোধকৃত ফাইলটি খুঁজে পায় না:

[ত্রুটি] 6 # 6: * 4 ফাস্টসিজি স্টার্ডারে প্রেরণ করা হয়েছে: "প্রাইমারি স্ক্রিপ্ট অজানা" আপস্ট্রি থেকে প্রতিক্রিয়া শিরোনাম পড়ার সময়, ক্লায়েন্ট: 172.17.42.1, সার্ভার: লোকালহোস্ট, অনুরোধ: "জিইটি / এইচটিটিপি / ১.১", আপস্ট্রিম: "ফাস্টসিজি : //172.17.0.81: 9000 ", হোস্ট:" লোকালহোস্ট "


4
হ্যাঁ তুমিই ঠিক! আমাদের অবশ্যই
এফএম

আমি কাজ নমুনা রয়েছে 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 use ব্যবহার করতে হয়েছিল, ধন্যবাদ
সাইমন ডেভিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.