Defina as variáveis de ambiente do cabeçalho para o aplicativo Ruby / Rails hospedado no Nginx / Passenger

2

Eu instalei um servidor para o Redmine, rodando com o Nginx / Passenger. O servidor também hospeda o Gitlab e corre bem.

Eu coloquei algum tipo de plugin SSO para o Redmine (que eu encontrei e instalei) e ele precisa de uma variável de ambiente para ser preenchida com o nome do usuário: é aí que está ficando complicado. Até agora posso separadamente :

  • obtenha o nome de usuário do cabeçalho X-Forwarded-User
  • conecte-se automaticamente ao Redmine passando o nome de usuário como um valor constante
  • conecte-se automaticamente ao Redmine passando o nome de usuário correto como um valor constante depois de testar o valor atual de encaminhamento = > isso é feio e requer fazer um teste para cada usuário existente

Mas não consigo definir diretamente o nome de usuário com o valor encaminhado, parece que a variável $ http_x_forwarded_user não está sendo avaliada ...

Existe uma solução legal? Minha configuração atual do 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;
    }
}
    
por leguminator 04.10.2017 / 14:42

1 resposta

0

De acordo com o relatório de erros , isso está quebrado:

passenger_env_var VAR $nginx_var; sets VAR to $nginx_var, not its value.

Solução possível:

  • Largue passenger (mas mantenha Nginx )
  • Configurar o redmine por meio de uwsgi , que

aims at developing a full stack for building hosting services.

Application servers (for various programming languages and protocols), proxies, process managers and monitors are all implemented using a common api and a common configuration style.

Thanks to its pluggable architecture it can be extended to support more platforms and languages.

Currently, you can write plugins in C, C++ and Objective-C.

The “WSGI” part in the name is a tribute to the namesake Python standard, as it has been the first developed plugin for the project.

Versatility, performance, low-resource usage and reliability are the strengths of the project (and the only rules followed).

Usando isso sozinho em vários ambientes de produção, recomendo!

    
por 04.10.2017 / 16:09