1

このRailscastと非常によく似たセットアップでCapistranoを介してVPSにデプロイされるRailsアプリがあります。mydomain.co.ukとadmin.mydomain.co.ukの両方があります。サブドメインは、lvh.meと標準のWebbrickサーバーを使用してローカルで正常に機能しますが、本番環境ではadmin.mydomain.co.ukはmydomain.co.ukとまったく同じコンテンツを表示します。

私のroutes.rbファイル:

class AdminDomain
  def self.matches?(request)
    puts "Sub = #{request.subdomain}"
    request.subdomain.present? && request.subdomain == "admin"
  end
end

MyApp::Application.routes.draw do

  constraints(AdminDomain) do
    scope :module => "admin" do
      match '', to: 'admin#index'

      resources :users
    end
  end

  # All the mydomain.co.uk routes...

私のNginx構成:

upstream unicorn {
  server unix:/tmp/unicorn.<%= application %>.sock fail_timeout=0;
}

server {
  listen 80;
  root <%= current_path %>/public;

  server_name mydomain.co.uk admin.mydomain.co.uk;

  listen 443 ssl;
  ssl_certificate /home/deployer/mydomain_combined.crt;
  ssl_certificate_key /home/deployer/mydomain.key;
  proxy_set_header X-Forwarded-Proto $scheme;

  auth_basic            "Restricted";
  auth_basic_user_file  htpasswd;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  location = /favicon.ico {
    expires    max;
    add_header Cache-Control public;
  }

  if (-f $document_root/system/maintenance.html) {
    return 503;
  }

  error_page 503 @maintenance;

  location @maintenance {
    rewrite  ^(.*)$  /system/maintenance.html last;
    break;
  }

  try_files $uri/index.html $uri @unicorn;
  location @unicorn {
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://unicorn;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}

私が持っている唯一の考えは、NginxがリクエストURLをユニコーンに渡していないということです。SSLでも同様の問題が発生しましたが、を追加することで解決しましたproxy_set_header X-Forwarded-Proto $scheme;。NginxとUnicornの本番環境でサブドメインを正しく機能させるにはどうすればよいですか?

4

1 に答える 1

2

私のセットアップでは、本番環境でrequest.subdomainは「admin.mydomain」に設定されていたようですが、開発環境では「admin」でした。

したがって、これを正規表現を使用してroutes.rbに追加すると、ローカルと本番サーバーの両方で機能します。

constraints :subdomain => /admin.*/ do
  scope :module => "admin" do
    root to: 'admin#index'
  end
end
于 2012-09-12T10:04:00.577 に答える