2014-09-19 19 views
2

我做了一個Apache2.4 + FastCgi,PHP-FPM,SuExec的設置,它可以在沒有Suexec的情況下正常工作。但是,當我啓用Suexec它給我文件不存在錯誤(當我訪問PHP腳本時,瀏覽器中404未找到錯誤)。Apache FastCgi,PHP-FPM,Suexec權限被拒絕錯誤

注: PHP腳本通過PHP-FPM當我打開OFF 「FastCgiWrapper」,但是當我打開它給我404錯誤。

Apache的錯誤日誌(最後行)

[authz_core:debug] [pid 3906:tid 140546979436288] mod_authz_core.c(802): [client 192.168.91.132:58225] AH01626: authorization result of Require all granted: granted 
[authz_core:debug] [pid 3906:tid 140546979436288] mod_authz_core.c(802): [client 192.168.91.132:58225] AH01626: authorization result of <RequireAny>: granted 
[authz_core:debug] [pid 3906:tid 140546979436288] mod_authz_core.c(802): [client 192.168.91.132:58225] AH01626: authorization result of Require all granted: granted 
[authz_core:debug] [pid 3906:tid 140546979436288] mod_authz_core.c(802): [client 192.168.91.132:58225] AH01626: authorization result of <RequireAny>: granted 
[core:info] [pid 3906:tid 140546979436288] [client 192.168.91.132:58225] AH00128: File does not exist: /etc/apache2/fcgi-app/info.php 

配置:

/etc/apache2/mods-available/fastcgi.conf

FastCgiWrapper On 

的/ etc /的Apache2/suexec/www-data

/var/www/html 
/cgi-bin 

/etc/apache2/sites-available/example.net.conf

<VirtualHost *:80> 
     ServerName example.net 
     ServerAdmin [email protected] 
     DocumentRoot /var/www/html/example.net/public_html 
     LogLevel debug 
     ErrorLog ${APACHE_LOG_DIR}/error.log 

    SuexecUserGroup example examplegrp 
    AddHandler php-fcgi-hand .php 
    Action php-fcgi-hand /php-fcgi-uri 
    Alias /php-fcgi-uri fcgi-app 
    FastCgiExternalServer fcgi-app -socket /var/run/php5-fpm-example.sock -pass-header Authorization -idle-timeout 30000 -flush 

    <Location /php-fcgi-uri> 
      Require all granted 
    </Location> 

</VirtualHost> 

/etc/php5/fpm/pool.d/example.conf

[example] 
user = example 
group = examplegrp 
listen = /var/run/php5-fpm-example.sock 
listen.owner = example 
listen.group = examplegrp 
listen.mode = 0666 
pm = dynamic 
pm.max_children = 5 
pm.start_servers = 2 
pm.min_spare_servers = 1 
pm.max_spare_servers = 3 

/無功/網絡/ HTML/example.net/cgi-bin目錄/ php.cgi

#!/bin/sh 
PHP_FCGI_CHILDREN=5 
export PHP_FCGI_CHILDREN 
PHP_FCGI_MAX_REQUESTS=500 
export PHP_FCGI_MAX_REQUESTS 
exec /var/www/html/example.net/cgi-bin 

文件夾結構和權限

/var/www/html/example.net/cgi-bin/php.cgi 
/var/www/html/example.net/public_html/info.php 

drwxrwxrwx 13 www-data www-data var 
    |____drwxr-xr-x 5 www-data www-data www 
     |____drwxr-xr-x 6 www-data www-data html 
      |____ drwxr-xr-x 4 example examplegrp example.net 
       |______ drwxr-xr-x 2 example examplegrp cgi-bin 
        |_____-r-xr-xr-x 1 example examplegrp php.cgi 

       |______ drwxr-xr-x 2 example examplegrp public_html 
        |_____-rwxr-xr-x 1 example examplegrp info.php 
+0

除非我是盲人,否則我在這裏沒有看到任何顯示您正在使用PHP-FPM的東西。看起來你正在使用PHP-CGI。 FPM使用通過套接字或tcp連接的池。你的例子都沒有顯示這種用法。 – Diemuzi 2014-09-19 19:43:17

+0

@Diemuzi我已經配置了vhost來使用PHP-FPM,它工作正常,但是當我打開「FastCgiWrapper」時,它給了我錯誤「404 Not Found」。請檢查我更新的問題。 – sravis 2014-09-20 03:39:41

回答

1

我很早就寫了這個工作配置,它在Apache 2.4.x上工作,所以我建議你試試https://gist.github.com/diemuzi/3849349。在這裏發佈答案太大了。你會發現你需要的所有配置。您甚至可能會看到我所做的與您在此處發佈的內容相比所做的不同之處。

但是,我還建議您不要再考慮使用FastCgiExternalServer,就像您正在嘗試的那樣,您會在我的示例中找到它。但改爲使用mod_proxy_fcgi。這是一種現在更簡單的連接到FPM的方法,它最近支持套接字。

這裏的mod_proxy_fcgi方式的例子:

# PHP-FPM via Socket 
<IfModule proxy_module> 
    <IfModule proxy_fcgi_module> 
     ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/usr/local/php/etc/php-fpm/[USERNAME].sock|fcgi://localhost/vhosts/[DOMAIN]/public/ 
    </IfModule> 
</IfModule> 

當然,你會想在unix:路徑和路徑更改爲root文檔了。注意localhost部分,這不是一個錯誤。你爲本地主機放置什麼並不重要,但我認爲它看起來更好。是的,我的域名可以通過IP和域名訪問,即使它說localhost,所以不要讓它欺騙你。

如果你想使用使用mod_proxy_fcgi的TCP方式,你也一樣可以做到這樣:

# PHP-FPM via TCP 
<IfModule proxy_module> 
    <IfModule proxy_fcgi_module> 
     <Location ~ ^/(.*\.php(/.*)?)$> 
      ProxyPass fcgi://127.0.0.1:[PORT]/vhosts/[DOMAIN]/public/ 
     </Location> 
    </IfModule> 
</IfModule> 

當然確保127.0.0.1:[PORT]比賽你有你的FPM池裏面有什麼,所以相應地改變它。再次確保您也更改文檔根目錄的路徑。

我給你的三個答案都是實例。我甚至在我發佈這個答案之前進行了測試。

0

您要求Apache以用戶example的身份運行,但您爲用戶www-data設置了配置文件。該文檔說,當Apache用戶是www-data時,會讀取配置文件/etc/apache2/suexec/www-data。我從來沒有嘗試過,但它可能是你需要設置配置文件/etc/apache2/suexec/example。我覺得有一點讓人困惑的是這兩個階段:Apache用戶,然後是目標用戶,它允許運行目標cgi。 Suexec在這兩個階段進行檢查。 suexec的custom版本允許不同的Apache用戶使用不同的配置文件運行,但這與使用SuexecUserGroup Apache指令選擇目標用戶不同。如果我們只想更改目標用戶(即運行CGI的用戶),則不需要更改Apache用戶。爲此,pristine版本就足夠了。無論如何,這是我的理解。我希望它能幫助別人。