2013-10-04 37 views
5

root権限でサーバ全体を実行することなく、プロダクションRailsサーバをポート80にバインドする方法を探しています。私の質問は基本的に "Is there a way for non-root processes to bind to "privileged" ports (<1024) on Linux?"と同じですが、Railsでこれを行う必要があります。現在のところ、私が参照した質問の上位2つの回答では、CAP_NET_BIND_SERVICEの権限をRubyインタプリタに許可する(おそらく良い考えではない)か、サーバを起動した後にroot特権を削除する必要があります(I'm not sure is possible with Ruby)。何か案は?RailsサーバをLinux上のポート80にバインドしてルートとして実行しないでください

+1

従来のWebサーバーをポート80で実行し、別のポートで実行されているRailsサーバーに要求を転送するオプションがありますか?たとえば、[nginx](http://wiki.nginx.org/Main)を実行し、[thin](http://code.macournoyer.com/thin/)または[unicorn](http:// unicorn.bogomips.org/)が非特権ポートで動作しています。 –

+0

これを実際にやりたいと思う確率は非常に低いです。 Thin、Mongrel、Puma、Unicornなど、Ruby以外のサーバの後ろに通常の使用パターンでなければならないもの。 [この質問](http://stackoverflow.com/questions/15469598/why-thin-behind-nginx)を参照してください。 – colinm

+0

ええ、これは私が実際に私自身のためにサーバをセットアップするために誰かの助けなしに自分でプロダクションアプリケーションを配備しようとした最初のことです。あるいはHerokuのようなPaaSです。だから、私が望むかどうかわからないという良いチャンスがあります。 ポート80のシン・バインディングの代替案(nginxのように、Jimが彼のコメントで言ったように)を示唆する詳細な回答を投稿したいのであれば、私はこれを有効な答えとして受け入れます。 – Ajedi32

答えて

4

ですから、基本的に答えはあなたではありません。この作業を行うには本当に面倒な方法がいくつかあるかもしれませんが、実際にこれをやりたいと思う可能性は非常に低いです。代わりに、非特権ポートでRailsを実行し、nginxのような実際のWebサーバを設定してRailsに転送してください。

超簡単な例として、nginxのとあなたは次のようになりますconfigファイルの使用する可能性があります:それはあなたのインフラをより柔軟になるため

upstream rails_server { 
    server localhost:3000; 
} 

server { 
    listen 80; 

    location/{ 
    root /home/deploy_user/rails_app/public; 
    try_files $uri @missing; 
    } 

    location @missing { 
    proxy_pass http://rails_server; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 
    } 
} 

をこのソリューションは、また、より優れた長期的です。たとえば、アプリケーションを複数のマシンにスケールアップする必要がある場合は、nginxをロードバランサとして使用して、別のマシン上で実行されている一連のRailsサーバーに要求を転送させることができます。

関連する問題