Назад | Перейти на главную страницу

Установите переменные среды из заголовка для приложения Ruby / Rails, размещенного в Nginx / Passenger

Я установил сервер для Redmine, работающий с Nginx / Passenger. На сервере также размещается Gitlab, и все идет хорошо.

Я поставил какой-то плагин SSO для 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;
    }
}

В соответствии с этот отчет об ошибке, в настоящее время это не работает:

passenger_env_var VAR $nginx_var; наборы VAR к $nginx_var, а не его ценность.

Возможное решение:

  • Падение passenger (но держите Nginx)
  • Настроить Redmine через uwsgi, который

направлена ​​на разработку полного набора услуг хостинга.

Серверы приложений (для различных языков программирования и протоколов), прокси, менеджеры процессов и мониторы - все реализовано с использованием общего API и единого стиля конфигурации.

Благодаря подключаемой архитектуре его можно расширить для поддержки большего количества платформ и языков.

В настоящее время вы можете писать плагины на C, C ++ и Objective-C.

Часть «WSGI» в названии - дань уважения одноименному стандарту Python, поскольку это был первый разработанный плагин для проекта.

Универсальность, производительность, низкое использование ресурсов и надежность - сильные стороны проекта (и единственные правила, которым следует следовать).

Я сам использую это в нескольких производственных средах, очень рекомендую!