设置Symfony2以使用apache + php-fpm

时间:2014-02-02 16:42:57

标签: apache symfony config php

如何设置Symfony2与Apache(Apache 2.4)结合使用php-fpm?

目的是摆脱.htaccess文件并将所有内容移到apache配置中。

不用担心PHP-FPM,配置看起来像这样:

<VirtualHost *:80>
  ServerName mysymfonyproject.com
  ServerAlias www.mysymfonyproject.com
  ErrorLog  /path/to/logs/mysymfonyproject_error.log
  CustomLog /path/to/logs/mysymfonyproject_access.log combined

  DocumentRoot "/path/to/sites/mysymfonyproject/web"
  <Directory "/path/to/sites/mysymfonyproject/web">
    AllowOverride None
    Require all granted

    ## Start directives copied from standard Sf .htaccess
    DirectoryIndex app.php
    <IfModule mod_rewrite.c>
        RewriteEngine On

        RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
        RewriteRule ^(.*) - [E=BASE:%1]

        RewriteCond %{ENV:REDIRECT_STATUS} ^$
        RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]

        RewriteCond %{REQUEST_FILENAME} -f
        RewriteCond %{REQUEST_URI} .*\.php

        RewriteCond %{REQUEST_FILENAME} -f
        RewriteRule .? - [L]

        RewriteRule .? %{ENV:BASE}/app.php [L]
    </IfModule>
    ## End directives copied from standard Sf .htaccess
  </Directory>
</VirtualHost>

这个帖子让我发表我自己的发现(如果我弄错了,也许可以纠正!)。

2 个答案:

答案 0 :(得分:3)

我更喜欢使用ProxyPassMatch来完成这项工作。使用此方法,您的.htaccess中的重写规则不需要更改。

这是我的Apache2 vhost文件:

<VirtualHost 192.168.100.51:80>                                                     
ServerName grae.labs.brainglove.com                                             
ServerAlias www.grae.labs.brainglove.com                                        

DocumentRoot /srv/symfony2/2.4.4/grae/web                                       
DirectoryIndex app_dev.php                                                      

ProxyPassMatch  ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9001/srv/symfony2/2.4.4/grae/web/$1                                                                             

<Directory /srv/symfony2/2.4.4/grae/web>                                        
    AllowOverride All                                                           
    Options FollowSymLinks                                                      
    Require all granted
</Directory>

ErrorLog /var/log/httpd/grae.labs.brainglove.com_error.log
CustomLog /var/log/httpd/grae.labs.brainglove.com_access.log combined

您需要添加的唯一行是ProxyPassMatch。其他一切都保持不变。

不要忘记更改symfony2网络目录的IP地址和路径。

答案 1 :(得分:0)

要将请求传递给PHPFPM,建议的RewriteRule为:

RewriteRule ^(.*\.php(/.*)?)$ fcgi://uds=%2fpath%2fto%2fwww.sock/%{REQUEST_FILENAME} [P,END]

这就是我最终的结果。它似乎到目前为止工作,但也许有更好的方法?

<VirtualHost *:80>
  ServerName mysymfonyproject.com
  ServerAlias www.mysymfonyproject.com
  ErrorLog  /path/to/logs/mysymfonyproject_error.log
  CustomLog /path/to/logs/mysymfonyproject_access.log combined

  DocumentRoot "/path/to/sites/mysymfonyproject/web"
  <Directory "/path/to/sites/mysymfonyproject/web">
    AllowOverride None
    Require all granted

    ## Start directives copied from standard Sf .htaccess
    DirectoryIndex app.php
    <IfModule mod_rewrite.c>
        RewriteEngine On

        RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
        RewriteRule ^(.*) - [E=BASE:%1]

        RewriteCond %{ENV:REDIRECT_STATUS} ^$
        RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]

        RewriteCond %{REQUEST_FILENAME} -f
        RewriteCond %{REQUEST_URI} .*\.php
        # Need to add the phpfpm call here so that php files (including app_dev.php) are passed to FPM
        RewriteRule ^(.*\.php(/.*)?)$ fcgi://uds=%2fpath%2to%2fwww.sock/%{REQUEST_FILENAME} [P,END]

        RewriteCond %{REQUEST_FILENAME} -f
        RewriteRule .? - [L]

        RewriteRule .? %{ENV:BASE}/app.php [L]

        # The main phpfpm call is added at the end to pass php requests through to FPM
        RewriteRule ^(.*\.php(/.*)?)$ fcgi://uds=%2fpath%2to%2fwww.sock/%{REQUEST_FILENAME} [P,END]
    </IfModule>
    ## End directives copied from standard Sf .htaccess
  </Directory>
</VirtualHost>