2009-03-04 27 views
13

Tôi có một trang web lưu trữ và tôi đang gặp sự cố khi cấu hình Joomla (chạy Joomla + php + mySQL trên máy chủ IIS7 + win 2008). Tôi có một cấu hình tương tự đang chạy trên một máy tính cục bộ (Joomla + php + mySQL trên IIS7 + vista x64), vì vậy tôi ít nhất có thể làm theo các hướng dẫn cho thấy trong các hướng dẫn khác nhau về cách thiết lập điều này.Làm thế nào để biết chắc chắn nếu FastCGI đang được sử dụng để chạy tập lệnh php

Triệu chứng này với trang web được lưu trữ là tôi không thể bật bất kỳ cài đặt SEO nào trong Joomla (thậm chí không phải cài đặt đầu tiên, "URL thân thiện với công cụ tìm kiếm"). Tôi nhận được 404 (không tìm thấy tệp) hoặc URL xuất hiện được viết lại chính xác nhưng nó luôn là nội dung của trang chủ được hiển thị. Tôi đã có một vấn đề tương tự trên máy nhà của tôi và nó hóa ra là vì tôi đã không sử dụng FastCGI để lưu trữ php, vì vậy tôi quyết định điều tra trên trang web được lưu trữ.

Dù sao, tôi nhận thấy trong file web.config của thư mục lưu trữ joomla trên trang web tổ chức dòng sau:

<add name="Plesk_Handler_3522909676" path="*.php" verb="*" modules="IsapiModule" scriptProcessor="c:\program files (x86)\parallels\plesk\additional\pleskphp5\php5isapi.dll" resourceType="Either" /> 

Từ kinh nghiệm quá khứ, tôi biết rằng php có một số vấn đề khi không chạy dưới fastCGI . Tôi nhận thấy web.config trong thư mục gốc được sử dụng dòng sau thay vì:

<add name="Plesk_Handler_0286090609" path="*.php" verb="*" modules="CgiModule" scriptProcessor="c:\program files (x86)\parallels\plesk\additional\pleskphp5\php-cgi.exe" resourceType="Either" /> 

tôi sao chép rằng trong web.config trong thư mục joomla, và có hành vi khác nhau ... nhưng vẫn không làm việc. Nếu tôi tải một tập tin .php trong thư mục joomla chạy phpInfo(), dưới Server API nó nói CGI/FastCGI. Có phải là xác nhận tích cực rằng FastCGI đang được sử dụng không? Tại sao trình xử lý trong cấu hình web trỏ tới modules = "CgiModule" thay vì modules = "FastCgiModule" (tôi thậm chí không chắc chắn rằng tồn tại, nhưng tôi chỉ thấy đề cập đến CgiModule đáng ngờ).

Đó là một trang web tổ chức, vì vậy như xa như tôi biết tôi không có quyền truy cập vào tập tin applicationHost.config ...

Trả lời

24

Dưới đây là một thử nghiệm đơn giản:

  1. Tạo một file phpinfo.php với

<?php phpinfo(); ?> 

bên trong;

  1. Yêu cầu http://yoursite.com/phpinfo.php/foobar?foo=bar

  2. Kiểm tra đầu ra của phpinfo và tìm kiếm _SERVER [ "REQUEST_URI"].

Nếu biến này bị thiếu thì CGI được sử dụng.Nếu biến có mặt và được đặt chính xác thành /phpinfo.php/foobar?foo=bar, thì ISAPI hoặc FastCGI được sử dụng. Nhìn gần đầu của đầu ra cho API máy chủ; nó nên được đặt thành ISAPI (có nghĩa là ISAPI đang được sử dụng) hoặc CGI/FastCGI (có nghĩa là FastCGI đang được sử dụng, vì chúng tôi đã loại trừ CGI).

+1

$ _SERVER ['REQUEST_URI'] có thể hiển thị chính xác trong cả CGI và FastCGI và API máy chủ có thể hiển thị 'CGI/FastCGI' cho cả CGI và FastCGI. Một điểm khác biệt là trong FastCGI $ _SERVER ["REDIRECT_HANDLER"] có thể hiển thị php-fastcgi, nhưng điều đó cũng không xác nhận rằng "FastCGI" đang được sử dụng vì "php-fastcgi" chỉ là tên biến được sử dụng trong tệp cấu hình . –

+0

