Hết thời gian chờ Proxy2


23

Tôi có Apache2 với PHP + PHP-FPM được cấu hình theo:

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

Tôi đang viết một tập lệnh sẽ mất nhiều thời gian để thực thi trên Vhost nội bộ, nhưng cứ bị hết thời gian, mọi thứ sẽ chạy hoàn hảo nếu tập lệnh thực thi trong vòng dưới 30 giây.

Nhật ký apache của tôi nói với tôi:

[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:

Khi cố gắng chạy tập lệnh, tôi sẽ nhận được 503 Service Unavailablesau 30 giây thời gian thực hiện. Về mặt logic, điều này có nghĩa là tôi có một lệnh hết thời gian hoặc cài đặt được đặt thành 30 giây, nhưng tôi có những điều này trong cấu hình Vhost của tôi:

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

(php-fpm đang chạy trên port 9001 cho tôi)

Tôi cũng đã cố gắng đặt TimeoutProxyTimeouttrong httpd.confkhông có sự khác biệt.

Dường như có một thiết lập thời gian chờ khác ở đâu đó cụ thể mod_proxy_fcgi, nhưng tôi không thể tìm thấy nó. Tôi đã cài đặt Apache2 httpd từ tarball chính thức, không có mod nào có vẻ như đi kèm với bất kỳ tệp cấu hình nào.

Nếu bất cứ ai có thể chỉ cho tôi đi đúng hướng, nó sẽ được đánh giá cao.

Câu trả lời:


32

Cuối cùng tôi đã khắc phục vấn đề này sau khi thử nghiệm một số thông số cấu hình. Tôi đã thử nghiệm giải pháp hai lần, loại bỏ tất cả các thay đổi trước đó. Chỉ có một tham số là cần thiết để tôi sửa nó.

Đối với các phiên bản mới nhất của httpd và mod_proxy_fcgi, bạn chỉ cần thêm timeout=vào cuối ProxyPassMatchdòng, ví dụ:

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

Đối với các phiên bản cũ, nó phức tạp hơn một chút, ví dụ:

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

Tôi cần thêm chỉ thị Proxy để đặt thời gian chờ là 30 phút. Trong một số ứng dụng, thông thường khi vận hành cơ sở dữ liệu, có những thói quen có thể mất hơn 10 phút để thực thi. Tôi tạm thời đặt thời gian chờ là 30 phút để đảm bảo chúng kết thúc. Cụ thể hữu ích khi sử dụng trình hướng dẫn cài đặt, việc này mất quá nhiều thời gian (theo ý kiến ​​khiêm tốn của tôi).

Bằng cách này, đầu vào nội bộ giúp tôi giải quyết vấn đề này đã được tìm thấy trong địa chỉ URL sau .


1
Có vẻ như điều này đã bị phá vỡ trong các phiên bản gần đây của Apache, AH00526: ProxyPass / <Proxy> và ProxyPassMatch / <ProxyMatch> không thể được sử dụng hoàn toàn với cùng tên công nhân
Stewart Adam

4
Tôi đã giải quyết vấn đề trên bằng cách thêm một tham số 'timeout = 120' ở cuối dòng ProxyPassMatch.
Stewart Adam

@Palantir rất vui khi nghe nó! Gửi như câu trả lời .
Stewart Adam

Hai điều nữa tôi cần: Đầu tiên, bạn phải đặt "Hết giờ" và "ProxyTimeout" trong tệp cấu hình apache toàn cầu của bạn dài hơn các thời gian chờ khác của FPM. Thứ hai, nhóm FPM của tôi đã lắng nghe một ổ cắm unix và tôi sử dụng SetHandler như vậy: [SetHandler "proxy: unix: /var/run/php/example.com-php7.0-fpm.sock | fcgi: // localhost: 8000 "]. Nhưng <Proxy> khớp với phần fcgi: // localhost của dòng SetHandler (phần SAU KHI | ... thậm chí không thực sự được sử dụng!) Và KHÔNG phải là unix: / var / run / part. vì vậy để định cấu hình thời gian chờ cho việc sử dụng ở trên: <Proxy fcgi: // localhost: 8000> chứ không phải <Proxy unix: / var / run / ...
Giáo sư Falken

9

Tôi muốn chỉ ra rằng mặc dù câu trả lời này hoạt động rất tốt cho các phiên bản cũ hơn, nhưng nó bị hỏng theo các phiên bản gần đây của Apache 2.4 với mã lỗi AH00526. ProxyPassProxyPassMatchhoặc <Proxy><ProxyMatch>không thể được sử dụng cùng nhau trong tên lao động tương tự. Điều này được sử dụng để hoạt động tốt, vì vậy không biết nếu điều đó đã được thay đổi bởi thiết kế hoặc nếu đó là một lỗi.

Dù bằng cách nào, bạn có thể khắc phục điều này bằng cách chỉ sử dụng ProxyPassMatch với tham số 'timeout = 120' (hoặc bất kể giá trị mong muốn của bạn là gì), ví dụ:

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

6

Tôi có Apache 2.4.6, nhưng bản vá để sửa nó được cung cấp trong Apache> = 2.4.8. Chìa khóa ở đây là bắt đầu đầu ra của bạn ngay lập tức để Apache (mod_proxy_fcgi) nghĩ rằng kết nối đang hoạt động.

Ví dụ: tôi đang sử dụng PHP và truy vấn DB cho cuộc gọi AJAX của tôi mất> 30 giây. Vì tôi biết rằng phản hồi tổng thể sẽ là "Loại nội dung: ứng dụng / json", tôi gửi tiêu đề đó ngay lập tức.

#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

Không nên như vậy:

<IfModule mod_proxy.c>

Đảm bảo cài đặt php.ini max_execut_time cũng được đặt thành 600. (kiểm tra phpinfo () trên trang trực tiếp để đảm bảo bạn đang thấy giá trị thực được sử dụng)

Như Jenny đã nói, hãy đặt cài đặt php-fpm

request_terminate_timeout 610s

(lưu ý s ở cuối)

Không có nhiều thứ để cấu hình với chính mod_proxy_fcgi, như bạn có thể thấy trên trang apache. http://httpd.apache.org/docs/civerse/mod/mod_proxy_fcgi.html

Bật ghi nhật ký gỡ lỗi php-fpm để bạn có thể thấy nó ở đâu ngoài đó. http://php-fpm.org/wiki/Configuration_File (cũng bật Catch_workersDefput)

Và bật ghi nhật ký mức gỡ lỗi cho các mô-đun mod_proxy và mod_proxy_fcgi vì bạn đang sử dụng apache 2.4. Tính năng rất hay, chỉ bật cho các mô-đun bạn cần: http://httpd.apache.org/docs/civerse/mod/core.html#loglevel

Nếu không giúp được, hãy đăng tập tin cấu hình php-fpm của bạn.

Như một phương sách cuối cùng, có thể một số daemon đang giết quá trình chạy dài?


2

Tôi lưu ý rằng bạn đang sử dụng PHP-FPM. Tôi cũng sử dụng nó, nhưng với Apache 2.4.6.

Giả sử rằng vấn đề đã tồn tại một thời gian, có vẻ như giá trị thời gian chờ cho đã mod_proxy_fcgiđược mã hóa cứng . Tôi đã viết lên những gì tôi tìm thấy ở đây


1

Vì bạn đã sửa các cài đặt thời gian chờ trong apache, nên đó không phải là vấn đề. Vị trí thứ hai để tìm sẽ là bất kỳ thiết bị mạng nào, nhưng vì bạn đang ủy quyền cho máy chủ của riêng mình, điều đó cũng khó xảy ra. Vì vậy, nơi còn lại để tìm là ở máy chủ phụ trợ.

Tôi là tập tin cấu hình cho php-pfm, hãy tìm

; 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

Điều này nên được đặt thành giống như, hoặc hơi bên dưới, cài đặt thời gian chờ trong apache.


1
Tôi đã đặt thành request_terminate_timeout400, vẫn không thay đổi :( Tôi có cảm giác rằng có thứ gì đó tôi cần đặt mod_proxy_fcgi, nhưng dường như nó không đi kèm với bất kỳ tệp cấu hình nào.
wyqydsyq

0

Ngoài thời gian chờ, đặt enablereuse = tắt. Tôi tìm thấy khi có một số yêu cầu cho các tập lệnh chạy dài sẽ hoạt động chính xác và những tập lệnh khác sẽ bị giết sớm.


0

Bài đăng này đã thay đổi toàn bộ thỏa thuận cho tôi.

Có vẻ như mod_Vqtimeout của Apache sẽ không sử dụng giá trị mặc định.

Thêm các dòng sau vào tệp httpd.conf của bạn :

<IfModule reqtimeout_module>
  RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
</IfModule>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.