2014-09-19 31 views
2

Suexec없이 올바르게 작동하는 Apache2.4 + FastCgi, PHP-FPM, SuExec을 설정했습니다. 하지만 Suexec을 사용하면 File does not exist 오류 (404는 PHP 스크립트에 액세스 할 때 브라우저에서 오류 찾을 수 없음) 오류가 발생하지 않습니다.Apache FastCgi, PHP-FPM, Suexec 권한 거부 오류

참고 : 나는 그 나에게 404 오류를주는 켤 때 내가 OFF "FastCgiWrapper"을 설정하지만, 때 PHP 스크립트 PHP-FPM을 통해 작동합니다.

아파치 오류 로그 (마지막 줄) :

[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 

/등/아파치/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 

의/var/www /에서 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

+0

@Diemuzi PHP-FPM을 사용하도록 vhost를 구성했으나 정상적으로 작동하지만 "FastCgiWrapper"를 켜면 "404 Not Found"오류가 발생합니다. 업데이트 된 질문을 확인하십시오. – sravis

답변

1

오래 전이 작업 구성을 작성했으며 Apache 2.4.x에서 작동하므로, 시도해 보도록 권합니다 https://gist.github.com/diemuzi/3849349. 대답에 게시하기에는 너무 큽니다. 필요한 모든 구성을 찾을 수 있습니다. 내가 여기 게시 한 내용과 다르게 내가 한 일을 볼 수도 있습니다.

그러나 내가 시도하는 것처럼 그리고 나의 예에서 찾을 수있는 것처럼 FastCgiExternalServer을 사용하는 것에 대한 생각을 중단 할 것을 권장합니다. 대신 mod_proxy_fcgi을 사용하십시오. 이것은 현재 FPM에 연결하는 훨씬 간단한 방법이며 최근에는 소켓을 지원합니다. 당신도 당신의 root 문서에 unix: 경로와 경로를 변경하기를 원할 것입니다 물론

# 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> 

: 여기

mod_proxy_fcgi 방법의 예입니다. localhost 부분은 실수가 아닙니다. localhost에 대해 무엇을 넣었는지는 중요하지 않지만 더 잘 어울리는 것으로 생각했습니다. 예, 내 도메인은 localhost라고되어 있지만 IP와 도메인을 통해 액세스 할 수 있습니다.

당신이 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> 

당신이 당신의 FPM 풀의 내부가 무엇 127.0.0.1:[PORT] 일치하는지 확인 있으므로 적절하게 변경을 . 다시 말하지만 문서 루트의 경로도 변경해야합니다.

내가 준 세 답변은 모두 작동하는 예입니다. 이 답변을 게시하기 바로 전에 테스트를 마쳤습니다.

0

사용자가 example으로 실행되도록 Apache를 요청했지만 사용자 www-data의 구성 파일을 설정합니다. 설명서에 따르면 /etc/apache2/suexec/www-data 설정 파일은 Apache 사용자가 www-data 일 때 읽혀집니다. 나는 그걸 실험 해본 적이 없지만 설정 파일 /etc/apache2/suexec/example을 설정해야 할 수도 있습니다. 내가 조금 혼란스러워하는 한 가지는 아파치 사용자와 대상 사용자 사이에 대상 CGI를 실행할 수있는 두 단계입니다. Suexec은이 두 단계에서 수표를 실행합니다. custom suexec 버전을 사용하면 다른 Apache 사용자가 다른 설정 파일을 사용하여 실행될 수 있지만 이는 SuexecUserGroup Apache 지시어를 사용하는 대상 사용자를 선택하는 것과 다릅니다. CGI를 실행할 대상 사용자 만 변경하려는 경우 Apache 사용자를 변경할 필요가 없습니다. 이를 위해 pristine 버전이면 충분합니다. 어쨌든, 이것은 나의 이해입니다. 나는 그것이 누군가를 돕기를 바랍니다.