Rack uygulamalarını Nginx ve Unicorn'la koşturma

Rack uygulamalarını Nginx ve Unicorn'la koşturma

Özgür Web Teknolojileri Günleri 2013'de yaptığım sunum. Kısa video demo: http://vimeo.com/vigo/rack-vagrant-demo, source: https://github.com/vigo/owg2013-rack-unicorn-sinatra

033485f7e18823d4ccabb24e5cb4935f?s=128

Uğur Özyılmazel

November 22, 2013
Tweet

Transcript

  1. 4.

    Ruby için web sunucusu arayüzüdür. RESPONSE ve REQUEST için http

    wrapper’dır. Web sunucusu ve Ruby’nin kolay iletişim kurmasını sağlar Ara katmanlar yardımıyla ekstra kolaylıklar sağlar
  2. 6.

    Ruby Uygulama Web Sunucusu { Middleware } { Mongrel, WEBrick,

    CGI, Thin … } { Sinatra, Rails, Ramaze … }
  3. 8.

    require 'rack' ! class MyApplication def call(env) h = {"Content-Type"

    => "text/html; charset=utf-8"} [200, h, ["Merhaba Dünya"]] end end ! run MyApplication.new Basit bir Rack uygulaması
  4. 9.
  5. 10.

    Web Sunucusu Mongrel EventedMongrel SwiftipliedMongrel WEBrick FCGI CGI SCGI LiteSpeed

    Thin { Rack Handlers * Ebb Fuzed Glassfish v3 Phusion Passenger Puma Rainbows! Reel Unicorn unixrack uWSGI Zbatery
  6. 12.

    Camping Coset Espresso Halcyon Mack Maveric Merb Racktools::SimpleApplication Ramaze Ruby

    on Rails Rum Sinatra Sin Vintage Waves Wee … Ruby Uygulama +
  7. 13.
  8. 14.

    HTTP ve Reverse Proxy sunucusu (Web sunucusu) Caching ve Load-Balancing

    özellikleri bulunuyor Düşük hafıza kullanımı ve performanslı olması tercih sebebi!
  9. 16.

    Nginx Kurulum # Ubuntu 12.04 <= add-apt-repository $ sudo aptitude

    install python-software-properties ! $ sudo add-apt-repository ppa:nginx/stable $ sudo aptitude update $ sudo aptitude install nginx ! # servisi başlatır! $ sudo service nginx start
  10. 17.
  11. 18.

    Http Server (Ruby gem’i) NginX gibi worker’lar kullanıyor Request’i Unix

    socket’ine yönlendiriyor Kendi başına otomatik olarak worker’ları yumurtluyor ve organize ediyor!
  12. 20.
  13. 21.

    # encoding: utf-8 require 'sinatra/base' ! class MyApplication < Sinatra::Base

    get '/' do "Merhaba Dünya!" end end application.rb
  14. 22.

    @dir = “/path/to/tmp/" ! worker_processes 2 working_directory @dir ! timeout

    30 listen "#{@dir}sockets/unicorn.sock", :backlog => 64 pid_file = "#{@dir}pids/unicorn.pid" old_pid = "#{pid_file}.oldbin" pid pid_file stderr_path "#{@dir}log/unicorn.stderr.log" stdout_path "#{@dir}log/unicorn.stdout.log" preload_app true ! before_exec do |server| ENV['BUNDLE_GEMFILE'] = File.expand_path('../Gemfile', File.dirname(__FILE__)) end ! before_fork do |server, worker| if File.exists?(old_pid) && server.pid != old_pid begin Process.kill("QUIT", File.read(old_pid).to_i) rescue Errno::ENOENT, Errno::ESRCH # pass end end end unicorn.rb
  15. 23.

    upstream unicorn_mysocket { server unix:/path/to/tmp/sockets/unicorn.sock fail_timeout=0; } ! server {

    server_name localhost; listen 8080; root /path/to/project; client_max_body_size 4G; keepalive_timeout 5; ! location / { try_files $uri @app; } ! location @app { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://unicorn_mysocket; } } nginx.conf
  16. 24.

    upstream unicorn_mysocket { server unix:/path/to/tmp/sockets/unicorn.sock fail_timeout=0; } ! server {

    server_name localhost; listen 8080; root /path/to/project; client_max_body_size 4G; keepalive_timeout 5; ! location / { try_files $uri @app; } ! location @app { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://unicorn_mysocket; } } nginx.conf
  17. 25.

    # encoding: utf-8 require "rubygems" require "sinatra" ! require File.expand_path

    '../application.rb', __FILE__ run MyApplication $ bundle exec unicorn -c $PWD/unicorn.rb -D $PWD/config.ru config.ru
  18. 28.
  19. 29.

    worker işlemlerinin ölçeklenmesi, işlemci (CPU) ve hafızayla doğru orantılıdır. Yavaş

    istemcilerle (slow-client) NginX gibi sunucular uğraşmalı unicorn değil! Ölçeklendirmede asıl düşünülmesi gereken back-end kısmı unicorn değil!