<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 262,  comments - 221,  trackbacks - 0
    【1. 下載Virtual Box】
    ==================================================
    在/etc/apt/sources.list文件的末尾添加一行
      deb http://download.virtualbox.org/virtualbox/debian lucid contrib non-free

    添加Oracle的key文件
      wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add -

    以root用戶身份執行
      sudo apt-get update
      sudo apt-get install virtualbox-4.0  
    ==================================================


    【2. 安裝vagrant和Linux虛擬機】
    ==================================================
      gem install vagrant
      vagrant box add base http://files.vagrantup.com/lucid32.box

    如果出現gem無法安裝的情況(例如鏈接被重置,請使用VPN連接后再安裝gem)
    ==================================================


    【3. 配置Ubuntu】
    ==================================================
      mkdir ubuntu  # 控制虛擬機配置的目錄
      cd ubuntu
      vagrant init     # 初始化vagrant的環境
      vagrant up     # 創建vagrant的運行環境
      vagrant ssh    # 以SSH方式連接登錄

    當使用vagrant ssh方式登錄的時候,會以一個名為vagrant的用戶身份登錄到虛擬機
    (lucid32),這個用戶具備有管理權限(虛擬機預設用戶)。如果使用的虛擬機不是vagrant
    網站提供的,那么默認沒有vagrant用戶,需要在虛擬機端創建一個具備管理權限的用戶

      useradd -d /home/user -m -s /bin/bash -G admin user
      passwd user
      su user

    其中第一個命令的創建一個名為user的用戶,默認的home目錄位于/home/user,默認
    的shell使用/bin/bash,該用戶的組為admin(-G) 。然后為該用戶創建新的密碼并切換到
    該用戶(我們可以使用vagrant作為用戶名),以后所有的操作都在該用戶下進行(不再使用
    vagrant,直接操縱虛擬機)
    ==================================================


    【4. 升級虛擬機的aptitude package】
    ==================================================
    在連接到虛擬機的情況下,執行:

      sudo aptitude update
      sudo aptitude -y install build-essential git-core curl

    確保該repository下的所有最新source會被下載并緩存到本地,并安裝幾個必需的包,
    其中build-essential包含了若干編譯源代碼的必要工具,git-core包含了GIT的核心功能,
    我們將用來提交代碼,curl允許我們訪問某個指定的URL并download該URL的內容
    ==================================================


    【5. 安裝RVM】
    ==================================================
    通過RVM官網提供的腳本來安裝RVM,并默認安裝為系統級別(即sudo打頭的)
     
      sudo bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )
     
    如果在這個過程有出現關于“認證”  的錯誤,請為curl添加一個"-k"開關參數

      sudo bash < <(curl -sk https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)

    使用Multi-user mode(System mode)安裝的,默認將RVM安裝在/usr/local/rvm下。

    再次安裝部分Ruby的依賴包

      sudo aptitude -y install build-essential bison openssl \
              libreadline6 libreadline6-dev curl git-core zlib1g \
              zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 \
              libsqlite3-dev sqlite3 libxml2-dev libxslt-dev \
              autoconf libc6-dev libpq-dev libcurl4-openssl-dev          

    The installation process is similar for both installation methods, however, when
    installing a multi-user configuration, do not run the installer directly as root.
    Always use the sudo command         
    ==================================================


    【6. 配置RVM的加載】
    ==================================================
    The rvm function will be automatically configured for every user on the system
    if you install as root. This is accomplished by loading /etc/profile.d/rvm.sh on login.

    Most Linux distributions default to parsing /etc/profile which contains the logic to
    load all files residing in the /etc/profile.d/ directory.

    Once you have added the users you want to be able to use RVM to the rvm group,
    those users MUST log out and back in to gain rvm group membership because
    group memberships are only evaluated by the operating system at initial login time.

    Also, you only use the sudo command during the install process. In Multi-User
    configurations, any operations which require sudo access must use the rvmsudo
    command which preserves the RVM environment and passes this on to sudo.

    There are very few cases where rvmsudo is required once the core install is
    completed, except for when updating RVM itself. There is never a reason to use
    sudo post-install.

    如果是在非vagrant的虛擬機上,我們需要手動為連接的用戶添加一個所屬組:rvm

      sudo usermod -a -G rvm user
      sudo echo 'source "/usr/local/rvm/scripts/rvm"' >> /etc/profile
      exit
     
    注意上面的命令在執行后,當前用戶必須注銷后重新登錄以使更改起效。

    通過如下命令來檢測一切是否正常:

      type rvm | head -1
      rvm is a function

    在完成RVM的配置后,可以看一下還有需要安裝的,運行如下的命令檢查:

      rvm requirements
    ==================================================

     
    【7. 安裝Ruby及其包管理器】
    ==================================================
      rvm install 1.9.2
      rvm use --default 1.9.2
      gem install bundler rake
    ==================================================


    【8. 為發布應用創建一個專用的用戶】
    ==================================================
    為每一個應用的發布創建一個對應的用戶,可以方便我在發布多個應用的時候區分當前
    到底是處在那個應用。

    其次對于目錄,數據庫的所有權都屬于創建者,所以為應用創建特定的用戶有利于我們隔
    離目錄和DB的訪問權限。

      sudo useradd ticketeeapp.com -s /bin/bash -m -d /home/ticketeeapp.com
      sudo chown -R ticketeeapp.com /home/ticketeeapp.com
      sudo passwd ticketeeapp.com
    ==================================================


    【9. 使用SSH連接】
    ==================================================
    SSH連接是基于key authorized的驗證機制,它由634位的隨機字符和數字組成密碼。

    這里我需要為連接到虛擬機的用戶、發布應用的用戶都采用SSH認證方式。

    注意:前面我使用vagrant ssh的時候,不需要密碼就可以連接到虛擬機。就是因為在
    vagrant的虛擬機中,已經有默認的key認證文件了,所以不需要再重新生成key文件,
    否則會導致vagrant ssh無法登錄。

    但是如果不是使用vagrant的虛擬機,則需要手工創建key文件了。key文件分為public
    key和private key兩種。public key存儲在服務器端而private key存儲在服務器/客戶端。
    當使用SSH連接時,服務器會驗證public key和private key是否匹配(兩者的private key
    是否相同)

      # 登錄服務器后,在當前用戶的home目錄下創建.ssh目錄
      mkdir ~/.ssh
      # 在 "本地機器" 將當前public key拷貝到服務器的.ssh目錄下,以登錄用戶名重命名
      # 這個過程需要輸入登錄的密碼
      scp ~/.ssh/id_rsa.pub user@your-server:~/.ssh/[your_name]_key.pub
      # 生成private key
      cat ~/.ssh/[your_name]_key.pub >> ~/.ssh/authorized_keys
      # 修改private key的讀寫權限為僅當前用戶可讀寫
      chmod 600 ~/.ssh/authorized_keys
     
    上面的user@your-server中,user是當前登錄服務器的用戶名,your-server在這里是
    服務器的名稱。如果是使用vagrant,那么這里的user就是vagrant,而your-server則
    是localhost。

    當配置完成后,斷開和服務器的連接,再重新使用SSH方式登錄,這個時候應該不需要
    再次輸入密碼就可以連接。表明SSH配置起作用了。
     
    接下來切換用戶到App發布用戶

      sudo  su ticketeeapp.com
     
    然后重新跑一遍上面的命令。注意在scp命令時把user換成App發布用戶的名稱
    ==================================================


    【10. 取消密碼驗證】
    ==================================================
    切換回原來登錄的用戶賬戶,并打開如下的文件

      sudo nano /etc/ssh/sshd_config
     
    修改其中的配置選擇如下:

      PasswordAuthentication  no  
      PermitRootLogin no

    退出nano編輯器,然后在命令行下執行如下命令,重啟SSH服務:

      service ssh restart
     
    至此完成了所有的基于key authentication的用戶驗證  
    ==================================================


    【11. 安裝數據庫】
    ==================================================
    在Console下執行:

      sudo apt-get install mysql-server
      sudo apt-get install sqlite3 libsqlite3-dev
      gem install sqlite3-ruby

    在安裝的過程中會被要求輸入root用戶的密碼,安裝成功后將會自動加入到開機自啟動
    ==================================================


    【12. 為發布代碼到GitHub的Repository創建密鑰】
    ==================================================
    首先為發布代碼到GitHub創建一個密鑰,這個過程會產生一個公鑰和一個密鑰。密鑰必
    須妥善保存,而公鑰可以作為GitHub上我們發布代碼的key authentication

    首先切換到App應用發布的用戶,在終端下執行命令:

      ssh-keygen -t rsa        #產生密鑰
      cat ~/.ssh/id_rsa.pub  #查看公鑰的內容,拷貝粘帖到GitHub對應管理頁面的輸入框

    注意這些key是可以和Web應用關聯在一起的,所以這個private key是針對單個App的。
    當完成這些操作后,可以運行下面的命令驗證key認證是否成功:

      git clone git@github.com:our_username/ticketee.git ~/ticketee
     
    這個命令會從GitHub的ticketee應用下,拷貝內容到當前用戶目錄下,名稱叫ticketee。  
    如果有這個目錄存在且包含所有應該包含的內容,證明配置成功。此時我們可以刪除這個
    目錄。  
    ==================================================  
     

     【13. 配置Capistrano】
    ==================================================
    首先是把Capistrano 這個gem添加到應用中,再重新執行一次 bundle install

      group :development do
        gem 'capistrano'
      end
     
    然后在應用的根目錄執行命令:capify .

    在應用根目錄下生成兩個文件:capfile 和 config/deploy.rb。其中capfile中調用了config/
    deploy.rb文件,用來讀取所有和部署相關的信息。在config/deploy.rb文件中,有若干項是
    需要配置的

      set :application, "set your application name here"
      set :repository,  "set your repository location here"  # 注意這里是GitHub的repository路徑
      set :scm, :git
      set :port, 2200
      set :user, "set your user name here as the app user" # 由于使用了密鑰不需要密碼
      set :deploy_to, "PATH_TO_USER_HOME_DIR/apps/#{application}"
      set :use_sudo, false # 非Root用戶
      set :keep_releases, 5 # 保留最近5個已發布的版本,清除其他的舊版本
     
      role :web, "[your-server]"  # 如果是使用Capistrano,那么這里是localhost
      role :app, "[your-server]"
      role :db,   "[your-server]", :primary => true # 表示這是一個主數據庫

    接下來在deploy.rb文件的末尾,找到如下幾行,并去掉注釋。用來在每次發布時生成一
    個restart文件,使到Passenger在下次請求到來時自動重啟加載應用。
     
      # 創建任務
      namespace :deploy do
        task :start do ; end
        task :stop do ; end
        task :restart, :roles => :app, :except => { :no_release => true } do
                  run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
        end
      end
    ==================================================


    【14. 創建部署環境并部署】
    ==================================================  
    在完成配置后,可以通過cap -T 來列出所有支持的命令??梢酝ㄟ^如下命令來安裝應用

      cap deploy:setup  # 該命令會產生大量的輸出,構建標準的部署結構,類似于Maven
     
    這個命令會進行如下的輸出:

      $USER_HOME_DIR/apps/$APP_NAME/releases              # 存放發布的版本文件
      $USER_HOME_DIR/apps/$APP_NAME/shared                # 存放版本間共享的文件
      $USER_HOME_DIR/apps/$APP_NAME/shared/system    # 存放系統間共享的文件
      $USER_HOME_DIR/apps/$APP_NAME/shared/log          # 符號鏈接存放多個版本的日志
      $USER_HOME_DIR/apps/$APP_NAME/shared/pids        #  存放當前應用的pid
     
    并修改所有目錄的讀寫權限,在完成部署環境的搭建后,可以執行如下命令真正地部署

      cap deploy
    ==================================================  

     
    【15. 自動運行bundle install】
    ==================================================
    在將源代碼部署到服務器之后,并不會自動地執行bundle install,所以需要讓這一過程
    自動化,在config/deploy.rb文件的頭部添加如下代碼:

    $:.unshift(File.expand_path('./lib', ENV['rvm_path']))
    require 'rvm/capistrano'
    require 'bundler/capistrano'

    第一行代碼將RVM的lib目錄加入到加載路徑中,所以Capistrano知道去哪里找bundle,
    然后分別加入rvm和bundler對capistrano的支持。

    在更新了這個文件后,需要重新執行一次cap deploy,將自動安裝所需的gem
    ==================================================


    【16. 配置生產環境的數據庫】
    ==================================================
    當完成源代碼的部署后,接下來需要同步的就是數據庫的結構。通過下列命令來完成:

      cap deploy:migrations
     
    注意:這個是手動完成的。在此之前必須檢查Gemfile中的DB設置是否匹配,否則會默認
    創建SQLite3數據庫。可以在Gemfile中(注意:是在Gemfile中,而不是database.yaml)添加

      groupd :production do
        gem 'pg' # 該gem會安裝一個PostgreSQL數據庫的適配器,以連接到PostgreSQL數據庫
      end

    如果這次之前已經部署了代碼,需要用Git重新提交

      git add Gemfile*
      git commit -m "Added pg gem for PostgreSQL on the server"
      git push  
     
    可以在服務器的部署目錄的共享目錄下,創建一個共享的數據庫配置文件,讓多個應用共享。
    首先以vagrant用戶連接登錄到服務器,執行sudo su USER_NAME 切換到App發布用戶,
    執行

      cd /home/PATH_TO_APP/apps/APP_NAME/shared
      mkdir config
      cd config
      nano database.yml # 用vim或者其他編輯器打開編輯該文件
     
    在這個文件中我們指定Production環境下的DB配置

      production:
        adapter: postgresql
        database: DB_NAME
        min_messages: warning

    現在需要讓應用的數據庫配置文件指向這個shared/的文件,修改config/deploy.rb這個文件,
    定義一個新的task,將應用的DB鏈接配置指向這個文件

      task :symlink_database_yml do
        # 刪除原有的數據庫配置文件
        run "rm #{release_path}/config/database.yml"
        # 創建軟鏈接指向新的配置文件
        run "ln -sfn #{shared_path}/config/database.yml  #{release_path}/config/database.yml"
      end
      after "bundle:install", "symlink_database_yml"  # 在bundle install后執行這個task

    在修改了本地的任何代碼,資源,DB后,為了確保本地和服務器的同步,我們簡單地
    運行如下命令:

      cap deploy:migrations
     
    這個命令會將本地代碼的修改同步到服務器端,運行bundle命令,然后運行rake db:migrate
    保證代碼,包依賴,DB結構的同步
    =================================================


    【17. 驗證數據庫配置是否成功】
    =================================================
    在經過一系列的配置后,可以使用如下方法來驗證應用的部署是否成功

    首先以App部署用戶的身份登錄到服務器,進入到App發布的目錄下

      cd /home/ticketeeapp.com/apps/ticketee/current  # App應用的當前運行目錄
      rake db:seed RAILS_ENV=production                      # 導入測試數據到PRD環境
      psql                                                                         # 連接到PostgreSQL數據庫
      psql>SELECT * FROM projects;                                # 執行SQL查詢

    如果我們可以看到關于App應用的信息,那么證明數據庫的部署是正確的。
    =================================================


    【18. 安裝Nginx+Passenger】
    ==================================================
    Nginx和Passenger分別是反向代理服務器和Rails的服務器。其中Passenger提供了一個
    用于和Nginx集成的模塊,可以在安裝該模塊之前先安裝Nginx。

    在Console下執行命令如下:

      # Make sure we have the right ruby selected
      rvm use ree@release
      # Install the passenger gem
      gem install passenger
      # Run the passenger installer
      rvmsudo passenger-install-nginx-module

    在安裝Nginx的passenger模塊的過程中,會出現對話提示,按照提示操作即可完成安裝

    注意:如果安裝的Passenger是3.0以上版本,將不再需要將passenger_ruby的路徑換成
    passenger_ruby了,而是使用:/.rvm/wrappers/ree-1.8.7-2011.03@release/ruby

    接下來讓Nginx在系統啟動時自動啟動Passenger,這是通過一個腳本來做到的:

      sudo bash -c 'curl -L http://bit.ly/nginx-ubuntu-init-file > /etc/init.d/nginx'  
      sudo chmod +x /etc/init.d/nginx
      sudo update-rc.d nginx defaults
      sudo /etc/init.d/nginx start
    ==================================================


    【19. 部署Rails應用】
    ==================================================
    在安裝了Nginx + Passenger之后,部署一個Rails 應用將變得非常容易。只需要在Nginx
    的配置文件:/opt/nginx/conf/nginx.conf中添加這樣一個“server block”

       server {
          listen 80;
          server_name www.yourhost.com;
          root /somewhere/public;   # <--- be sure to point to 'public'!
          passenger_enabled on;
       }

    注意一定要將root指向Rails應用的public目錄。在添加這個配置之后,Passenger將自動
    識別相關的文件,并以此作為配置Gemset的依據
    ==================================================


    【參考資料】
    ==================================================
    Rails 3 in Action》的第14章:Deployment
    RVM installation 官方文檔
    A Guide to a Nginx, Passenger and RVM Server


    -------------------------------------------------------------
    生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
    posted on 2011-11-21 16:22 Paul Lin 閱讀(1690) 評論(0)  編輯  收藏 所屬分類: RoR
    <2011年11月>
    303112345
    6789101112
    13141516171819
    20212223242526
    27282930123
    45678910

    常用鏈接

    留言簿(21)

    隨筆分類

    隨筆檔案

    BlogJava熱點博客

    好友博客

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 四虎最新永久免费视频| 国产小视频在线免费| 亚洲精华国产精华精华液好用| 亚洲欧美熟妇综合久久久久| 国内精自视频品线六区免费| 久久亚洲精品人成综合网| 在线观看免费无码视频| 亚洲一区二区三区91| 亚洲国产精品狼友中文久久久| 18禁成人网站免费观看| 有色视频在线观看免费高清在线直播| 中文字幕亚洲综合精品一区| 免费A级毛片无码久久版| 亚洲AV无码资源在线观看| 日美韩电影免费看| 热99RE久久精品这里都是精品免费| 亚洲啪啪综合AV一区| 成人毛片免费播放| 亚洲乱码日产精品一二三| 在线亚洲人成电影网站色www| 两个人看的www免费视频中文| 亚洲中文字幕一二三四区苍井空| 女人与禽交视频免费看| av永久免费网站在线观看 | 4480yy私人影院亚洲| www国产亚洲精品久久久| CAOPORM国产精品视频免费| 亚洲日本国产综合高清| 久久精品国产精品亚洲精品 | 国产1024精品视频专区免费| 亚洲中文字幕精品久久| 亚洲AV午夜福利精品一区二区| 免费无遮挡无码永久在线观看视频| 大地资源网高清在线观看免费 | 91短视频免费在线观看| 巨胸喷奶水www永久免费| 亚洲高清无在码在线电影不卡| 亚洲国产综合无码一区二区二三区| 中文字幕无码视频手机免费看| 无人在线观看免费高清| 亚洲七久久之综合七久久|