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. webboxio http://webbox.io

  2. Rack Uygulamalarını NginX ve Unicorn’la Koşturma

  3. Uğur “vigo” Özyılmazel webBox.io kurucu ortağı, Yazılım Geliştirici https://twitter.com/vigobronx https://github.com/vigo

    http://ugur.ozyilmazel.com https://speakerdeck.com/vigo
  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
  5. Ruby Uygulama Web Sunucusu

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

    CGI, Thin … } { Sinatra, Rails, Ramaze … }
  7. `call` metoduna cevap veren Ruby nesnesi yeterlidir! return [ status,

    headers, body ]
  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ı
  9. None
  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
  11. { Middleware JSON-P Rack::Protection Rack::Cache Rack::Config Rack::Debug Rack::RespondTo Rack::GoogleAnalytics Rack::Throttle

    Rack::LinkedData Rack::Attack …
  12. Camping Coset Espresso Halcyon Mack Maveric Merb Racktools::SimpleApplication Ramaze Ruby

    on Rails Rum Sinatra Sin Vintage Waves Wee … Ruby Uygulama +
  13. None
  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!
  15. Event Driven Architecture Ana İşlem (Main Process) İşçi (Worker) İşçi

    (Worker) İşçi (Worker)
  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
  17. Unicorn

  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!
  19. Kurulum $ gem install unicorn source "https://rubygems.org" gem 'unicorn' Gemfile

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

    get '/' do "Merhaba Dünya!" end end application.rb
  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
  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
  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
  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
  26. $ ps aux | grep unicorn

  27. worker master 1396 $ kill 1396

  28. VİDEO

  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!
  30. Kaynaklar http://rack.github.io/ http://nginx.org/ http://unicorn.bogomips.org/ http://sinatrarb.com http://vagrantup.com https://github.com/vigo/owg2013-rack-unicorn-sinatra

  31. http://webbox.io http://blog.webbox.io http://twitter.com/webboxio https://github.com/webBoxio http://facebook.com/webbox.io hello@webbox.io