2011-11-11 26 views
63

我在Apache中使用SetEnv在虛擬主機中設置一些變量,我使用$_SERVER[the_variable]在PHP中恢復。Nginx的變量與Apache中的SetEnv類似嗎?

現在我切換到Perl Catalyst和Nginx,但似乎Nginx中的「env」指令是不一樣的。這是行不通的。如何完成?

這裏是背景圖片,以防萬一有人可以提出更好的方法或我以前的系統不能與Nginx一起使用。

  • 我對許多域使用相同的應用程序。所有數據來自具有相同結構的不同數據庫。
  • 數據庫名稱在該環境變量中被硬編碼爲虛擬主機。
  • 正如我所知道的數據庫名稱,所有查詢都會從第一個查詢轉到相應的數據庫。
  • 我可以有多個域使用相同的數據庫,只需在指令中包含相同的變量。

回答

46

NGINX不管理像apache這樣的後端進程,所以它不會影響它們的環境。要從NGINX設置一個新的$_SERVER PHP變量,您需要添加一個新的fastcgi_param條目以及其餘的條目。無論你在哪裏,包括fastcgi_paramsfastcgi.conf

+0

謝謝你,它訣竅。對於使用Perl Catalyst的人來說,所需的值在$ c-> engine-> env - > {MY_CUSTOM_VARIABLE}中,類似於PHP中的$ _SERVER。 [link] http://search.cpan.org/dist/Catalyst-Runtime/lib/Catalyst/Engine.pm – MIguelele

+0

對我來說這不是事實......當我像這樣設置變量時,我只能檢索變量通過getenv方法。該變量未添加到$ _SERVER數組中。 –

88
location/{ 
... 
    fastcgi_param APPLICATION_ENV production; 
    fastcgi_param APPLICATION_CONFIG user; 
... 
} 

但它是PHP,CGI

+21

我想知道什麼是在右邊的意見:-) – Andrew

+0

我想他只是想顯示Apache的等價物作爲評論 – lloiacono

+5

然後,他失敗了非常可怕的,因爲這不是如何在Apache中定義環境變量。 – rightfold

32

你應該記住,如Apache這是否nginx的不管理PHP進程。您應該配置php-fpm或php-cgi,依靠在您的服務器上運行php的內容。

PHP-CGI

... 
env[APP_ENV] = production 
... 

PHP-FPM

location/{ 
    ... 
    fastcgi_param APP_ENV production; 
    ... 
} 
5

fastcgi_pass插座位置需要先來,然後每個fastcgi_param參數。您還可以在nginx config文件夾中的文件中列出變量,然後包含該文件。包含文件通常具有名稱fastcgi_params。您的環境參數,可以很容易地加入到PHP處理區塊:

 location ~ \.php$ { 
      fastcgi_pass  unix:/your_sock_location/nginxFastCGI.sock; 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      fastcgi_param APP_ENV production; 
      include   fastcgi_params; 
     } 

fastcgi_params文件位於同一目錄中nginx.conf往往是這樣的:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
fastcgi_param QUERY_STRING  $query_string; 
fastcgi_param REQUEST_METHOD  $request_method; 
fastcgi_param CONTENT_TYPE  $content_type; 
fastcgi_param CONTENT_LENGTH  $content_length; 

fastcgi_param SCRIPT_NAME  $fastcgi_script_name; 
fastcgi_param REQUEST_URI  $request_uri; 
fastcgi_param DOCUMENT_URI  $document_uri; 
fastcgi_param DOCUMENT_ROOT  $document_root; 
fastcgi_param SERVER_PROTOCOL $server_protocol; 
fastcgi_param HTTPS    $https if_not_empty; 

fastcgi_param GATEWAY_INTERFACE CGI/1.1; 
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; 

fastcgi_param REMOTE_ADDR  $remote_addr; 
fastcgi_param REMOTE_PORT  $remote_port; 
fastcgi_param SERVER_ADDR  $server_addr; 
fastcgi_param SERVER_PORT  $server_port; 
fastcgi_param SERVER_NAME  $server_name;