সরাসরি এনজিআইএনএক্সের সাথে সমস্ত বিদ্যমান স্থিতিশীল ফাইল কীভাবে পরিবেশন করা যায়, তবে বাকী ব্যাকএন্ড সার্ভারে প্রক্সি করুন।


88
location / {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

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

    if (!-f $request_filename) {
        proxy_pass http://127.0.0.1:8080; # backend server listening
        break;
        }
    }

উপরে Nginx ব্যবহার করে সরাসরি বিদ্যমান সমস্ত ফাইল পরিবেশন করা হবে (উদাঃ Nginx কেবল পিএইচপি উত্স কোড প্রদর্শন করে), অন্যথায় অ্যাপাচে একটি অনুরোধ ফরোয়ার্ড করুন। আমার বিধি থেকে *। Php ফাইলগুলি বাদ দিতে হবে যাতে *। Php এর জন্য অনুরোধগুলিও অ্যাপাচি-তে প্রেরণ করা হয় এবং প্রক্রিয়াজাত হয়।

আমি চাই যে এনগিনেক্স সমস্ত স্ট্যাটিক ফাইল এবং অ্যাপাচি সমস্ত ডায়নামিক স্টাফ প্রক্রিয়া করতে পারে handle

সম্পাদনা: সাদা তালিকা পদ্ধতির রয়েছে, তবে এটি খুব মার্জিত নয়, এই সমস্ত এক্সটেনশন দেখুন, আমি এটি চাই না।

location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
    access_log off;
    expires 30d;
    }
location / {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
    }

সম্পাদনা 2: এর try_filesপরিবর্তে এনগিনেক্সের নতুন সংস্করণগুলিতে http://wiki.nginx.org/HttpCoreModule#ry_files ব্যবহার করুন


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

উত্তর:


153

ব্যবহারের try_files এবং নামে অবস্থান ব্লক ( '@apachesite')। এটি অপ্রয়োজনীয় রেজেক্স ম্যাচ এবং যদি ব্লকটি সরিয়ে ফেলবে। আরো দক্ষ.

location / {
    root /path/to/root/of/static/files;
    try_files $uri $uri/ @apachesite;

    expires max;
    access_log off;
}

location @apachesite {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
}

আপডেট: এই কনফিগারেশনের অনুমানটি এখানে কোনও পিএইচপি স্ক্রিপ্টের অধীনে নেই /path/to/root/of/static/files। এটি বেশিরভাগ আধুনিক পিএইচপি ফ্রেমওয়ার্কগুলিতে সাধারণ। আপনার লিগ্যাসি পিএইচপি প্রকল্পগুলিতে একই ফোল্ডারে পিএইচপি স্ক্রিপ্ট এবং স্ট্যাটিক ফাইল উভয়ই মিশ্রিত রয়েছে, আপনি এনজিঙ্ক্স পরিবেশন করতে চান এমন সমস্ত ফাইলের শ্বেত তালিকাতে থাকতে পারে।


আমি ওয়ার্ডপ্রেস ব্যবহার করছি, তাই আমার কি এনগিনেক্স সার্ভারে আপলোড ফোল্ডার লাগানো উচিত?
চেমারন

7
এই সমাধানটির সাথে আমার সমস্যা: এনজিনেক্স অন্য স্থান (প্রক্সি) ব্যবহার করে না এবং ডিরেক্টরি তালিকাটি দেখানোর চেষ্টা করে। সুতরাং এটি 403 ছুড়ে ফেলে কারণ ডিরেক্টরি তালিকাটি সক্রিয় করা হয়নি। সম্পাদনা: ঠিক আছে আপনি যদি সরান $uri/তবে এটি কাজ করে।
ক্রিস্টোফএলএসএ

4
এটি অ্যাপাচে প্রক্সি / উদাহরণ হবে তবে /example.php ডাউনলোড করার অনুমতি দেয়।
টেরেন্স জনসন

4
@ টেরেন্স জনসন আপনার পিএইচপি ফাইলগুলি স্থির ফাইল ফোল্ডারের নীচে রাখা নিরাপদ নয়। আমি সেট করে নোট করুন root /path/to/root/of/*static*/files;। পিএইচপি ফাইলগুলি ইন্টারনেট থেকে সরাসরি অ্যাক্সেসযোগ্য নয়, আলাদা ফোল্ডারে রাখা উচিত।
চুয়ান মা

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

18

এটা চেষ্টা কর:

location / {
    root /path/to/root;
    expires 30d;
    access_log off;
}

location ~* ^.*\.php$ {
    if (!-f $request_filename) {
        return 404;
    }
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
}

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


6

আপনি যদি আপনার স্ক্রিপ্টগুলির এক্সটেনশানটি আড়াল করতে মোড_উইরাইট ব্যবহার করেন, অথবা আপনি যদি / / এ শেষ হওয়া সুন্দর URL গুলি পছন্দ করেন তবে আপনি অন্য দিক থেকে এটির কাছে যেতে চাইতে পারেন। অ্যান্টিএক্স-কে অ-স্ট্যাটিক এক্সটেনশনের সাথে যেকোন কিছুতে অ্যাপাচে যেতে বলুন। উদাহরণ স্বরূপ:

location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$
{
    root   /path/to/static-content;
}

location ~* ^!.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$ {
    if (!-f $request_filename) {
        return 404;
    }
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
}

আমি এই স্নিপেটের প্রথম অংশটি এখানে পেয়েছি: http://code.google.com/p/scalr/wiki/NginxStatic


এটি দুর্দান্ত কাজ করেছে, যদিও আমি এখনও মিনিডযুক্ত ফাইলগুলির জন্য ত্রুটি পেয়েছি (যেমন সাইট.min.css এবং main.min.js ইত্যাদি)। আমি কীভাবে লোকেশন রেজেক্সে তাদের ধরব? @ ল_ফায়
গ্যার্থ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.