অ্যাপাচি 2 প্রক্সি সময়সীমা


23

পিএইচপি + পিএইচপি-এফপিএম সহ আমার সাথে অ্যাপাচি 2 রয়েছে অনুসারে:

http://wiki.apache.org/httpd/PHP-FPM

আমি একটি স্ক্রিপ্ট লিখছি যা একটি অভ্যন্তরীণ ভোস্টকে কার্যকর করতে দীর্ঘ সময় নিতে পারে, তবে সময় শেষ হতে থাকবে, স্ক্রিপ্ট 30 সেকেন্ডের অধীনে কার্যকর হলে সবকিছু নির্বিঘ্নে চলে।

আমার অ্যাপাচি লগ আমাকে বলে:

[Wed Apr 17 21:57:23.075175 2013] [proxy_fcgi:error] [pid 9263:tid 140530454267648] (70007)The timeout specified has expired: [client 58.169.202.172:49017] AH01075: Error dispatching request to :, referer:

স্ক্রিপ্টটি চালানোর চেষ্টা করার সময় আমাকে 503 Service Unavailableকার্যকর করার সময়টির 30 সেকেন্ডের পরে সময় দেওয়া হয়। যৌক্তিকরূপে এর অর্থ হ'ল আমার একটি টাইমআউট নির্দেশিকা আছে বা 30 সেকেন্ডে সেট করা আছে তবে আমার ভোস্টের কনফিগারেশনে এগুলি রয়েছে:

Timeout 600
<IfModule proxy_module>
    ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/home/pyrokinetiq/scripts/$1 timeout=600
    ProxyTimeout 600
</IfModule>

(পিএইচপি-এফপিএম আমার জন্য 9001 পোর্টে চলছে)

আমিও স্থাপন চেষ্টা করেছি Timeoutএবং ProxyTimeouthttpd.confকোনো পার্থক্য সঙ্গে।

দেখে মনে হচ্ছে এটি নির্দিষ্ট করে অন্য কোনও টাইমআউট সেট হয়েছে mod_proxy_fcgiতবে আমি এটি খুঁজে পাচ্ছি না। আমি অফিসিয়াল টার্বল থেকে অ্যাপাচি 2 এইচডিডি ইনস্টল করেছি, মোডগুলির কোনওটিই কোনও কনফিগারেশন ফাইল নিয়ে আসে বলে মনে হয় না।

যদি কেউ আমাকে সঠিক দিকে নির্দেশ করতে পারে তবে এটি অনেক প্রশংসা হবে।

উত্তর:


32

বেশ কয়েকটি কনফিগারেশন প্যারামিটার পরীক্ষা করার পরে অবশেষে আমি এই সমস্যাটি সমাধান করেছি। পূর্ববর্তী সমস্ত পরিবর্তনগুলি সরিয়ে আমি দুবার সমাধানটি পরীক্ষা করেছি। এটি ঠিক করার জন্য আমার কেবল একটি প্যারামিটারের প্রয়োজন ছিল।

Httpd এবং mod_proxy_fcgi এর সর্বশেষ সংস্করণগুলির জন্য আপনি কেবল রেখার timeout=শেষে যুক্ত করতে পারেন ProxyPassMatch, যেমন:

ProxyPassMatch ^/(.+\.php.*)$ fcgi://127.0.0.1:9000/<docroot>/$1 timeout=1800

পুরানো সংস্করণগুলির জন্য এটি কিছুটা জটিল ছিল, যেমন:

<Proxy fcgi://127.0.0.1:9000>
  ProxySet timeout=1800
</Proxy>
ProxyPassMatch ^/(.+\.php.*)$ fcgi://127.0.0.1:9000/<docroot>/$1

30 মিনিটের সময়সীমা নির্ধারণ করতে আমার প্রক্সি নির্দেশিকা যুক্ত করা দরকার। কিছু অ্যাপ্লিকেশনগুলিতে, সাধারণত ডাটাবেস অপারেটিং করার সময়, এমন রুটিন রয়েছে যা কার্যকর করতে 10 মিনিটেরও বেশি সময় নিতে পারে। আমি শেষ করেছি তা নিশ্চিত করতে আমি অস্থায়ী সময়সীমা 30 মিনিটের মধ্যে সেট করেছিলাম। ইনস্টলেশন উইজার্ডটি ব্যবহার করার সময় বিশেষত কার্যকর, যা খুব বেশি সময় নেয় (আমার বিনীত মতে)।

