ডকার + এনগিনেক্স + পিএইচপি-এফপিএম ব্যবহার করে স্থির সামগ্রী পরিবেশন করুন


10

আমি ডকার ব্যবহার করে একটি পিএইচপি ওয়েবপ্যাপ কনফিগার করার চেষ্টা করছি। ধারণাটি হ'ল php-fpmস্ট্যান্ডেলোন কনটেইনারে অ্যাপ্লিকেশনটি চালানো এবং আরও একটি ধারক রয়েছে যা এনজিনেক্স চলবে। এই সেটআপের জন্য ধারণাটি হ'ল একই মেশিনে ইতিমধ্যে কাজ করা অন্যান্য ওয়েব অ্যাপ্সের প্রক্সি অনুরোধগুলিতে সেই একই এনজিনেক্স ধারকটি ব্যবহার করা। সমস্যাটি হ'ল আমি nginxস্থির ফাইলগুলি (জেএসএস, সিএসএস, ইত্যাদি) যথাযথভাবে প্রক্রিয়া করতে পারছি না , তাদের অনুরোধগুলি যেমন চলছে fpm

ফাইল সিস্টেমটি দেখতে এটির মতো:

/
├── Makefile
├── config
│   └── webapp.config
└── webapp
    └── web
        ├── index.php
        └── static.js

আমি Makefileদেখতে পুরো জিনিসটি এটির মতো দেখতে ব্যবহার করছি (এর docker-composeজন্য আগ্রহী নয় ):

PWD:=$(shell pwd)
CONFIG:='/config'
WEBAPP:='/webapp'

run: | run-network run-webapp run-nginx

run-network:
    docker network create internal-net

run-webapp:
    docker run --rm \
    --name=webapp \
    --net=internal-net \
    --volume=$(PWD)$(WEBAPP):/var/www/webapp:ro \
    -p 9000:9000 \
    php:5.6.22-fpm-alpine

run-nginx:
    docker run --rm \
    --name=nginx \
    --net=internal-net \
    --volume=$(PWD)$(CONFIG)/webapp.conf:/etc/nginx/conf.d/webapp.domain.com.conf:ro \
    -p 80:80 \
    nginx:1.11.0-alpine

আমার config/webapp.confদেখতে দেখতে এটাই হয় ।

server {
    listen 80;
    server_name webapp.domain.com;

    # This is where the index.php file is located in the webapp container
    # This folder will contain an index.php file and some static files that should be accessed directly
    root /var/www/webapp/web;

    location / {
        try_files $uri $uri/ @webapp;
    }

    location @webapp {
        rewrite ^(.*)$ /index.php$1 last;
    }

    location ~ ^/index\.php(/|$) {
        include fastcgi_params;

        fastcgi_pass webapp:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
    }
}

এই index.phpফাইলটি ব্যবহার করে প্রক্রিয়াজাতকরণের যে কোনও ক্রিয়াকলাপ কাজ করবে। তবে স্ট্যাটিক ফাইলগুলি পরিবেশন করা হবে না, ফলে বাজে 404ত্রুটিগুলি ঘটবে (যেহেতু পিএইচপি ওয়েবপ্যাটে সত্যিই সেগুলির জন্য রুটগুলি কনফিগার করা হয়নি)। আমি বিশ্বাস করি যে এনজিএনেক্সগুলি সেগুলি তার নিজের ধারক ফাইল সিস্টেম থেকে লোড করার চেষ্টা করে, যখন তারা আসলে webappধারকটিতে থাকে, আবার ব্যর্থ হয় @webapp

nginxঅন্য ধারকগুলিতে থাকা ফাইলগুলি পরিবেশন করার জন্য কি আমি কনফিগার করতে পারি ?


3
আপনি কি পিপিএইচ অ্যাপ্লিকেশনগুলি থেকে এনজিনেক্সকে বিচ্ছিন্ন করার জন্য ডকার ব্যবহার করছেন যখন পিটিএইচপি অ্যাপ্লিকেশনগুলির মধ্যে এনগিনেক্সের অ্যাক্সেস রয়েছে?
স্টিফান শমিয়েডল

আমি নিশ্চিত না যে আমি আপনার মন্তব্য বুঝেছি ... আমি আমার অবকাঠামো পরিচালনা করতে ডকার ব্যবহার করছি। তবে, আমি nginxপিএইচপি অ্যাপ্লিকেশনটির মধ্যে অনুরোধ ফাইলগুলি তৈরি করছি না , আমি এটি fpmকরতে প্রক্স করছি এবং আমার nginxস্ট্যাটিক নন-পিএইচপি ফাইল অ্যাক্সেস করতে হবে।
এইআইসিরিকো

