Cách mở rộng ứng dụng Ruby on Rails qua nhiều server (Phần 1)
Xin chúc mừng là theo thứ tự. Trang web đang đạt được sức hút và bạn đang phát triển nhanh chóng. Ruby là ngôn ngữ lập trình của bạn và Rails? Khung công việc của bạn. Như vậy, bạn đang gặt hái được những lợi ích từ những nỗ lực của bạn và chia sẻ niềm vui với những khách hàng hài lòng nhờ ứng dụng tuyệt vời của bạn.Tuy nhiên, bạn bắt đầu lo lắng khi đối mặt với một thách thức mới: đáp ứng số lượng khách ngày càng tăng của bạn (tức là mở rộng quy mô).
Bất chấp những tranh cãi về chủ đề này, ngay cả khi bạn đang chạy một trang web cực kỳ bận rộn (được cung cấp bởi Ruby và Rails), bạn vẫn có thể tiếp tục phục vụ khách hàng của bạn một cách kịp thời. Key để đạt được điều này là bằng cách mở rộng ứng dụng của bạn, hoặc nói cách khác, phân phối tải của nó trên nhiều server nhằm xử lý các việc chính xác này và không có gì khác.
Trong bài viết DigitalOcean này, ta sẽ xem cách đơn giản chia tỷ lệ các ứng dụng Ruby on Rails theo chiều ngang, phân phối tải của nó trên nhiều máy chạy trên Unicorn, tất cả đều được cài đặt cẩn thận đằng sau một bộ cân bằng tải chính chạy server Nginx HTTP, có nhiệm vụ chào đón và xử lý các yêu cầu đến và cân bằng tải.
<b> Hướng dẫn này bao gồm việc phân phối ứng dụng của bạn đến nhiều server . Tuy nhiên, để triển khai đầy đủ ứng dụng của bạn, bạn cần cài đặt nó với database . Các bài tiếp theo trong loạt bài này đề cập đến việc kết nối server của bạn với database MySQL hoặc PostgreSQL . </b>
Bảng chú giải
1. Triển khai ứng dụng có thể mở rộng
- Server ứng dụng Unicorn
- Nginx HTTP Server / Reverse-Proxy / Load-Balancer
- Quá trình chuẩn bị triển khai của ta
- Kiến trúc cuối cùng
2. Chuẩn bị Server và Hệ điều hành
3. Cài đặt server ứng dụng
- Cài đặt môi trường Ruby
- Cài đặt rail
- Cài đặt Unicorn
- Tạo một ứng dụng rail mẫu
- Cấu hình Unicorn
- Chạy Unicorn
- Tìm địa chỉ IP của server để cấu hình Nginx
4. Cài đặt Nginx làm Reverse-Proxy và Load-Balancer
- Cài đặt Nginx
- Cấu hình Nginx
Triển khai ứng dụng có thể mở rộng
Việc triển khai các ứng dụng hoặc xuất bản chúng trực tuyến, về mặt kỹ thuật có thể có những ý nghĩa khác nhau và bản thân quá trình này có thể diễn ra ở các cấp độ khác nhau. Trước đây, ta đã đề cập đến nhiều cách triển khai ứng dụng Rails, sử dụng các server khác nhau (tức là Unicorn và Passenger), và thậm chí đã xem cách tự động hóa quy trình bằng các công cụ khác nhau cho công việc (ví dụ: Capistrano và Mina).
Để có một kiến trúc có thể mở rộng [đơn giản], ta sẽ chia cấu trúc triển khai của bạn thành hai yếu tố chính:
Server ứng dụng (Unicorn / Rails)
Server HTTP mặt trước / Bộ cân bằng tải (Nginx)
Lý do chính cho sự ưa thích của ta đối với server ứng dụng Unicorn là vì chức năng nâng cao của nó và cách đơn giản mà nó có thể được triển khai - và duy trì.
Server Nginx HTTP và Reverse Proxy ngày càng phổ biến sẽ là bộ cân bằng tải của ta , có nhiệm vụ phân phối tải trên các server ứng dụng dựa trên Unicorn.
Do đó, ta sẽ đề cập đến hai lĩnh vực rõ ràng riêng biệt.
Chuẩn bị (và triển khai) server ứng dụng Rails chạy Unicorn.
Chuẩn bị một Reverse Proxy cân bằng tải, mặt trước dựa trên Nginx để phân phối tải trên (các) Unicorn.
Tương tự như các hướng dẫn và bài viết trước đây của ta , ta sẽ tiếp tục sử dụng version hệ điều hành CentOS mới nhất hiện có cho các lựa chọn thiết kế phù hợp hoàn hảo với mục tiêu đơn giản và ổn định của ta .
Lưu ý: Khi bạn đi qua bài viết này, bạn sẽ thấy các liên kết dành cho những người khác thảo luận sâu hơn về các chủ đề nhất định. Nếu bạn muốn tìm hiểu thêm về chúng, hãy xem xét chúng.
Server ứng dụng Unicorn
Unicorn là một server ứng dụng đáng chú ý có chứa các ứng dụng Rails để xử lý các yêu cầu đến. Các server ứng dụng này sẽ chỉ xử lý các yêu cầu cần xử lý, sau khi chúng được lọc và xử lý trước bởi (các) server Nginx phía trước, hoạt động như một bộ cân bằng tải.
Là một server ứng dụng web rất trưởng thành, Unicorn hoàn toàn có đầy đủ tính năng. Nó từ chối bằng cách thiết kế cố gắng làm mọi thứ và chỉ xử lý những gì cần phải làm bởi một ứng dụng web và nó ủy thác phần còn lại của trách nhiệm cho hệ điều hành (tức là các quy trình tung hứng).
Quy trình tổng thể của Unicorn sinh ra các công nhân để phục vụ các yêu cầu. Quá trình này cũng giám sát công nhân để ngăn chặn bộ nhớ và xử lý các vấn đề đáng kinh ngạc liên quan. Điều này nghĩa là đối với administrator hệ thống là nó sẽ giết một quy trình, ví dụ, nếu quá trình đó mất quá nhiều thời gian để hoàn thành một tác vụ hoặc trong trường hợp xảy ra sự cố bộ nhớ.
Lưu ý: Để tìm hiểu về các server ứng dụng web Ruby khác nhau và hiểu Rack là gì, hãy xem bài viết So sánh các Server Web (Rack) dành cho Ứng dụng Web Ruby của ta .
Nginx HTTP Server / Reverse-Proxy / Load-Balancer
Server Nginx HTTP, được thiết kế từ đầu để hoạt động như một web server đa năng, mặt trước. Nó có khả năng phục vụ các file tĩnh (ví dụ: hình ảnh, file văn bản, v.v.) cực kỳ tốt, cân bằng kết nối và đối phó với một số nỗ lực khai thác nhất định. Nó sẽ đóng role là điểm nhập đầu tiên của tất cả các yêu cầu và sẽ phân phối chúng, sẽ được xử lý, các server ứng dụng web chạy Unicorn.
Quá trình chuẩn bị triển khai của ta
Bắt đầu với phần sau, ta sẽ thực hiện các quy trình sau để chuẩn bị cài đặt triển khai ứng dụng phân tán, cân bằng tải của ta .
Cập nhật hệ điều hành [*]
Nhận các công cụ cơ bản cần thiết để triển khai [*]
Cài đặt Ruby, Rails và thư viện
Cài đặt Ứng dụng (tức là Unicorn) và server HTTP (Nginx)
Cấu hình Nginx để phân phối tải trên TCP
Lưu ý: Các mục được đánh dấu trong danh sách là các thủ tục cần được thực hiện trên tất cả các server được cấp phép, dù role được chỉ định của chúng là server ứng dụng hay máy cân bằng tải.
Kiến trúc cuối cùng
Dưới đây là ví dụ về kiến trúc cuối cùng của ta sẽ trông như thế nào đối với việc phân phối tải trên các server và chia tỷ lệ theo chiều ngang.
Client Request ----> Nginx (Reverse-Proxy / Load-Balancer) | /|\ | | `-> App. Server I. 10.128.xxx.yy1:8080 # Our example | `--> App. Server II. 10.128.xxx.yy2:8080 `----> ..
Chuẩn bị Server và Hệ điều hành
Ta sẽ bắt đầu cài đặt với việc chuẩn bị tất cả các server sẽ chạy Unicorn hoặc Nginx.
Để cài đặt Ruby và ứng dụng cần thiết khác (ví dụ như server của ta ), trước tiên ta cần chuẩn bị server CentOS được vận chuyển tối thiểu và trang bị cho nó một số công cụ phát triển mà ta cần.
Chạy lệnh sau để cập nhật các công cụ mặc định của server dựa trên CentOS của bạn:
yum -y update
Cài đặt gói ứng dụng có chứa một số công cụ phát triển bằng cách chạy lệnh sau:
yum groupinstall -y 'development tools'
Một số gói ta cần cho hướng dẫn này (ví dụ: libyaml-devel, nginx, v.v.) không được tìm thấy trong repository lưu trữ CentOS chính thức. Để đơn giản hóa mọi thứ và không phải đối phó với việc cài đặt chúng theo cách thủ công, ta sẽ thêm repository EPEL cho trình quản lý gói YUM để sử dụng.
# Enable EPEL Repository sudo su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm' # Update everything, once more. yum -y update
Cuối cùng, ta cần lấy curl-devel
và một số công cụ và thư viện khác cho hướng dẫn này (ví dụ: Rails cần sqlite-devel).
Để cài đặt chúng, hãy chạy như sau:
yum install -y curl-devel nano sqlite-devel libyaml-devel
Cài đặt server ứng dụng
Trong bước này, ta sẽ chuẩn bị (các) server sẽ chạy Rails trên server ứng dụng Unicorn.
Hãy bắt đầu với việc chuẩn bị Ruby và Rails.
Cài đặt môi trường Ruby
Lưu ý: Phần này là phần tóm tắt của bài viết dành riêng của ta Cách cài đặt Ruby 2.1.0 trên CentOS 6.5 .
Lưu ý: Bạn cần thực hiện các hướng dẫn từ phần trước cùng với phần sau trên tất cả các server ứng dụng của bạn . Ở mức tối thiểu, bạn cần một server ứng dụng để triển khai ứng dụng của bạn . Để cân bằng tải, hãy cung cấp nhiều server hơn và lặp lại các bước này.
Ta sẽ sử dụng Trình quản lý version Ruby (RVM) để download và cài đặt trình thông dịch Ruby.
Chạy hai lệnh sau để cài đặt RVM và tạo môi trường hệ thống cho Ruby:
curl -L get.rvm.io | bash -s stable source /etc/profile.d/rvm.sh
Cuối cùng, để hoàn tất quá trình cài đặt Ruby trên hệ thống của ta , hãy tải RVM để download và cài đặt version Ruby 2.1.0:
rvm reload rvm install 2.1.0
Cài đặt rail
Vì Rails trước hết cần một trình thông dịch JavaScript để hoạt động, ta cũng cần cài đặt Node.js
Vì mục đích này, ta sẽ sử dụng trình quản lý gói hệ thống mặc định YUM.
Chạy phần sau để download và cài đặt nodejs
bằng yum:
yum install -y nodejs
Thực hiện lệnh sau để download và cài đặt rails
bằng gem:
gem install bundler rails
Cài đặt Unicorn
Có một số cách để dễ dàng download Unicorn. Vì nó là một phụ thuộc liên quan đến ứng dụng, cách hợp lý nhất là sử dụng RubyGems.
Chạy phần sau để download và cài đặt Unicorn bằng gem
:
gem install unicorn
Lưu ý: Ta sẽ xem cách làm việc với công cụ này trong các phần tiếp theo.
Tạo một ứng dụng rail mẫu
Lưu ý: Để ví dụ của ta hoạt động, bây giờ ta sẽ tạo một ứng dụng Rails cơ bản. Để chạy ứng dụng của bạn, bạn cần tải lên nguồn ứng dụng của bạn .
### Tải lên Mã nguồn của bạn
Đối với việc triển khai thực tế, tất nhiên, bạn cần tải cơ sở mã của bạn lên server . Với mục đích này, bạn có thể sử dụng SFTP hoặc một công cụ đồ họa, chẳng hạn như FileZilla, để truyền và quản lý các file từ xa một cách an toàn. Tương tự như vậy, bạn có thể sử dụng Git và một repository trung tâm như Github để download và cài đặt mã của bạn .
- Để tìm hiểu về cách làm việc với SFTP, hãy xem bài viết: Cách sử dụng SFTP .
- Để tìm hiểu về FileZilla, hãy xem bài viết về chủ đề: Cách sử dụng FileZilla .
Hãy bắt đầu với việc tạo một ứng dụng Rails rất cơ bản bên trong folder chính của ta để phục vụ với Unicorn.
Thực thi lệnh sau để có được Rails tạo một ứng dụng mới có tên my_app :
# Create a sample Rails application cd /var mkdir www cd www rails new my_app # Enter the application directory cd my_app # Create a sample resource rails generate scaffold Task title:string note:text # Create a sample database RAILS_ENV=development rake db:migrate RAILS_ENV=production rake db:migrate # Create a directory to hold the PID files mkdir pids
Để kiểm tra xem ứng dụng của bạn có được đặt chính xác hay không và mọi thứ hoạt động tốt, hãy nhập folder ứng dụng và chạy một server đơn giản với rails s
:
# Enter the application directory cd /var/www/my_app # Run a simple server rails s # You should now be able to access it by # visiting: http://[your server's IP]:3000/tasks # In order to terminate the server process, # Press CTRL+C
Cấu hình Unicorn
Unicorn có thể được cấu hình theo một số cách. Đối với hướng dẫn này, tập trung vào các yếu tố chính, ta sẽ tạo một file từ đầu sẽ được Unicorn sử dụng khi bắt đầu quy trình daemon của server ứng dụng.
Mở tài liệu unicorn.rb
trống, tài liệu này sẽ được lưu trong folder config/
bằng editor nano
:
nano config/unicorn.rb
Đặt khối mã bên dưới, sửa đổi nó nếu cần:
# Set the working application directory # working_directory "/path/to/your/app" working_directory "/var/www/my_app" # Unicorn PID file location # pid "/path/to/pids/unicorn.pid" pid "/var/www/my_app/pids/unicorn.pid" # Path to logs # stderr_path "/path/to/log/unicorn.log" # stdout_path "/path/to/log/unicorn.log" stderr_path "/var/www/my_app/log/unicorn.log" stdout_path "/var/www/my_app/log/unicorn.log" # Number of processes # Rule of thumb: 2x per CPU core available # worker_processes 4 worker_processes 2 # Time-out timeout 30
Lưu và thoát bằng cách nhấn CTRL + X và xác nhận với Y.
Lưu ý: Để đơn giản kiểm tra ứng dụng của bạn với Unicorn, bạn có thể chạy unicorn_rails
bên trong folder ứng dụng.
Lưu ý: Để tìm hiểu thêm về cách cấu hình Unicorn, hãy xem trang tài liệu chính thức của nó tại đây .
Chạy Unicorn
Ta đã sẵn sàng chạy ứng dụng của bạn bằng Unicorn.
Chạy phần sau để khởi động Unicorn ở chế độ daemon bằng file cấu hình của ta ( config/unicorn.rb
):
unicorn_rails -c config/unicorn.rb -D
Tìm địa chỉ IP của server để cấu hình Nginx
Hãy tìm mạng riêng / địa chỉ IP riêng của server ảo của ta .
Chạy phần sau để tiết lộ địa chỉ IP riêng của server :
ifconfig
Đầu ra mẫu:
eth0 Link encap:Ethernet HWaddr 04:01:10:4B:B8:01 inet addr:107.170.13.134 Bcast:107.170.13.255 Mask:255.255.255.0 inet6 addr: fe80::601:10ff:fe4b:b801/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:164298 errors:0 dropped:0 overruns:0 frame:0 TX packets:46316 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:230223345 (219.5 MiB) TX bytes:4969058 (4.7 MiB) eth1 Link encap:Ethernet HWaddr 04:01:10:4B:B8:02 inet addr:10.128.241.135 Bcast:10.128.255.255 Mask:255.255.0.0 inet6 addr: fe80::601:10ff:fe4b:b802/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:120 errors:0 dropped:0 overruns:0 frame:0 TX packets:13 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:6810 (6.6 KiB) TX bytes:874 (874.0 b) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Bit thông tin thứ hai ở đây, bắt đầu bằng eth1
và tiếp tục với inet adde:
tiết lộ địa chỉ IP riêng được gán cho server của ta , trong trường hợp của ta là 10.128.241.135
.
Ta sẽ sử dụng địa chỉ IP này để Nginx giao tiếp với server ứng dụng của ta .
Lưu ý địa chỉ này và tiếp tục bước tiếp theo để cài đặt và cấu hình Nginx.
Lưu ý: Để tìm hiểu thêm về mạng riêng tư trên DigitalOcean, hãy xem Hướng dẫn cách cài đặt và sử dụng mạng riêng DigitalOcean trên phần bài viết cộng đồng.
Cài đặt Nginx làm Reverse-Proxy và Load-Balancer
Trong phần này, ta sẽ làm việc trên server mặt trước của bạn và cài đặt Nginx để chào đón các yêu cầu đến và cân bằng tải trên các server ứng dụng.
Cài đặt Nginx
Vì ta đã bật repository EPEL, nên có thể tải Nginx bằng yum .
Chạy phần sau để download và cài đặt Nginx bằng yum:
yum install -y nginx
Cấu hình Nginx
Sau khi cài đặt Nginx, bước tiếp theo là làm việc với file cấu hình của nó, nginx.conf
, được đặt tại /etc/nginx
theo mặc định.
Thực thi lệnh dưới đây để bắt đầu chỉnh sửa file này bằng editor văn bản nano
:
nano /etc/nginx/nginx.conf
Cuộn xuống bên dưới file và comment dòng sau:
# Before: include /etc/nginx/conf.d/*.conf; # After: # include /etc/nginx/conf.d/*.conf;
Bên trong nút http {
, thêm các cấu hình sau, sửa đổi chúng cho phù hợp với cài đặt của bạn :
# Set your server # server_name www.example.com; upstream unicorn_servers { # Add a list of your application servers # Each server defined on its own line # Example: # server IP.ADDR:PORT fail_timeout=0; server 10.128.241.135:8080 fail_timeout=0; # server 10.128.241.136:8080 fail_timeout=0; # server 10.128.241.137:8080 fail_timeout=0; } server { # Port to listen on listen 80; location / { # Set proxy headers proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://unicorn_servers; } }
Lưu và thoát bằng cách nhấn CTRL + X và xác nhận với Y.
Để bắt đầu, hãy chạy daemon Nginx bằng lệnh sau:
service nginx start
Sau khi sửa đổi file cấu hình, bạn có thể khởi động lại server như sau:
service nginx restart
Lưu ý: Để tìm hiểu thêm về các cấu hình khác và cài đặt chỉ thị để phân phát file tĩnh, hãy xem ví dụ Unicorn nginx.conf chính thức.
<div class = “author”> Gửi bởi: <a
href = “https://twitter.com/ostezer”> Hệ điều hành Tezer </a> </div>
Các tin liên quan