在 Centos 6 上設置 Apache 2.2 + FastCGI + SuExec + PHP-FPM
我在這裡嘗試遵循這個非常詳細的說明,我只是從 www-data 使用者更改為 apache 使用者,並且使用 /var/www/hosts/sitename/public_html 而不是 /home/user/public_html
但是,我花了一整天的時間試圖弄清楚為什麼 php 文件內容在沒有被正確解析的情況下顯示出來。我只是無法弄清楚這一點。以下是我目前的配置:
/etc/httpd/conf.d/fastcgi.conf
User apache Group apache LoadModule fastcgi_module modules/mod_fastcgi.so # dir for IPC socket files FastCgiIpcDir /var/run/mod_fastcgi # wrap all fastcgi script calls in suexec FastCgiWrapper On # global FastCgiConfig can be overridden by FastCgiServer options in vhost config FastCgiConfig -idle-timeout 20 -maxClassProcesses 1 # sample PHP config # see /usr/share/doc/mod_fastcgi-2.4.6 for php-wrapper script # don't forget to disable mod_php in /etc/httpd/conf.d/php.conf! # # to enable privilege separation, add a "SuexecUserGroup" directive # and chown the php-wrapper script and parent directory accordingly # see also http://www.brandonturner.net/blog/2009/07/fastcgi_with_php_opcode_cache/ # FastCgiServer /var/www/www-data/php5-fcgi #AddType application/x-httpd-php .php AddHandler php-fcgi .php Action php-fcgi /fcgi-bin/php5-fcgi Alias /fcgi-bin/ /var/www/www-data/ #FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /tmp/php5-fpm.sock -pass-header Authorization #DirectoryIndex index.php # <Location /fcgi-bin/> # Order Deny,Allow # Deny from All # Allow from env=REDIRECT_STATUS SetHandler fcgid-script Options +ExecCGI </Location>
/etc/httpd/conf.d/vhost.conf
<VirtualHost> DirectoryIndex index.php index.html index.shtml index.cgi SuexecUserGroup www.mysite.com mygroup Alias /fcgi-bin/ /var/www/www-data/www.mysite.com/ DocumentRoot /var/www/hosts/mysite.com/w/w/w/www/ <Directory /var/www/hosts/mysite.com/w/w/w/www/> Options -Indexes FollowSymLinks AllowOverride None Order allow,deny allow from all </Directory> </VirtualHost>
PS: 1. 另外,對於 PHP5.5,我什至需要 FPM 還是已經包含它?2. 我正在使用 mod_fastcgi,不知道是不是這個問題,我應該切換到 mod_fcgid 嗎?考慮到哪一個更好,網際網路上似乎有相互矛盾的記錄。我在機器上執行了許多虛擬主機,希望能夠為每個使用者提供自己的 opcache
首先,你過度殺戮它。
你不需要 suphp + php-fpm 因為它們基本上做同樣的事情。
如果您想要多使用者多虛擬主機環境,您應該使用以下堆棧:
apache + mod_fastcgi + php-fpm
php-fpm 允許您定義可以在具有完全不同 php 設置的不同使用者下執行的池。
對於該配置,您需要將 apache 恢復為其基本配置:
user apache group apache
我假設您將在使用者的 homedirs public_html 文件夾中執行您的虛擬主機
您需要 chmod /home/%user% 到 755 並將 public_html 的組更改為 apache
chown %user%:apache /home/%user%/public_html chomod 755 /home/%user%
然後,您將為使用者定義 php-fpm 池
[%user%] listen = /var/run/php-fpm/%user%.socket listen.backlog = -1 listen.allowed_clients = 127.0.0.1 listen.owner = web listen.group = www listen.mode = 0666 user = %user% group = %userg% #pm.status_path = /fpm-status pm = ondemand pm.max_children = 20 #pm.start_servers = 6 #pm.min_spare_servers = 5 #pm.max_spare_servers = 10 pm.max_requests = 500 request_terminate_timeout = 600s rlimit_files = 131072 rlimit_core = unlimited catch_workers_output = yes php_admin_value[error_log] = /home/%user%/fpm-error.log php_flag[display_errors] = on php_flag[display_startup_errors] = on php_admin_flag[log_errors] = on php_admin_value[memory_limit] = 128M php_value[session.save_handler] = files php_value[session.save_path] = /tmp
請注意,這是一個範例文件,我建議在生產機器上使用之前對其進行修改
安裝和配置 mod_fastcgi 後,您需要為每個使用者添加一個特殊的 php 處理程序,如下所示
nano /etc/httpd/conf.d/php-fpm.conf Action fcgi-php-fpm /fcgi-php-fpm virtual Alias /fcgi-php-fpm /fcgi-php-fpm FastCgiExternalServer /fcgi-php-fpm -socket /var/run/php-fpm/web.socket -pass-header Authorization -idle-timeout 180
在你的虛擬主機文件中
<VirtualHost *:80> ServerName beforeafter.local ServerAlias www.beforeafter.local DocumentRoot /home/web/public_html/before DirectoryIndex index.htm index.html index.php ErrorLog /home/web/ba.error.log CustomLog /home/web/ba.access.log combined UseCanonicalName Off Options FollowSymlinks +Indexes RewriteEngine On AddType text/html .php AddHandler fcgi-php-fpm .php <Directory /> AllowOverride All </Directory> </VirtualHost>
您的操作名稱和處理程序名稱必須匹配才能正常工作。
之後,每個使用者都以自己的名字執行 php。
如果您不熟練配置它,我建議禁用所有不必要的 apache 模組以加快速度並關閉 SELinux。