目次
Rails で API サーバ を開発していたときに、 複数の開発環境を作った方法です。
環境
- Rails 4
- Passenger
- Nginx
- AWS EC2 Amazon Linux
- rbenv
経緯
APIサーバを開発していたのですが、テスト用にいくつか環境がほしいという声が強くなったので、 nginx の設定を活用して 1台のEC2サーバで複数の開発環境を作りました。
Nginx の設定
ポイントは location ~ ^/dev-([^\/]+)(/.*$)
です。 URL を正規表現でマッチさせて、 マッチした文字列のディレクトリへ誘導します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
worker_processes 8; events { worker_connections 1024; } http { passenger_root /home/ec2-user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/passenger-5.0.18; passenger_ruby /home/ec2-user/.rbenv/versions/2.2.2/bin/ruby; include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name 0.0.0.0; more_clear_headers Server; more_clear_headers ETag; more_clear_headers X-Powered-By; more_clear_headers X-Runtime; location ~ ^/Ringing { return 444; } location ~ ^/dev-([^\/]+)(/.*$) { client_max_body_size 10M; index index.html index.htm; passenger_enabled on; root /var/rails/dev-$1/public; passenger_base_uri /var/rails/dev-$1; passenger_document_root /var/rails/dev-$1/public; rails_spawn_method smart; rails_env development; } location / { client_max_body_size 10M; index index.html index.htm; passenger_enabled on; root /var/rails/server/public; passenger_base_uri /var/rails/server2; rails_spawn_method smart; rails_env development; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } |
このようにすると、 http://example.com/abc
にアクセスすれば /var/rails/server2
内のコードが使われますが、 例えば http://example.com/dev-hello/abc
にアクセスすると /var/rails/dev-hello
内のコードが使われます。 この設定なら、開発者ごとにディレクトリを作るようにすれば、開発者の増減に応じて nginx の設定を変更する必要がありません。
location ~ ^/Ringing
は、ログに出ていた攻撃のようなリクエストを防ぐためのロケーション設定です。
注意点
APIサーバだと多くの場合これだけで事足りると思いますが、Webページの開発だと更に設定が必要です。 静的ファイルの URL をうまく変えてやらないと、 どの環境でも同じファイルを使うことになります。