从 Nginx/Passenger 中托管的 Ruby/Rails 应用程序的标头设置环境变量

从 Nginx/Passenger 中托管的 Ruby/Rails 应用程序的标头设置环境变量

我为 Redmine 安装了一个服务器,使用 Nginx/Passenger 运行。该服务器还托管 Gitlab,运行良好。

我为 Redmine 安装了某种 SSO 插件(我找到并安装了),它需要一个环境变量来填充用户名:这就是问题所在。到目前为止,我可以分别地

  • 从 X-Forwarded-User 标头获取用户名
  • 自动连接到 Redmine,将用户名作为常量值传递
  • 在测试当前转发值后,自动连接到 Redmine,将正确的用户名作为常量值传递 => 这很难看,需要对每个现有用户进行测试

但是我无法直接使用转发值设置用户名,看起来 $http_x_forwarded_user 变量没有被评估......

有一个很好的解决方案吗?我当前的 Nginx/Passenger 配置:


upstream gitlab-workhorse {
  server unix:/var/opt/gitlab/gitlab-workhorse/socket fail_timeout=0;
}

server {
  listen 0.0.0.0:80;
  listen [::]:80 ipv6only=on default_server;
  server_name server.example.com
  server_tokens off; ## Don't show the nginx version number, a security best practice

  root /opt/gitlab/embedded/service/gitlab-rails/public;

  location / {
    proxy_read_timeout 300;
    proxy_connect_timeout 300;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass http://gitlab-workhorse;
    access_log /var/log/nginx/gitlab_access.log;
    error_log /var/log/nginx/gitlab_error.log;
  }

  location ~ ^/redmine(/.*|$) {
        alias /opt/redmine/public$1;
        passenger_base_uri /redmine;
        passenger_app_root /opt/redmine;
        passenger_document_root /opt/redmine/public;
        passenger_enabled on;
        access_log /var/log/nginx/redmine_access.log;
        error_log /var/log/nginx/redmine_error.log;

        # returns "dave", who is the connected user => great !
        return 200 $http_x_forwarded_user;

        # connects on Redmine as Dave => marvelous !
        passenger_env_var REMOTE_USER dave;

        # working but ugly solution
        if ($http_x_forwarded_user = "dave") {
            passenger_env_var REMOTE_USER dave;
        }
        if ($http_x_forwarded_user = "john") {
            passenger_env_var REMOTE_USER john;
        }
#       ... and so on for every single user having an account...

        # fails : "user does not exist in database" => $http_x_forwarded_user not being evaluated ??
        passenger_env_var REMOTE_USER $http_x_forwarded_user;
    }
}

答案1

根据此错误报告,目前已损坏:

passenger_env_var VAR $nginx_var;设置VAR$nginx_var,而不是其值。

可能的解决方法:

  • 放弃passenger(但保留Nginx
  • 通过以下方式设置redmineuwsgi, 哪个

旨在开发用于构建托管服务的完整堆栈。

应用服务器(用于各种编程语言和协议)、代理、进程管理器和监视器都是使用通用 API 和通用配置样式实现的。

由于其可插入式架构,它可以扩展以支持更多平台和语言。

目前,您可以用 C、C++ 和 Objective-C 编写插件。

名称中的“WSGI”部分是为了向同名的 Python 标准致敬,因为它是该项目开发的第一个插件。

多功能性、性能、低资源使用率和可靠性是该项目的优势(也是唯一遵循的规则)。

我自己在多个生产环境中使用它,强烈推荐!

相关内容