Các biến Nginx tương tự như SetEnv trong Apache?


82

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

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 hoàn thành?

Đây là hình nền, đề phòng trường hợp ai đó có thể đề xuấ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 cho 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 đều đ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 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 các chỉ thị.

Câu trả lời:


57

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 một $_SERVERbiến PHP mới từ NGINX, bạn cần thêm một fastcgi_parammục 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 bao gồm fastcgi_paramshoặc fastcgi.conf.


1
Cảm ơn bạn, nó thực hiện thủ thuật. Đối với những người sử dụng Perl Catalyst, giá trị bắt buộc nằm trong $ c-> engine-> env -> {MY_CUSTOM_VARIABLE}, tương tự như $ _SERVER trong php. [link] search.cpan.org/dist/Catalyst-Runtime/lib/Catalyst/Engine.pm
MIguelele

Đâ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 chỉ có thể truy xuất biến thông qua phương thức getenv. Biến không được thêm vào mảng $ _SERVER.
Pablo Ezequiel Leone

@MIguelele, biến chuỗi $ c-> engine-> env -> {SOME_ENV_VAR} hoàn toàn giống với $ ENV {SOME_ENV_VAR} được phân phối bởi giao diện fastcgi.
Znik

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

nhưng nó dành cho PHP-CGI


22
Tôi tự hỏi mục đích của các bình luận bên phải là gì :-)
lks128

Tôi đoán ông chỉ muốn hiển thị tương đương với apache như một bình luận
lloiacono

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

... nhưng vẫn rất hữu ích ;-)
Michal Gallovic

1
và đối với các giá trị trống, chỉ cần đặt '' trong phần giá trị
Subin

41

Bạn nên nhớ rằng nginx không quản lý các quy trình php như apache. 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; 
    ...
}

11

Vị trí socket fastcgi_pass cần đến trước, sau đó đến từng tham 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 tham số môi trường của bạn có thể được thêm dễ dàng vào khối xử lý 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;
        }

Tệp fastcgi_params nằm trong cùng thư mục với nginx.conf thường trông giống như sau:

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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.