যেভাবে অন্তরঙ্গ ইনপুট আমাকে এই সমস্যাটি সমাধান করতে সহায়তা করেছিল তা নীচের URL ঠিকানায় পাওয়া গেছে ।


1
দেখে মনে হচ্ছে এটি অ্যাপাচি, এএইচ 600526 এর সাম্প্রতিক সংস্করণগুলির অধীনে ভেঙে গেছে: প্রক্সিপাস / <প্রক্সি> এবং প্রক্সিপ্যাসম্যাচ / <প্রক্সি ম্যাচ> পুরো কর্মী নামের সাথে পুরোপুরি ব্যবহার করা যাবে না
স্টিয়ার্ট অ্যাডাম

4
প্রক্সিপ্যাসম্যাচ লাইনের শেষে 'টাইমআউট = 120' পরামিতি যুক্ত করে আমি উপরের সমাধান করেছি।
স্টিয়ার্ট অ্যাডাম


আমার আরও দুটি জিনিস প্রয়োজন: প্রথমটি, আপনি আপনার বিশ্বব্যাপী অ্যাপাচি কনফিগারেশন ফাইলটিতে "টাইমআউট" এবং "প্রক্সিটাইমআউট" সেট করুন অন্যান্য এফপিএম সময়সীমার চেয়ে দীর্ঘ হতে। দ্বিতীয়ত, আমার এফপিএম পুলটি ইউনিক্স সকেটে শুনছিল এবং আমি সেটহ্যান্ডলারটি এর মতো ব্যবহার করি: [সেটহ্যান্ডলার "প্রক্সি: ইউনিক্স: /var/run/php/example.com-php7.0-fpm.sock | fcgi: // লোকালহোস্ট: 8000 "]। তবে <প্রোক্সি> সেটিংহ্যান্ডলার লাইনের fcgi: // লোকালহোস্ট অংশে মিলছে (অংশটি | ... যা আসলে ব্যবহৃত হয় না!) এবং ইউনিক্স নয়: / var / রান / অংশ। সুতরাং উপরোক্ত ব্যবহারের জন্য টাইমআউটগুলি কনফিগার করতে: <প্রক্সি fcgi: // লোকালহোস্ট: 8000> এবং <প্রক্সি ইউনিক্স: / ভার / রান / ... নয়
অধ্যাপক ফ্যালকেন

9

আমি এটি উল্লেখ করতে চেয়েছিলাম যে যদিও এই উত্তরটি পুরানো সংস্করণগুলির জন্য দুর্দান্ত কাজ করে তবে এটিএপি ২.৪-এর সাম্প্রতিক সংস্করণের অধীনে ত্রুটি কোড এএএচ০০৫২26 সহ ভেঙে যায়। ProxyPassএবং ProxyPassMatchবা <Proxy>এবং <ProxyMatch>একই কর্মী নামের মধ্যে একসঙ্গে ব্যবহার করা যাবে না। এটি ঠিকঠাক ফাংশন করত, সুতরাং এটি ডিজাইনের মাধ্যমে পরিবর্তন হয়েছে কিনা বা এটি কোনও বাগ রয়েছে তা জানেন না।

যে কোনও উপায়ে, আপনি কেবলমাত্র 'টাইমআউট = 120' পরামিতি (বা আপনার পছন্দসই মানটি যাই হোক না কেন) সহ একটি প্রক্সিপাস ম্যাচ ব্যবহার করে এটি ঠিক করতে পারেন, যেমন:

ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/path/to/webroot/$1 timeout=120

6

আমার কাছে অ্যাপাচি ২.৪., রয়েছে তবে এটি ঠিক করার জন্য প্যাচটি অ্যাপাচি> = ২.৪.৮ এ সরবরাহ করা হয়েছে। এখানে কীটি হ'ল আপনার আউটপুটটি অবিলম্বে শুরু করা যাতে অ্যাপাচি (mod_proxy_fcgi) সংযোগটি সক্রিয় বলে মনে করে।

উদাহরণস্বরূপ, আমি আমার এজেএক্স কলটির জন্য পিএইচপি এবং ডিবি কোয়েরি ব্যবহার করছি> 30 সেকেন্ড। যেহেতু আমি জানি যে সামগ্রিক প্রতিক্রিয়াটি "বিষয়বস্তুর ধরণ: অ্যাপ্লিকেশন / জেসসন" হবে, আমি তত্ক্ষণাত সেই শিরোনামটি প্রেরণ করি।

#1: Start output immediately
#Note: Sending the header is innocuous
#   it can be changed later using the $replace parameter
#   (see #3)
header( 'Content-Type: application/json' );