@ Jimmy, Câu trả lời này là rất cần [trích dẫn] (http://xkcd.com/285). Ngoài ra, phương pháp bạn mô tả âm thanh một chút * hacky *, có cách nào tốt hơn và mạnh mẽ hơn để xác định cài đặt trực tiếp không? – Pacerier

+0

@Pacerier Nó làm việc cho tôi, và dường như đối với nhiều người khác. Tôi không thể tìm thấy một cách tốt hơn, nhưng cảm thấy tự do để gửi một câu trả lời "tốt hơn và mạnh mẽ hơn" nếu bạn có một. Tôi tự nghĩ ra nó, vì thế không có trích dẫn nào. – Jimmy

0

Bạn sẽ thấy một tham chiếu đến nó từ

<?php 
phpinfo(); 
?> 

Server API = CGI/FastCGI

+0

Nhưng là chắc chắn? Chủ nhà của tôi nói rằng họ không hỗ trợ FastCGI; web.config ở trên cho biết họ đang sử dụng CGI chứ không phải FastCGI; tuy nhiên, tôi vẫn thấy Server API = CGI/FastCGI trong phpinfo() – Jimmy

0

Joomla tạo tệp .htaccess với các quy tắc viết lại trong đó để bật URL thân thiện với công cụ tìm kiếm. Nếu bạn đang sử dụng Apache, bạn sẽ cần phải đặt "AllowOverride FileInfo" cho thư mục chứa cài đặt joomla của bạn. Nếu bạn đang sử dụng IIS, bạn sẽ cần một mô-đun như IISModRewrite. Dưới đây là hướng dẫn này: [http://www.micronovae.com/ModRewrite/articles/SEFJoomla.html]

2

Thật không may, việc kiểm tra \_SERVER["REQUEST_URI"] không hoạt động đối với tôi. Sử dụng CGI hoặc FastCGI, luôn hiển thị /phpinfo.php/foobar?foo=bar.

Không nhìn thấy nếu Server API = CGI/FastCGI được đặt - chỉ cho bạn biết giao diện của phiên bản được biên dịch của php hỗ trợ, không phải những gì đang được sử dụng. Tuy nhiên, tôi đã tìm thấy một phương pháp khác có thể hoạt động đáng tin cậy hơn.

Plonk một tập tin trong nơi gọi là phpinfo.php chứa văn bản: <? php phpinfo(); ?>

Kiểm tra cho biến \_ENV["REDIRECT_HANDLER"]:
Nếu nó được thiết lập để php5-fastcgi (hay cái gì khác fastcgi-ish) yêu cầu có lẽ hầu hết đã trải qua FastCGI. Nếu nó được đặt thành application/x-httpd-php (hoặc tôi giả định một cái gì đó khác hơn ở trên), bạn đang sử dụng CGI.

Tuy nhiên, cách chắc chắn là chạy thử nghiệm nhỏ. Bạn cần công cụ ab (Apache Bench) cho việc này.
Cả hai có và không có CGI, chạy này từ máy khác:

ab -c 100 -n 1000 http://yourdomain.com/path/phpinfo.php 

Kiểm tra dòng Time taken for tests:. Trên hộp của tôi ít nhất, truy cập VPS của tôi qua một kết nối ADSL 1.3Mbps, FastCGI hoàn toàn max nó ra, trong khi với CGI chỉ có thể lấp đầy một nửa của nó.

Hy vọng điều này sẽ hữu ích.

0

Đảm bảo mọi thứ được thiết lập ban đầu cho đến khi tập lệnh thất bại hoàn toàn khi fastcgi không chạy. Sau đó, bạn sẽ biết, khi nó hoạt động, rằng fastcgi daemon là lý do.

0

Điều này phù hợp với tôi.

/** 
* return phpinfo() results as an array 
* 
* @credit http://php.net/manual/en/function.phpinfo.php#106862 
* @param void 
* @return array 
*/ 
function phpinfo_array(){ 
    ob_start(); 
    phpinfo(); 
    $info_arr = array(); 
    $info_lines = explode("\n", strip_tags(ob_get_clean(), '<tr><td><h2>')); 
    $cat = 'general'; 
    foreach($info_lines as $line){ 
     preg_match('/<h2>(.*)<\/h2>/', $line, $title) ? $cat = preg_replace('/\s+/', '_', strtolower(trim($title[1]))) : null; 
     if(preg_match('/<tr><td[^>]+>([^<]*)<\/td><td[^>]+>([^<]*)<\/td><\/tr>/', $line, $val)){ 
      $subcat = preg_replace('/\s+/', '_', strtolower(trim($val[1]))); 
      $info_arr[$cat][$subcat] = $val[2]; 
     } elseif(preg_match('/<tr><td[^>]+>([^<]*)<\/td><td[^>]+>([^<]*)<\/td><td[^>]+>([^<]*)<\/td><\/tr>/', $line, $val)){ 
      $subcat = preg_replace('/\s+/', '_', strtolower(trim($val[1]))); 
      $info_arr[$cat][$subcat] = array('local' => $val[2], 'master' => $val[3]); 
     } 
    } 
    return $info_arr; 
} 


// output proper response code 
$phpinfo = phpinfo_array(); 
$configure = (@isset($phpinfo['general']['configure_command'])) ?: null; 

// properly account for FastCGI 
if ($configure && preg_match('/--enable-fastcgi/', $configure)){ 
    // fastcgi response 
    header('Status: 403 Access is forbidden'); 
} else { 
    // http response 
    header('HTTP/1.0 403 Access is forbidden'); 
} 
+1

Kịch bản hoạt động như thế nào và kịch bản lệnh làm gì? – Pacerier

3

Bạn có thể sử dụng (trên centos) apachectl -M, bạn sẽ hiển thị những gì module được kích hoạt:

apachectl -M:

file_cache_module (chia sẻ) mem_cache_module (chia sẻ) version_module (được chia sẻ) fastcgi_module (đã chia sẻ)

+0

Hoạt động trên Ubuntu, mặc dù tôi đã phải sử dụng sudo – Sam

1

php_sapi_name() hoặc PHP_SAPI, cả hai đều hoạt động.

http://php.net/manual/en/function.php-sapi-name.php

<?php 
    if (php_sapi_name() != 'cgi-fcgi'){ 
     echo 'I knew fastcgi wasn't working.'; 
    }else{ 
     echo 'Holy crap, something worked for once.'; 
    } 
+0

Không phải là không được thoát, vui lòng chỉnh sửa mã. – Adrian

Các vấn đề liên quan