關於Symfony2+nginx搭建過程總結

  最近在試着用nginx+symfony搭建公司的網站,因爲nginx不支持pathinfo模式,因此必須修改nginx(我使用的是nginx1.5.1)的配置文件/etc/nginx/config.d/default.conf以使其在邏輯上支持url邏輯路徑到物理路徑的映射,如下爲個人default.conf文件內容:php

 1 server { 
 2     listen       80; 
 3     server_name  localhost;
 4     location / { 
 5         root   /usr/share/nginx/html/symfony/web; 
 6         index  index.html index.htm index.php; 
 7     }
 8     location ~ ^(.+\.php)(.*)$ { 
 9       root   /usr/share/nginx/html/symfony/web; 
10       fastcgi_index index.php;  
11       fastcgi_split_path_info ^(.+\.php)(.*)$; 
12       fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name; 
13       fastcgi_param   PATH_INFO               $fastcgi_path_info; 
14       fastcgi_param   PATH_TRANSLATED $document_root$fastcgi_path_info; 
15       fastcgi_pass 127.0.0.1:9000; 
16       include fastcgi_params;
17    }
18}

   實現url的邏輯映射後,就能夠在網頁中看到實際效果了(注意圖中被圈部分):
  html

  可是,若是在prod模式下(即訪問192.168.10.133/app.php/下的路徑)時,提示出錯「no route for get / ",這並非咱們的pathinfo配置出了問題(剛開始從這個方面着手,費老勁了),而是由於symfony2並無爲咱們提供prod模式下的內容,咱們須要修改symfony/app/routing.yml文件本身給他提供一個邏輯路徑映射,以下爲我從routing_dev.xml文件中拷過來的一個配置項:  nginx

1 # AcmeDemoBundle routes (to be removed)
2 _acme_demo:
3     resource: "@AcmeDemoBundle/Resources/config/routing.yml"

  這樣symfony就會在prod模式下就能夠經過url邏輯映射獲得src/Acme/DemoBundle/Resources/config/routing.yml文件(其內容以下所示),經過這個文件就能夠找到@AcmeDemoBundle/Controller/DemoController.php文件從而顯示出如上圖所顯示的效果了 web

1 _demo:
2      resource: "@AcmeDemoBundle/Controller/DemoController.php"
3      type:     annotation
4      prefix:   /demo    

  可是,實際訪問http://192.168.10.133/app.php/demo/hello/bean時,並無顯示出指望的效果,這時候又報了一個錯誤:
  Cannot import resource "/usr/share/nginx/html/symfony/src/Acme/DemoBundle/Resources/config/config.yml" from "/usr/share/nginx/html/symfony/app/config/config.yml".                                      app

  網上搜了下,stackoverflow上給的答案大部分是讓你在resource字段前面要縮進四個字符之類的,對個人問題不適用,後來發如今上面出錯信息的後面還有一行字說要在AppKernel.php中註冊AcmeDemoBundle之類的,因而找到/usr/share/nginx/html/symfony/app/AppKernel.php,發現有以下一句話:  網站

1 if (in_array($this->getEnvironment(), array('dev','test'))) {
2             $bundles[] = new Acme\DemoBundle\AcmeDemoBundle();
3             $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
4             $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
6             $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
7  }

    至此,大功告成,咱們只須要修改array('dev','test')爲array('dev','test','prod')便可,這樣symfony就會在prod模式下也註冊AcmeDemoBundle了,實驗結果顯示以下:
  this

   本文系原創,轉載請註明出處:http://www.cnblogs.com/beanmoon/p/3181733.htmlurl

相關文章
相關標籤/搜索