我为 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 标准致敬,因为它是该项目开发的第一个插件。
多功能性、性能、低资源使用率和可靠性是该项目的优势(也是唯一遵循的规则)。
我自己在多个生产环境中使用它,强烈推荐!