#2: Run slow query
mysql_query( "SELECT * FROM giant_table" );

#3: Change header as needed
header( 'Content-Type: application/csv', true );

#output content

2

এটি হওয়া উচিত নয়:

<IfModule mod_proxy.c>

নিশ্চিত হন যে php.ini সেটিংটি সর্বোচ্চ_অ্যাকশন_টাইম 600 এও সেট করা আছে। (আপনি আসল মানটি ব্যবহার করছেন তা নিশ্চিত করতে সরাসরি পৃষ্ঠায় phpinfo () দেখুন)

জেনি যেমন বলেছে, পিএইচপি-এফপিএম সেটিংস সেট করুন

request_terminate_timeout 610s

(শেষে এস নোট করুন)

আপনি নিজেই Mod_proxy_fcgi এর সাথে কনফিগার করার মতো খুব বেশি কিছু নেই, যেমন আপনি অ্যাপাচি পৃষ্ঠাতে দেখতে পাচ্ছেন। http://httpd.apache.org/docs/current/mod/mod_proxy_fcgi.html

পিএইচপি-এফপিএম ডিবাগ লগিংটিও চালু করুন যাতে আপনি দেখতে পাচ্ছেন যে এটি কখন শেষ হয়েছে। http://php-fpm.org/wiki/Configration_File (ক্যাচ_ ওয়ার্কার্স_আউটপুটও চালু করুন)

আপনি অ্যাপাচি ২.৪ ব্যবহার করছেন যেহেতু মোড_প্রক্সি এবং মোড_প্রক্সি_ফসিজি মডিউলগুলির জন্য ডিবাগ স্তরের লগিং চালু করুন। অত্যন্ত চমৎকার বৈশিষ্ট্য, শুধু মডিউল আপনার যা দরকার জন্য চালু: http://httpd.apache.org/docs/current/mod/core.html#loglevel

যদি সেগুলি সহায়তা না করে তবে আপনার পিএইচপি-এফপিএম কনফিগারেশন ফাইলটি পোস্ট করুন।

শেষ অবলম্বন হিসাবে, সম্ভবত কোনও ডিমন দীর্ঘকাল ধরে চলমান প্রক্রিয়াটিকে হত্যা করছে?


2

আমি লক্ষ করেছি যে আপনি পিএইচপি-এফপিএম ব্যবহার করছেন। আমিও এটি ব্যবহার করি তবে অ্যাপাচি ২.৪..6 সহ।

ধরে নেওয়া যাক যে সমস্যা কিছু সময়ের জন্য অস্তিত্ব হয়েছে, এটা হতে পারে যে জন্য সময়সীমার মান মনে হয় mod_proxy_fcgiহয় হার্ড কোডেড । আমি এখানে যা পেয়েছি তা লিখে রেখেছি


1

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

পিএইচপি-পিএফএম এর কনফিগারেশন ফাইলটি দেখুন for

; This is a hard kill switch on php execution.  It ignores the
; max_execution_time that can be set/changed with php_ini.  Basically
; it avoids timeout issues between apache and php-fpm.
request_terminate_timeout=30

এটি অ্যাপাচে টাইম আউট সেটিং হিসাবে বা সামান্য নীচে হিসাবে সেট করা উচিত।


1
আমি request_terminate_timeout400 এ সেট করে রেখেছি , এখনও কোনও পরিবর্তন নেই :( আমার একটি অনুভূতি রয়েছে যে আমার জন্য কিছু সেট করার দরকার আছে mod_proxy_fcgiতবে এটি কোনও কনফিগারেশন ফাইল নিয়ে আসে বলে মনে হয় না
wyqydsyq

0

সময়সীমা ছাড়াও, সক্ষম করা = বন্ধ সেট করুন। আমি খুঁজে পেয়েছিলাম যে যখন এটি দীর্ঘ চলমান স্ক্রিপ্টগুলির জন্য কিছু অনুরোধ ছিল তখন সঠিকভাবে কাজ করবে এবং অন্যদের তাড়াতাড়ি হত্যা করা হবে।


0

এই পোস্টটি আমার জন্য পুরো চুক্তিটি পরিবর্তন করেছে।

দেখে মনে হচ্ছে অ্যাপাচের মোড_রেমিক টাইমআউটটি ডিফল্ট মানটি ব্যবহার করবে না।

আপনার httpd.conf ফাইলটিতে নিম্নলিখিত লাইনগুলি যুক্ত করুন:

<IfModule reqtimeout_module>
  RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
</IfModule>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.