2011-11-11 29 views
63

Tôi sử dụng SetEnv trong Apache để đặt một số biến trong máy chủ ảo mà tôi khôi phục trong PHP bằng cách sử dụng $_SERVER[the_variable].Biến Nginx tương tự như SetEnv trong Apache?

Bây giờ tôi đang chuyển sang Perl Catalyst và Nginx, nhưng có vẻ như chỉ thị "env" trong Nginx không giống nhau. Nó không hoạt động. Làm thế nào nó có thể được thực hiện?

Đây là hình nền, chỉ trong trường hợp ai đó có thể đề xuất một cách tiếp cận tốt hơn hoặc hệ thống trước đây của tôi không hoạt động với Nginx.

  • Tôi sử dụng cùng một ứng dụng cho nhiều miền. Tất cả dữ liệu đến từ các cơ sở dữ liệu khác nhau có cùng cấu trúc.
  • Tên cơ sở dữ liệu được mã hóa cứng vào máy chủ ảo, trong biến môi trường đó.
  • Như tôi biết tên cơ sở dữ liệu, tất cả các truy vấn đi đến cơ sở dữ liệu thích hợp của nó, từ truy vấn đầu tiên.
  • Tôi có thể có nhiều tên miền sử dụng cùng một cơ sở dữ liệu, chỉ cần đưa cùng một biến vào chỉ thị.

Trả lời

46

NGINX không quản lý các quy trình phụ trợ của bạn như apache, vì vậy nó không thể ảnh hưởng đến môi trường của chúng. Để đặt biến PHP $_SERVER mới từ NGINX, bạn cần thêm mục nhập fastcgi_param mới cùng với phần còn lại của chúng. Bất cứ nơi nào bạn đang bao gồm fastcgi_params hoặc fastcgi.conf.

+0

Cảm ơn bạn, nó lừa. Đối với những người sử dụng Perl Catalyst, giá trị yêu cầu là $ c-> engine-> env -> {MY_CUSTOM_VARIABLE}, tương tự $ _SERVER trong php. [link] http://search.cpan.org/dist/Catalyst-Runtime/lib/Catalyst/Engine.pm – MIguelele

+0

Đây không phải là sự thật đối với tôi ... Khi tôi đặt biến như thế này, tôi có thể lấy biến chỉ thông qua phương pháp getenv. Biến không được thêm vào mảng $ _SERVER. –

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

nhưng nó cho PHP-CGI

+21

Tôi tự hỏi mục đích của các ý kiến ​​ở bên phải là gì :-) – Andrew

+0

Tôi đoán anh ta chỉ muốn hiển thị apache tương đương với chú thích – lloiacono

+5

Sau đó, anh ta thất bại khá khủng khiếp, vì đây không phải là cách xác định biến môi trường trong Apache . – rightfold

32

Bạn nên lưu ý, nginx mà không quản lý các quá trình php như apache không. Bạn nên cấu hình php-fpm, hoặc php-cgi, dựa vào những gì chạy php trên máy chủ của bạn.

php-cgi

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

php-fpm

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

Các fastcgi_pass ổ cắm vị trí cần đến đầu tiên, sau đó mỗi người trong số các thông sốfastcgi_param. Bạn cũng có thể liệt kê các biến trong một tệp trong thư mục cấu hình nginx, sau đó bao gồm tệp đó. Tệp bao gồm thường có tên fastcgi_params. các thông số môi trường của bạn có thể được thêm vào một cách dễ dàng để xử lý php khối:

 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; 
     } 

Các fastcgi_params tập tin nằm trong thư mục tương tự như nginx.conf thường trông như thế này:

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; 
Các vấn đề liên quan