zoukankan      html  css  js  c++  java
  • Nginx + unicorn 运行多个Rails应用程序

    PS:第一次写的很详细,可惜发布失败,然后全没了,这是第二次,表示只贴代码,剩下的自己领悟好了,这就是所谓的一鼓作气再而衰吧,希望没有第三次。

    版本:

      ruby 2.1.0

      rails 4.0.2

      nginx 1.5.8 mainline version

      unicorn 4.7.0

     /usr/local/nginx/conf/nginx.conf

     1 user NginxUser NginxGroup;
     2 worker_processes  1;
     3 
     4 events {
     5     worker_connections  1024;
     6 }
     7 
     8 http {
     9     include       mime.types;
    10     include       /usr/local/nginx/conf/conf.d/*.conf;
    11     default_type  application/octet-stream;
    12 
    13     sendfile        on;
    14     #tcp_nopush     on;
    15 
    16     keepalive_timeout  65;
    17 
    18     gzip  on;
    19 }

    /usr/local/nginx/conf/conf.d/guorj.conf

     1 upstream guorj_rails_unicorn_server {
     2   server unix:/tmp/guorj_unicorn.sock fail_timeout=0;
     3   #server 127.0.0.1:8081 fail_timeout=0;
     4 }
     5 server {
     6   listen 80;
     7   client_max_body_size 4G;
     8   server_name          guorj.com;
     9   keepalive_timeout    5;
    10   root                 /home/NginxUser/www/guorj/public;
    11   access_log           /home/NginxUser/www/guorj/log/nginx_access.log;
    12   error_log            /home/NginxUser/www/guorj/log/nginx_error.log;
    13   rewrite_log          on;
    14   index                index.html;
    15 
    16   location / {
    17     proxy_set_header Host $host;
    18     proxy_set_header X-Forwarded-Host $host;
    19     proxy_set_header X-Real-IP $remote_addr;
    20     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    21     proxy_buffering  on;
    22     proxy_redirect   off;
    23     proxy_pass       http://guorj_rails_unicorn_server;
    24   }
    25   #Rails error pages
    26   location =/500.html {
    27     root /home/NginxUser/www/guorj/public;
    28   }
    29 }

    /home/NginxUser/www/guorj/config/unicorn.rb

      1 # Sample verbose configuration file for Unicorn (not Rack)
      2 #
      3 # This configuration file documents many features of Unicorn
      4 # that may not be needed for some applications. See
      5 # http://unicorn.bogomips.org/examples/unicorn.conf.minimal.rb
      6 # for a much simpler configuration file.
      7 #
      8 # See http://unicorn.bogomips.org/Unicorn/Configurator.html for complete
      9 # documentation.
     10 # can't specify rails env
     11 rails_env = ENV["RAILS_ENV"] || "production"
     12 
     13 # Use at least one worker per core if you're on a dedicated server,
     14 # more will usually help for _short_ waits on databases/caches.
     15 worker_processes 4
     16 
     17 # Since Unicorn is never exposed to outside clients, it does not need to
     18 # run on the standard HTTP port (80), there is no reason to start Unicorn
     19 # as root unless it's from system init scripts.
     20 # If running the master process as root and the workers as an unprivileged
     21 # user, do this to switch euid/egid in the workers (also chowns logs):
     22 # user "unprivileged_user", "unprivileged_group"
     23 
     24 # Help ensure your application will always spawn in the symlinked
     25 # "current" directory that Capistrano sets up.
     26 
     27 app_root = File.expand_path('.')
     28 
     29 working_directory app_root #"/path/to/app/current" # available in 0.94.0+
     30 
     31 # listen on both a Unix domain socket and a TCP port,
     32 # we use a shorter backlog for quicker failover when busy
     33 #listen "/path/to/.unicorn.sock", :backlog => 64
     34 #listen "#{app_root}/tmp/sockets/unicorn.sock", :backlog => 64
     35 listen "/tmp/guorj_unicorn.sock", :backlog => 64
     36 listen 8081, :tcp_nopush => false # true
     37 
     38 # nuke workers after 30 seconds instead of 60 seconds (the default)
     39 timeout 120 # 30
     40 
     41 # feel free to point this anywhere accessible on the filesystem
     42 #pid "/path/to/app/shared/pids/unicorn.pid"
     43 #pid "#{app_root}/tmp/pids/unicorn.pid"
     44 pid "/tmp/guorj_unicorn.pid"
     45 
     46 # By default, the Unicorn logger will write to stderr.
     47 # Additionally, ome applications/frameworks log to stderr or stdout,
     48 # so prevent them from going to /dev/null when daemonized here:
     49 #stderr_path "/path/to/app/shared/log/unicorn.stderr.log"
     50 #stdout_path "/path/to/app/shared/log/unicorn.stdout.log"
     51 stderr_path "#{app_root}/log/unicorn.stderr.log"
     52 stdout_path "#{app_root}/log/unicorn.stdout.log"
     53 
     54 # combine Ruby 2.0.0dev or REE with "preload_app true" for memory savings
     55 # http://rubyenterpriseedition.com/faq.html#adapt_apps_for_cow
     56 preload_app true
     57 GC.respond_to?(:copy_on_write_friendly=) and
     58   GC.copy_on_write_friendly = true
     59 
     60 # Enable this flag to have unicorn test client connections by writing the
     61 # beginning of the HTTP headers before calling the application.  This
     62 # prevents calling the application for connections that have disconnected
     63 # while queued.  This is only guaranteed to detect clients on the same
     64 # host unicorn runs on, and unlikely to detect disconnects even on a
     65 # fast LAN.
     66 # check_client_connection false
     67 
     68 before_fork do |server, worker|
     69   # the following is highly recomended for Rails + "preload_app true"
     70   # as there's no need for the master process to hold a connection
     71   defined?(ActiveRecord::Base) and
     72     ActiveRecord::Base.connection.disconnect!
     73 
     74   # The following is only recommended for memory/DB-constrained
     75   # installations.  It is not needed if your system can house
     76   # twice as many worker_processes as you have configured.
     77   #
     78   # # This allows a new master process to incrementally
     79   # # phase out the old master process with SIGTTOU to avoid a
     80   # # thundering herd (especially in the "preload_app false" case)
     81   # # when doing a transparent upgrade.  The last worker spawned
     82   # # will then kill off the old master process with a SIGQUIT.
     83    old_pid = "#{server.config[:pid]}.oldbin"
     84    if old_pid != server.pid
     85      begin
     86        sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
     87        Process.kill(sig, File.read(old_pid).to_i)
     88      rescue Errno::ENOENT, Errno::ESRCH
     89      end
     90    end
     91   #
     92   # Throttle the master from forking too quickly by sleeping.  Due
     93   # to the implementation of standard Unix signal handlers, this
     94   # helps (but does not completely) prevent identical, repeated signals
     95   # from being lost when the receiving process is busy.
     96    sleep 1
     97 end
     98 
     99 after_fork do |server, worker|
    100   # per-process listener ports for debugging/admin/migrations
    101   # addr = "127.0.0.1:#{9293 + worker.nr}"
    102   # server.listen(addr, :tries => -1, :delay => 5, :tcp_nopush => true)
    103 
    104   # the following is *required* for Rails + "preload_app true",
    105   defined?(ActiveRecord::Base) and
    106     ActiveRecord::Base.establish_connection
    107 
    108   # if preload_app is true, then you may also want to check and
    109   # restart any other shared sockets/descriptors such as Memcached,
    110   # and Redis.  TokyoCabinet file handles are safe to reuse
    111   # between any number of forked children (assuming your kernel
    112   # correctly implements pread()/pwrite() system calls)
    113 end

    然后运行unicorn

    unicorn_rails -c /home/NginxUser/www/guorj/config/unicorn.rb -E production -D 

    添加第二个rails项目(请自行和第一个项目的配置对比不同,被网速把激情磨灭了)

    /usr/local/nginx/conf/conf.d/wguorj.conf 

     1 upstream wguorj_rails_unicorn_server {
     2   server unix:/tmp/wguorj_unicorn.sock fail_timeout=0;
     3   #server 127.0.0.1:8082 fail_timeout=0;
     4 }
     5 server {
     6   listen 80;
     7   client_max_body_size 4G;
     8   server_name          www.guorj.com;
     9   keepalive_timeout    5;
    10   root                 /home/NginxUser/www/wguorj/public;
    11   access_log           /home/NginxUser/www/wguorj/log/nginx_access.log;
    12   error_log            /home/NginxUser/www/wguorj/log/nginx_error.log;
    13   rewrite_log          on;
    14   index                index.html;
    15 
    16   location / {
    17     proxy_set_header Host $host;
    18     proxy_set_header X-Forwarded-Host $host;
    19     proxy_set_header X-Real-IP $remote_addr;
    20     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    21     proxy_buffering  on;
    22     proxy_redirect   off;
    23     proxy_pass       http://wguorj_rails_unicorn_server;
    24   }
    25   #Rails error pages
    26   location =/500.html {
    27     root /home/NginxUser/www/wguorj/public;
    28   }
    29 }

    /home/NginxUser/www/wguorj/config/unicorn.rb 

      1 # Sample verbose configuration file for Unicorn (not Rack)
      2 #
      3 # This configuration file documents many features of Unicorn
      4 # that may not be needed for some applications. See
      5 # http://unicorn.bogomips.org/examples/unicorn.conf.minimal.rb
      6 # for a much simpler configuration file.
      7 #
      8 # See http://unicorn.bogomips.org/Unicorn/Configurator.html for complete
      9 # documentation.
     10 # can't specify rails env
     11 rails_env = ENV["RAILS_ENV"] || "production"
     12 
     13 # Use at least one worker per core if you're on a dedicated server,
     14 # more will usually help for _short_ waits on databases/caches.
     15 worker_processes 4
     16 
     17 # Since Unicorn is never exposed to outside clients, it does not need to
     18 # run on the standard HTTP port (80), there is no reason to start Unicorn
     19 # as root unless it's from system init scripts.
     20 # If running the master process as root and the workers as an unprivileged
     21 # user, do this to switch euid/egid in the workers (also chowns logs):
     22 # user "unprivileged_user", "unprivileged_group"
     23 
     24 # Help ensure your application will always spawn in the symlinked
     25 # "current" directory that Capistrano sets up.
     26 
     27 app_root = File.expand_path('.')
     28 
     29 working_directory app_root #"/path/to/app/current" # available in 0.94.0+
     30 
     31 # listen on both a Unix domain socket and a TCP port,
     32 # we use a shorter backlog for quicker failover when busy
     33 #listen "/path/to/.unicorn.sock", :backlog => 64
     34 #listen "#{app_root}/tmp/sockets/unicorn.sock", :backlog => 64
     35 listen "/tmp/wguorj_unicorn.sock", :backlog => 64
     36 listen 8082, :tcp_nopush => false # true
     37 
     38 # nuke workers after 30 seconds instead of 60 seconds (the default)
     39 timeout 120 # 30
     40 
     41 # feel free to point this anywhere accessible on the filesystem
     42 #pid "/path/to/app/shared/pids/unicorn.pid"
     43 #pid "#{app_root}/tmp/pids/unicorn.pid"
     44 pid "/tmp/wguorj_unicorn.pid"
     45 
     46 # By default, the Unicorn logger will write to stderr.
     47 # Additionally, ome applications/frameworks log to stderr or stdout,
     48 # so prevent them from going to /dev/null when daemonized here:
     49 #stderr_path "/path/to/app/shared/log/unicorn.stderr.log"
     50 #stdout_path "/path/to/app/shared/log/unicorn.stdout.log"
     51 stderr_path "#{app_root}/log/unicorn.stderr.log"
     52 stdout_path "#{app_root}/log/unicorn.stdout.log"
     53 
     54 # combine Ruby 2.0.0dev or REE with "preload_app true" for memory savings
     55 # http://rubyenterpriseedition.com/faq.html#adapt_apps_for_cow
     56 preload_app true
     57 GC.respond_to?(:copy_on_write_friendly=) and
     58   GC.copy_on_write_friendly = true
     59 
     60 # Enable this flag to have unicorn test client connections by writing the
     61 # beginning of the HTTP headers before calling the application.  This
     62 # prevents calling the application for connections that have disconnected
     63 # while queued.  This is only guaranteed to detect clients on the same
     64 # host unicorn runs on, and unlikely to detect disconnects even on a
     65 # fast LAN.
     66 # check_client_connection false
     67 
     68 before_fork do |server, worker|
     69   # the following is highly recomended for Rails + "preload_app true"
     70   # as there's no need for the master process to hold a connection
     71   defined?(ActiveRecord::Base) and
     72     ActiveRecord::Base.connection.disconnect!
     73 
     74   # The following is only recommended for memory/DB-constrained
     75   # installations.  It is not needed if your system can house
     76   # twice as many worker_processes as you have configured.
     77   #
     78   # # This allows a new master process to incrementally
     79   # # phase out the old master process with SIGTTOU to avoid a
     80   # # thundering herd (especially in the "preload_app false" case)
     81   # # when doing a transparent upgrade.  The last worker spawned
     82   # # will then kill off the old master process with a SIGQUIT.
     83    old_pid = "#{server.config[:pid]}.oldbin"
     84    if old_pid != server.pid
     85      begin
     86        sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
     87        Process.kill(sig, File.read(old_pid).to_i)
     88      rescue Errno::ENOENT, Errno::ESRCH
     89      end
     90    end
     91   #
     92   # Throttle the master from forking too quickly by sleeping.  Due
     93   # to the implementation of standard Unix signal handlers, this
     94   # helps (but does not completely) prevent identical, repeated signals
     95   # from being lost when the receiving process is busy.
     96    sleep 1
     97 end
     98 
     99 after_fork do |server, worker|
    100   # per-process listener ports for debugging/admin/migrations
    101   # addr = "127.0.0.1:#{9293 + worker.nr}"
    102   # server.listen(addr, :tries => -1, :delay => 5, :tcp_nopush => true)
    103 
    104   # the following is *required* for Rails + "preload_app true",
    105   defined?(ActiveRecord::Base) and
    106     ActiveRecord::Base.establish_connection
    107 
    108   # if preload_app is true, then you may also want to check and
    109   # restart any other shared sockets/descriptors such as Memcached,
    110   # and Redis.  TokyoCabinet file handles are safe to reuse
    111   # between any number of forked children (assuming your kernel
    112   # correctly implements pread()/pwrite() system calls)
    113 end

    运行第二个rails程序 记得重启nginx

    unicorn_rails -c /home/NginxUser/www/wguorj/config/unicorn.rb -E production -D

    相关参考资料

    求 Nginx + Unicorn 部署 Rails 完整配置 http://ruby-china.org/topics/471

    https://github.com/huacnlee/ruby-china/blob/master/config/unicorn.rb

    https://raw.github.com/defunkt/unicorn/master/examples/unicorn.conf.rb

    unicorn官网:http://unicorn.bogomips.org/

    注运行两个rails项目的进程

    [root@GrjServer guorj]# ps aux | grep nginx
    root      1180  0.0  0.2  45108  1256 ?        Ss   17:34   0:00 nginx: master process /usr/local/nginx/sbin/nginx
    500       1181  0.0  0.3  45536  1820 ?        S    17:34   0:00 nginx: worker process      
    root      1184  0.0  0.1 103244   856 pts/0    S+   17:34   0:00 grep nginx
    [root@GrjServer guorj]# ps aux | grep unicorn
    root      1116  0.0 12.5 272756 62856 ?        Sl   17:00   0:01 unicorn_rails master -c /home/NginxUser/www/guorj/config/unicorn.rb -E production -D                                                                                          
    root      1119  0.0 12.3 272756 61680 ?        Sl   17:00   0:00 unicorn_rails worker[0] -c /home/NginxUser/www/guorj/config/unicorn.rb -E production -D                                                                                       
    root      1122  0.0 12.3 272756 61680 ?        Sl   17:00   0:00 unicorn_rails worker[1] -c /home/NginxUser/www/guorj/config/unicorn.rb -E production -D                                                                                       
    root      1125  0.0 12.3 272756 61680 ?        Sl   17:00   0:00 unicorn_rails worker[2] -c /home/NginxUser/www/guorj/config/unicorn.rb -E production -D                                                                                       
    root      1128  0.0 12.3 272756 61680 ?        Sl   17:00   0:00 unicorn_rails worker[3] -c /home/NginxUser/www/guorj/config/unicorn.rb -E production -D                                                                                       
    root      1159  1.2 12.5 272912 63008 ?        Sl   17:33   0:01 unicorn_rails master -c /home/NginxUser/www/wguorj/config/unicorn.rb -E production -D                                                                                          
    root      1162  0.0 12.3 272912 61820 ?        Sl   17:33   0:00 unicorn_rails worker[0] -c /home/NginxUser/www/wguorj/config/unicorn.rb -E production -D                                                                                       
    root      1165  0.0 12.3 272912 61820 ?        Sl   17:33   0:00 unicorn_rails worker[1] -c /home/NginxUser/www/wguorj/config/unicorn.rb -E production -D                                                                                       
    root      1168  0.0 12.3 272912 61820 ?        Sl   17:33   0:00 unicorn_rails worker[2] -c /home/NginxUser/www/wguorj/config/unicorn.rb -E production -D                                                                                       
    root      1171  0.0 12.3 272912 61820 ?        Sl   17:33   0:00 unicorn_rails worker[3] -c /home/NginxUser/www/wguorj/config/unicorn.rb -E production -D                                                                                       
    root      1186  0.0  0.1 103244   856 pts/0    S+   17:34   0:00 grep unicorn
    [root@GrjServer guorj]#
  • 相关阅读:
    C语言实现的单链表
    单链表创建链表出现问题
    Windows10更新后出现右击文件卡死
    顺序表的错误
    XML 字符串 转 JSON
    xml to json
    excel xlsx-js 细节链接
    关于javasciprt导出excel 一
    关于javasciprt导出excel 前言
    书签8
  • 原文地址:https://www.cnblogs.com/grj1046/p/3505100.html
Copyright © 2011-2022 走看看