Nginx একাধিক অবস্থানের সমস্যা


15

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

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

আমি যে কাঠামো পেয়েছি তা হ'ল:

/ ইত্যাদি / এনগিনেক্স / সাইটগুলি সক্ষম / মূল_সাইট, এখানে, সার্ভার_নাম এবং লগগুলি ছাড়াও আমি পেয়েছি include /etc/nginx/subsites-enabled/*, যেখানে আমি প্রতিটি অ্যাপ্লিকেশনের জন্য একটি করে কনফিগারেশন ফাইল পেয়েছি।

3 টি কনফিগার ফাইলের প্রত্যেকটিতে একটি অবস্থানের ব্লক থাকে।

আমি রেজেজেগে নেতিবাচক চেহারা দেখার চেষ্টা করেছি (মূলত অন্যান্য অ্যাপ্লিকেশনগুলি হ্যান্ডল করে থাকা ইউআরএলগুলিকে হার্ডকোড দেওয়ার চেষ্টা করে) তবে ব্যর্থ হয়েছিল।

সুতরাং, সংক্ষেপে বলা:

/ এবং / সম্প্রদায়টি /etc/nginx/subsites-enabled/example.org/home (কয়েকটি পার্ল স্ক্রিপ্ট) দ্বারা সরবরাহ করা উচিত

/ নিউজগুলি /etc/nginx/subsites-enabled/example.org/news দ্বারা সরবরাহ করা উচিত (ওয়ার্ডপ্রেস)

অন্যান্য সমস্ত কিছু /etc/nginx/subsites-enabled/example.org/app (কেক অ্যাপ) দ্বারা সরবরাহ করা উচিত

পার্ল বিট ঠিক কাজ করে। আমার যে সমস্যাটি হচ্ছে তা হ'ল অ্যাপটি সংবাদ গ্রহণ করছে (সম্ভবত এটি এর সাথে মেলে * *), আমি বিভিন্ন অপশন চেষ্টা করেছি (আমি এটি 2 দিনের জন্য এসেছি) তবে তাদের কোনওটিই সমস্যার সমাধান করেনি (কখনও কখনও) স্থিতিশীল সম্পদগুলি কাজ করবে না, ইত্যাদি)।

আমার কনফিগারেশনটি হ'ল:

/etc/nginx/sites-enabled/example.org:

server {
    listen   80;
    server_name example.org;
    error_log /var/log/nginx/example.org.log;

    include /etc/nginx/subsites-enabled/example.org/*;
}

/etc/nginx/subsites-enabled/example.org/home:

location = / {
  rewrite ^.*$ /index.pl last;
}

location ~* /community(.*) {
  rewrite ^.*$ /index.pl last;
}

location ~ \.pl {
  root   /var/www/vhosts/home;
  access_log /var/log/nginx/home/access.log;
  error_log /var/log/nginx/home/error.log;

  include /etc/nginx/fastcgi_params;
  fastcgi_index index.pl;
  fastcgi_param SCRIPT_FILENAME /var/www/vhosts/home$fastcgi_script_name;
  fastcgi_pass  unix:/var/run/fcgiwrap.socket;
}

জন্য / etc / ngins / subsites-সক্রিয় / খবর

location /news {
  access_log /var/log/nginx/news/access.log;
  error_log /var/log/nginx/news/error.log debug;

  error_page 404 = /news/index.php;

  root /var/www/vhosts/news;

  index index.php;

  if (!-e $request_filename) {
      rewrite ^.*$ /index.php last;
  }

  location ~ \.php {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /var/www/vhosts/news$fastcgi_script_name;
  }
}

জন্য / etc / nginx / subsites-সক্রিয় / অ্যাপ:

location ~ .* {
  access_log /var/log/nginx/app/access.log;
  error_log /var/log/nginx/app/error.log;

  rewrite_log on;

  index index.php;
  root /var/www/vhosts/app/app/webroot;

  if (-f $request_filename) {
    expires 30d;
    break;
  }

  if (!-e $request_filename) {
    rewrite ^.*$ /index.php last;
  }

  location ~ \.php {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /var/www/vhosts/app/app/webroot$fastcgi_script_name;
  }
}

ক) বিভিন্ন পুনঃনির্দেশ যেখানে (অস্তিত্বহীন ইউআরএলগুলি সহ) কোথায় যেতে হবে তার কয়েকটি উদাহরণ সহ আপনার কনফিগারেশন পোস্ট করুন। খ) আপনার ডিফল্ট অ্যাপ্লিকেশানে মানচিত্রযুক্ত নামের লোকেশন ব্লক ( উপসর্গ ব্যবহার করে ) দিয়ে ট্রাই_ফাইলগুলি ব্যবহার @করুন। আপনি একটি ত্রুটি_পৃষ্ঠা সেটআপও করতে পারেন যা কোনও নাম্বারিত স্থানে 404 মানচিত্র করে।
সাইবারএক্স 86

@ সাইবারএক্স 86 আমি আরও বিশদ এবং আমার কনফিগারেশন যুক্ত করেছি
আন্দ্রে সেরডেলিয়ুক

একটি তাত্ক্ষণিকভাবে কয়েকটি জিনিস পরামর্শ দেয়: ক) রেজেক্স ম্যাচিং প্রচলিত স্ট্রিংগুলির চেয়ে বেশি অগ্রাধিকার নেয় - সুতরাং আপনার অ্যাপ্লিকেশন ব্লকটি আপনার নিউজ ব্লকের পরিবর্তে মিলবে - চেষ্টা করুন location ^~ /news। খ) আপনার অ্যাপ্লিকেশন ব্লকের জন্য, আপনি এটি করতে সক্ষম হবেন location /(এটি এর মতো নয় location = /, তবে ইতিমধ্যে মেলে না এমন সমস্ত কিছুর সাথে মিলিত হওয়া উচিত সঠিক ক্রমে ব্লকগুলি সহ একটি একক ফাইলগুলিতে ফাইলগুলি। এছাড়াও, এর পরিবর্তে try_files ব্যবহার করুন !-e। অবশেষে wiki.nginx.org/HttpCoreModule#location দেখুন
সাইবারএক্স 86

আমি তাদের একক ফাইলে একত্রিত করা সহ প্রতিটি পরিবর্তনের চেষ্টা করেছি (যদিও তাদের পৃথকভাবে স্থাপন করা হওয়ায় তাদের আলাদা হওয়া দরকার), তাদের কোনওটিই কাজ করে না। নিউজ কেবল অ্যাপ্লিকেশন দ্বারা পরিচালিত হয়।
Andrei Serdeliuc

ঠিক আছে, আমি মনে করি এটি সমাধান করেছে - আমি প্রাথমিকভাবে প্রত্যাশার চেয়ে কিছুটা জটিল - তবে উইটগুলির বিরুদ্ধে ম্যাচ খেলতে অবশ্যই আনন্দদায়ক। ধাঁধা জন্য ধন্যবাদ।
সাইবারএক্স 86

উত্তর:


47

আপনার কনফিগারেশনের সাথে দুটো প্রাসঙ্গিক বিষয় ভুল রয়েছে:

  1. কোনও অবস্থান ব্লকের মধ্যে থাকা পাথগুলিতে এখনও ম্যাচযুক্ত পাথ অন্তর্ভুক্ত রয়েছে।
  2. 'শেষ' দিয়ে পুনর্লিখনগুলি কোনও ম্যাচের জন্য সমস্ত উপলব্ধ অবস্থানের অনুসন্ধান করে চালিয়ে যায় (তারা বর্তমান অবস্থানের ব্লকটি ভেঙে দেয়)।

উদাহরণস্বরূপ, ইউআরএলটি নিন ur.org/news/test.htm test

  • location /newsব্লক মিলিয়ে নেবে
  • ব্যবহৃত পাথটি তখন /news/test.htm- এটি লোকেশন ব্লকে থাকার কারণে এটি পরিবর্তন হয় না
  • ডকুমেন্ট_রোটে পাথ যুক্ত করা, আপনি পাবেন: /var/www/vhosts/news/news/test.htm
  • আপনার if (!-e $request_filename)বিবৃতিতে এই অস্তিত্বহীন ফাইলটি ক্যাপচার করা উচিত
  • আপনি পথটি আবার লিখুন /index.php
  • যেহেতু আপনি ব্যবহার lastকরছেন প্রক্রিয়াগুলি শুরু হয় (লোকেশন ব্লকটি ভেঙে দেওয়া)
  • /index.phpএখন দ্বারা ক্যাপচার করা হয় location /app block

মূল নির্দেশিকা সহ উপরে উল্লিখিত সমস্যাটি যখন আপনি আপনার অ্যাপ্লিকেশন অবস্থান ব্লকে যান তখন আরও জটিল হয়। 'নিউজ' ব্লকটির বিপরীতে, যেখানে আপনি অনুগ্রহ করে পথ থেকে 'সংবাদ' সরিয়ে ফেলতে পারেন (যেহেতু এটি আবার যুক্ত করা হবে), আপনি অ্যাপ পাথের জন্য এটি করতে পারবেন না, যা 'ওয়েবরোট' এ শেষ হয়।

সমাধান aliasনির্দেশের মধ্যে রয়েছে । এটি ডকুমেন্ট_রটকে পরিবর্তন করে না, তবে অনুরোধটি পরিবেশন করতে ব্যবহৃত ফাইলের পথটি এটি পরিবর্তন করে। দুর্ভাগ্যক্রমে, rewriteএবং try_filesকিছুটা অপ্রত্যাশিতভাবে আচরণ করার ঝোঁক alias

আসুন একটি সহজ উদাহরণ দিয়ে শুরু করি - কোনও পিএইচপি নয় - কেবল এইচটিএমএল এবং আপনার পার্ল ব্লক - তবে আপনার সাথে মেলে এমন একটি ফোল্ডার কাঠামো (এনগিনেক্স ১.০.১২, সেন্টোস 6 এ পরীক্ষিত) সহ:

server {
    server_name example.org;
    error_log /var/log/nginx/example.org.error.log notice;
    access_log /var/log/nginx/example.org.access.log;
    rewrite_log on;

    location = / {
        rewrite ^ /index.pl last;
    }

    location ^~ /community {
        rewrite ^ /index.pl last;
    }

    location ~ \.pl {
        root   /var/www/vhosts/home;

        [fastcgi_stuff...]
    }


    location ^~ /news {
        alias /var/www/vhosts/news;
        index index.htm;

        try_files $uri $uri/ /news/index.htm;
    }

    location ^~ /app {
        alias /var/www/vhosts/app/app/webroot;
        index index.htm;

        try_files $uri $uri/ /app/index.htm;
    }

    location / {
        rewrite ^/(.*) /app/$1 last;
    }
}
  • location = / - কেবলমাত্র মূলের সাথে মেলে
  • location ^~ /community - সম্প্রদায়ের সাথে শুরু প্রতিটি পথের সাথে মিলবে
  • location ~ \.pl .pl থাকা সমস্ত ফাইলের সাথে মিলবে
  • location ^~ /news - নিউজ দিয়ে শুরু প্রতিটি পথের সাথে মিলবে
  • location ^~ /app - অ্যাপ্লিকেশন দিয়ে শুরু প্রতিটি পথের সাথে মিলবে
  • location / - উপরে মেলে সমস্ত পাথের সাথে মিলবে will

আপনার ^~এটি সরিয়ে ফেলতে সক্ষম হওয়া উচিত - তবে এটি সামান্য পারফরম্যান্সের উন্নতি করতে পারে, যেহেতু এটি কোনও ম্যাচ পাওয়া গেলে এটি অনুসন্ধান বন্ধ করে দেয়।

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

একটি সমাধান হ'ল পৃথক অবস্থানের ব্লকগুলি ব্যবহার করুন যা উপনাম নির্দেশের সাথে একত্রে ক্যাপচার সম্পাদন করে - এটি বেশ মার্জিত নয় তবে যতদূর আমি বলতে পারি এটি কাজ করে (আবার, এনগিনেক্স ১.০.১২, সেন্টোস - - এ পরীক্ষিত অবশ্যই আমি কেক পিএইচপি, ওয়ার্ডপ্রেস এবং পার্ল সেটআপ করিনি - আমি প্রতিটি ফোল্ডারে সবেমাত্র কয়েকজন পিএইচপি এবং এইচটিএমএল ফাইল ব্যবহার করেছি)

server {
    server_name example.org;
    error_log /var/log/nginx/example.org.error.log notice;
    access_log /var/log/nginx/example.org.access.log;
    rewrite_log on;

    location = / {
        rewrite ^ /index.pl last;
    }

    location ^~ /community {
        rewrite ^ /index.pl last;
    }

    location ~ \.pl {
        root   /var/www/vhosts/home;
        access_log /var/log/nginx/home.access.log;
        error_log /var/log/nginx/home.error.log;
        include /etc/nginx/fastcgi_params;
        fastcgi_index index.pl;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass  unix:/var/run/fcgiwrap.socket;
    }

    location /news {
        access_log /var/log/nginx/news.access.log;
        error_log /var/log/nginx/news.error.log notice;
        alias /var/www/vhosts/news;
        index index.php;
        try_files $uri $uri/ /news/index.php;
    }

    location ~* ^/news/(.*\.php)$ {
        access_log /var/log/nginx/news.php.access.log;
        error_log /var/log/nginx/news.php.error.log notice;
        alias /var/www/vhosts/news/$1;
        try_files "" /news/index.php;
        include /etc/nginx/fastcgi_params;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_NAME $1;
        fastcgi_param SCRIPT_FILENAME /var/www/vhosts/news/$1;
        fastcgi_pass  127.0.0.1:9000;
    }

    location /app {
        alias /var/www/vhosts/app/app/webroot;
        access_log /var/log/nginx/app.access.log;
        error_log /var/log/nginx/app.error.log notice;
        index index.php;
        try_files $uri $uri/ /app/index.php;
    }

    location ~* ^/app/(.*\.php)$ {
        access_log /var/log/nginx/news.access.log;
        error_log /var/log/nginx/news.error.log notice;
        alias /var/www/vhosts/app/app/webroot/$1;
        try_files "" /app/index.php;
        include /etc/nginx/fastcgi_params;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_NAME $1;
        fastcgi_param SCRIPT_FILENAME /var/www/vhosts/app/app/webroot/$1;
        fastcgi_pass  127.0.0.1:9000;
    }

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

উপরের কনফিগারেশনটি উপরের সাধারণটিকে গ্রহণ করে এবং দুটি পরিবর্তন করে:

  • দুটি অবস্থান ব্লক যুক্ত করুন:
    • location ~* ^/news/(.*\.php)$ - .pp এ শেষ হওয়া সমস্ত ফাইলের সাথে / নিউজ / দিয়ে শুরু হওয়া পথের সাথে মিলবে
    • location ~* ^/app/(.*\.php)$ - .pp- এ শেষ হওয়া সমস্ত ফাইলের সাথে অ্যাপ্লিকেশন / অ্যাপ / দিয়ে শুরু হবে
  • ^~মিলটি মুছে ফেলুন - এটি প্রয়োজনীয় যাতে দুটি যুক্ত হওয়া অবস্থানের ব্লকগুলি পাথের সাথে মিলতে পারে (অন্যথায় ম্যাচগুলি / সংবাদ বা / অ্যাপ্লিকেশন ব্লকগুলিতে বন্ধ হয়ে যায়)।

এটি লক্ষ করা উচিত যে অবস্থানের সাথে মিলের জন্য ক্রমটি এখানে খুব গুরুত্বপূর্ণ:

  • সুনির্দিষ্ট মিলগুলি প্রথম (ব্যবহার করে =)
  • ^~দ্বিতীয় সাথে ম্যাচ
  • মিলে যাওয়া রেজেক্স ব্লকগুলি
  • প্রচলিত স্ট্রিং - কেবল কোনও মিলে যাওয়া রেজেক্স না পাওয়া গেলে

একটি মিলে যাওয়া রেজেক্স একটি সরল স্ট্রিংকে ছাড়িয়ে দেবে!

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

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


2
বন্ধু, আমি আশা করি আমি তোমাকে 100 বার উপার্জন করতে পারি আপনি খাঁটি দুর্দান্ত ধন্যবাদ!
Andrei Serdeliuc
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.