ফাইলগুলি "অন্য পাত্রে থাকে", অর্থাত্ এনগিনেক্সগুলি সেগুলি দেখতে পাবে না তাইনা?
স্টিফান শমিডেল

এটি ঠিক @ স্টেফান, তারা কেবল webappপাত্রে ভলিউম হিসাবে মাউন্ট করবে, nginxএকটিতে নয়।
এইসিরিকো

উত্তর:


1

আমি ধারকটিতে webappভলিউম মাউন্ট করে সমস্যার সমাধান করতে পেরেছি nginx। এই কি run-nginxকাজ এখন মনে হচ্ছে:

run-nginx:
    docker run --rm \
    --name=nginx \
    --net=internal-net \
    --volume=$(PWD)$(CONFIG)/webapp.conf:/etc/nginx/conf.d/webapp.domain.com.conf:ro \
    --volume=$(PWD)$(WEBAPP)/web:/var/www/webapp/web:ro \
    -p 80:80 \
    nginx:1.11.0-alpine

এবং এই webapp.confফাইলটি, এটি পাত্রে স্ট্যাটিক ফাইলগুলি লোড করার চেষ্টা করবে এবং যদি এটি সম্ভব না হয় তবে fpmকর্মীর কাছে অনুরোধটির প্রক্সি করবে :

server {
    listen 80;
    server_name webapp.domain.com;

    root /var/www/webapp/web;

    location ~ \.(js|css|png) {
        try_files $uri $uri/;
    }

    location / {
        rewrite ^(.*)$ /index.php$1 last;
    }

    location ~ ^/index\.php(/|$) {
        include fastcgi_params;

        fastcgi_pass webapp:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
    }
}

তবে, আমি এটি জানতে চাই যে একই ভলিউম দু'বার ভাগ না করে এর থেকে আরও ভাল উপায় আছে কিনা। অনেক ধন্যবাদ!


4
আপনার আলাদা আলাদা পাত্রে nginx এবং পিএইচপি পৃথকীকরণ দেওয়া, আমি মনে করি না। আপনার দুটি পৃথক স্থানে ডেটা প্রয়োজন, আপনাকে এটি দুটিবার সরবরাহ করতে হবে। আমি খুব কৌতূহলী, কেউ যদি আরও ভাল ধারণা নিয়ে আসে।
স্টেফান শমিয়েডল

0

হয়তো এটি এনএফএস ব্যবহার করে অর্জন করা যেতে পারে

এনএফএসে চলমান একটি ডকার কনটেইনারটি তৈরি করা যেতে পারে যেখানে কোডটি থাকে, যা এনগিনেক্স এবং পিএইচপি চালিত পাত্রে যুক্ত হতে পারে। ফাইলগুলি কেবল একটি পাত্রে সংরক্ষণ করা হবে। এটি পাশাপাশি বিচ্ছিন্নতার আরও একটি স্তর সরবরাহ করতে পারে।


0

আমার কাছে দুটি প্রস্তাবিত বিকল্প রয়েছে: প্রথমটি হ'ল আপনার স্থিতিশীল সম্পদগুলিকে উদাহরণস্বরূপ / স্থিতিশীল করে রাখা এবং সেইগুলির জন্য একটি ভিন্ন ব্যাকএন্ড পরিষেবা কল করার জন্য এনজিনেক্সকে নির্দেশ দেওয়া। পদক্ষেপ:

1) কোনও স্থিতিশীল সম্পদের জন্য আপনার ওয়েবসাইটগুলিকে / স্থির / * নির্দেশ করতে আপডেট করুন, সুতরাং যেমন / স্টাইলস সিএসএস / স্ট্যাটিক / স্টাইলস সিএসএস হয়

২) আপনার সম্পদগুলি হয় অন্য কোনও এনগিনেক্স দ্বারা পরিবেশন করা পৃথক ধারক পাত্রে রাখুন (যাতে আপনি বেশ কয়েকটি সাইটের জন্য ধারকটি পুনরায় ব্যবহার করতে পারেন)

3) নতুন পাত্রে / স্থিতিশীল / * তে সমস্ত অনুরোধগুলি প্রেরণের জন্য nginx.conf সম্পাদনা করুন:

location /static/ {
   proxy_pass http://static-container;
}

দ্বিতীয় বিকল্পটি হ'ল আপনার স্থিতিশীল সম্পদগুলিকে কেবল একটি সিডিএন-তে স্থানান্তরিত করা, সুতরাং আপনাকে / স্টাইলস CSS এর পরিবর্তে প্রতিটি স্ট্যাটিক সম্পদ কোনও বাহ্যিক URL ( https: //cdnwebsite/asdsadasda/styles.css বা লোড করতে আপনার ওয়েবসাইট আপডেট করতে হবে) /static/styles.css)

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.