web-dev-qa-db-ja.com

Nginx / PassengerでホストされているRuby / Railsアプリのヘッダーから環境変数を設定します

Nginx/Passengerで実行されるRedmine用のサーバーをインストールしました。サーバーはGitlabもホストしており、うまく機能します。

Redmine用のある種のSSOプラグイン(見つけてインストールしたもの)を配置しましたが、ユーザー名を入力するための環境変数が必要です。ここで注意が必要です。これまでのところ私はできます別々に

  • x-Forwarded-Userヘッダーからユーザー名を取得します
  • redmineに自動接続し、ユーザー名を定数値として渡します
  • redmineに自動接続し、現在転送されている値をテストした後、正しいユーザー名を定数値として渡します=> that IS醜く、既存のユーザーごとにテストを行う必要があります

しかし、転送された値でユーザー名を直接設定することはできません。$ 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;
    }
}
3
leguminator

このバグレポート によると、これは現在壊れています:

passenger_env_var VAR $nginx_var; VARをその値ではなく$nginx_varに設定します。

考えられる回避策:

  • passengerを削除します(ただし、Nginxは保持します)
  • wsgi を介してredmineをセットアップします。

ホスティングサービスを構築するためのフルスタックの開発を目指しています。

アプリケーションサーバー(さまざまなプログラミング言語とプロトコル用)、プロキシ、プロセスマネージャー、モニターはすべて、共通のAPIと共通の構成スタイルを使用して実装されます。

プラグ可能なアーキテクチャのおかげで、より多くのプラットフォームと言語をサポートするように拡張できます。

現在、プラグインはC、C++、Objective-Cで記述できます。

名前の「WSGI」の部分は、プロジェクト用に最初に開発されたプラグインであるため、名前の由来となったPython標準への賛辞です。

汎用性、パフォーマンス、低リソース使用量、および信頼性がプロジェクトの強みです(そして従う唯一のルール)。

これを複数の実稼働環境で自分で使用することを強くお勧めします。

1
gf_