2016-05-16 110 views
1

有StackOverflow上多個問題如何使用不同的FastCGI後端或類似的問題,但沒有子正在正確的 - 和嘗試,閱讀文檔(也許缺少了一個小細節小時後)我放棄了。的nginx服務器

我有以下要求:

  • /一個PHP 5.6的應用程序運行(FastCGI的後端127.0.0.1:9000
  • /crm一個PHP 7.0應用程序正在運行的有相信這是對/運行(FastCGI的後端127.0.0.1:9001
  • 事實上有幾個後端,但有了這兩個我可以讓我自己的

我試圖定義位置前綴的第一個單獨的PHP環境中,試圖刪除/crm前綴之前。但看來我是每次使用的/ php的情況下做一些錯誤的,因爲/crm

我的實際精簡配置,刪除一切不相關的所有失敗的測試:

server { 
    listen  80; 
    server_name myapp.localdev; 

    location /crm { 
     root  /var/www/crm/public; 
     index  index.php; 
     try_files $uri /index.php$is_args$args; 

     location ~ \.php$ { 
      # todo: strip /crm from REQUEST_URI 
      fastcgi_pass 127.0.0.1:9001; # 9001 = PHP 7.0 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      include  fastcgi_params; 
     } 
    } 

    location/{ 
     root  /var/www/intranet; 
     index  index.php; 
     try_files $uri /index.php$is_args$args; 

     location ~ \.php$ { 
      fastcgi_pass 127.0.0.1:9000; # 9000 = PHP 5.6 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      include  fastcgi_params; 
     } 
    } 
} 
+0

這不是你想要的答案 - 但我寫了一個類似的問題[這裏](http://serverfault.com/questions/766222/nginx-reverse-proxy-making-root-webapp-into-custom-路徑/ 766225#766225) –

+0

感謝您的評論,但它不是同一個問題。您的第三個問題,這是唯一無法解決的問題,可以通過使用crm應用程序的html基本標記輕鬆解決。 –

+1

你有幾個';'缺少,並且你的一個'try_files'的默認動作是錯誤的。這是問題嗎?那'/ crm'要去'/ index.php'而不是'/ crm/index.php'? –

回答

3

有在你的配置兩個小錯誤:

  1. try_files最後一個參數是一個內部重定向時,可以找到以前沒有任何文件。這意味着您要將CRM位置設置爲try_files $uri /crm/index.php$is_args$args;

  2. 您必須從$fastcgi_script_name中去除/crm。這樣做的推薦方法是使用fastcgi_split_path_info ^(?:\/crm\/)(.+\.php)(.*)$;

,可能爲工作的配置是這樣的:

server { 
    listen  80; 
    server_name myapp.localdev; 

    location /crm { 
     root  /var/www/crm/public; 
     index  index.php; 
     try_files $uri /crm/index.php$is_args$args; 

     location ~ \.php$ { 
      # todo: strip /crm from REQUEST_URI 
      fastcgi_pass 127.0.0.1:9001; # 9001 = PHP 7.0 

      fastcgi_split_path_info ^(?:\/crm\/)(.+\.php)(.*)$; 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 

      include  fastcgi_params; 
     } 
    } 

    location/{ 
     root  /var/www/intranet; 
     index  index.php; 
     try_files $uri /index.php$is_args$args; 

     location ~ \.php$ { 
      fastcgi_pass 127.0.0.1:9000; # 9000 = PHP 5.6 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      include  fastcgi_params; 
     } 
    } 
} 
+0

它似乎工作。 「也許」,測試相當複雜,因爲它必須在其中一臺生產服務器上完成,所以開發機器只有已安裝軟件的一個子集。是否有可能將'/ crm'路由到同一個'root',但使用不同的PHP版本?會使測試更簡單(只需測試phpinfo輸出)。 –

+0

當然,只需將/ crm位置配置爲使用相同的根目錄即可。 /phpinfo.php將使用PHP 5.6,而/crm/phpinfo.php將使用7.0。 – egergo

+0

我還沒有成功地使用配置,但它看起來最有前途。你會得到賞金。也許我會在幾天內問一些問題,本週工作太多。 –

0

在Ubuntu 14.04和Nginx的1.10運行此。

你可以試着指定插座。

PHP7

fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; 

注:PHP7插座的路徑是 「相同」 的PHP5。這不是/var/run/php7-fpm.sock。我偶然發現一些文章指出這是默認路徑。請檢查它是如何安裝在您的服務器上的。

PHP5

fastcgi_pass unix:/var/run/php5-fpm.sock; 

而且在運行PHP7,你可能會遇到一個權限被拒絕錯誤。此問題可能是由於/etc/php/7.0/fpm/pool.d/www.conf中的用戶問題引起的。凡PHP7配置用戶/組中的www-data而Nginx的用戶nginx

這是PHP7配置:

listen.owner = www-data 
listen.group = www-data 

就我而言,我改變了Nginx的用戶www數據

希望這會有所幫助。

+0

問題是沒有定義套接字或「權限被拒絕」錯誤。特定文件夾路由到特定的PHP配置是問題。 –