ダン・クァン・ミン Blog

はじめまして

Rails Websocket Deploy on Apache2 With Passenger

Đầu tiên là tạo dự án rails đã.

$ rails new sample-chat -d mysql

Sau đó config database trong file config/database.yml

Bước tiếp theo đó là cài đặt gem websocket-railstrong Gemfile

gem "websocket-rails"

Chạy lệnh bundle install

Chạy lệnh rails g websocket_rails:install

WebsocketRailsコントローラの作成. Tạo file app/controllers/websocket_chat_controller.rb

# WebsocketRails::BaseControllerを継承
class WebsocketChatController < WebsocketRails::BaseController
  def message_recieve
    # クライアントからのメッセージを取得
    recieve_message = message()
    # websocket_chatイベントで接続しているクライアントにブロードキャスト
    broadcast_message(:websocket_chat, recieve_message)
  end
end

Event Routerの設定. Sửa file events.rb trong thư mục config

WebsocketRails::EventMap.describe do
  subscribe :websocket_chat, to: WebsocketChatController, with_method: :message_recieve
end

Tạo controller Chat đơn giản

$ rails g controller Chat index

Trong file index.html.erb chèn source code này vào

<!-- チャット表示部分 -->
<ul id="chat_area"></ul>

<!-- コメントフォーム -->
<input id="comment" type="text">
<input id="send" type="button" value="send">

<script>
  var ws_rails = new WebSocketRails("sample-chat.local:3001/websocket");
  // メッセージ受信時の処理
  ws_rails.bind("websocket_chat", function(message){
    var message_li = document.createElement("li");
    message_li.textContent = message;
    document.getElementById("chat_area").appendChild(message_li);
  });

  // メッセージ送信時の処理
  document.getElementById("send").onclick =  function(){
    var comment = document.getElementById("comment").value;
    ws_rails.trigger("websocket_chat", comment);
  }
</script>

Rack::Lockの無効化. Trong file config/environments/development.rb, viết thêm dòng config này vào:

config.middleware.delete Rack::Lock

Vậy là đã xong phần source code, giờ thì sẽ triển khai deploy trên Apache2, với Passenger & Virtualhost.

Trong Gemfile điền thêm hai gem:

# Deploy
gem 'passenger'
gem 'therubyracer', platforms: :ruby

Bundle install xong thì chạy lệnh passenger-install-apache2-module. Thiết lập Passenger cho thằng Apache2.

Thiết lập thêm theo cách này cho chắc ăn. Nhưng hình như sẽ bị cảnh báo là confict. Hiện thời chưa thấy confilct gì cả.

First, install the PGP key for the repository server:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7

Create an APT source file:

sudo nano /etc/apt/sources.list.d/passenger.list

Insert the following line to add the Passenger repository to the file:

deb https://oss-binaries.phusionpassenger.com/apt/passenger trusty main

Press CTRL+X to exit, type Y to save the file, and then press ENTER to confirm the file location.

Change the owner and permissions for this file to restrict access to root:

sudo chown root: /etc/apt/sources.list.d/passenger.list
sudo chmod 600 /etc/apt/sources.list.d/passenger.list

Update the APT cache:

sudo apt-get update

Finally, install Passenger:

sudo apt-get install libapache2-mod-passenger

Make sure the Passenger Apache module; it maybe enabled already:

sudo a2enmod passenger

Restart Apache:

sudo service apache2 restart

Giờ là lúc setup server apache. Hiện tại thì bắt buộc phải copy source code vào trong thư mục /var/www, khá là bất tiện.

$ sudo vim /etc/apache2/sites-available/sample-chat.local.conf

Sau đó chèn code sau

<virtualhost *:80>
    DocumentRoot "/var/www/sample-chat/public"
    ServerName sample-chat.local
    SetEnv RACK_ENV development

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    <Directory "/var/www/sample-chat/public">
      Options FollowSymLinks
      Require all granted
    </directory>

</virtualhost>

Say đó sửa file /etc/hosts để thiết lập domain ảo ở local.

Chạy lệnh

$ sudo a2ensite sample-chat.local
$ sudo service apache2 reload
$ sudo service apache2 restart

Vào trong thư mục source code chạy lệnh rake secretsau đó copy đoạn mã vào trong file config/secret.yml

Sửa config trong file config/initializers/websocket_rails.rb về config.standalone = true. Sau đó chạy lệnh:

$ rake websocket_rails:start_server
$ rake assets:precompile

Vậy là đã hoàn tất!

Comments