阿里云 环境部署

根据前面的十个课时,我们已经完成了对于一个产品的开发的逻辑,其中完成了功能的开发用户的结构页面的美化,接下来我们完成阿里云的环境的部署,在这个过程中,大家需要学会使用 vi 的命令,不然会让自己非常的沮丧,当你可以完成阿里云的部署的时候,你这个时候其实就缺乏两项技能体系;

第一项是:域名的备案; 第二项是:支付体系的对接;

而以上两点都必须依靠公司的维度才可以完成,所以我们在后续的课程里面,给大家讲解一下公司的成立的办法,帮助自己快速的掌握这个方面的知识的结构和体系;

我们一般可以快速的完成的完成阿里云的EOS的服务器购买,但是域名的购买之后,如果不是公司就难以完成备案,所以在这个时候,你的域名是不可以访问的,但是你可以通过使用 IP 地址来完成访问,这样其实就达到了学习的效果;

接下来我们给大家谈谈关于 阿里云 的部署的环节,我在阿里云部署这个地方,浪费了非常多的时间,所以希望大家可以一步就完成阿里云环境的搭建,不然会让自己非常的没有信心,希望你完成环境的搭建非常顺利。

ssh root@自己服务器的ip

免密码登入 远端登入除了输入密码之外,SSH 还可以用非对称加密(Public Key Encryption)的方式来做登入。 在非对称加密算法中,会有两把钥匙(key),一把叫做公钥(public key)、一把叫做密钥(private key)。 透过公钥加密的密文,只有密钥能够解开

于是我们就可以用这个机制来做登入:首先我们把自己的公钥先放在服务器上,那么之后登入时,服务器会送一个乱数字符串给用户,用户用密钥加密后返回服务器,如果服务器可以用公钥解回来,就表示认证成功。 以下是设定的步骤,: mkdir ~/.ssh touch ~/.ssh/authorized_keys 回到本机电脑把公钥印出来,执行 cat ~/.ssh/id_rsa.pub 就会印在画面上。 回到远端服务器继续: nano ~/.ssh/authorized_keys 把公钥贴上去 chmod 700 ~/.ssh chmod 644 ~/.ssh/authorized_keys 这样就好了,你可以试试看再次登入就不用打密码了,太棒了!

本机没有 id_rsa.pub ? 因为 Github 也是用一样的认证机制,所以之前操作 git 时你应该已经产生过这个 SSH key,并且在 Github 后台贴上你自己的公钥,所以在 git push 时不需要打密码。

如果本机真的没有 ~/.ssh/id_rsa.pub 公钥的话,需要先产生你自己的公钥私钥,请执行 ssh-keygen -t rsa就会产生公钥 ~/.ssh/id_rsa.pub 以及密钥 ~/.ssh/id_rsa 这两个档案。请一直按 Enter,不需要设定 passphrse 密码(不然你每次用key都要输入一次密码很麻烦)。

公钥可以公开给别人没关系,密钥就千万要保管好喔。

更新和安装 Linux 套件 apt-get是 Ubuntu 内建的套件管理工具,类似于 Mac 上的 homebrew。拿到一台服务器,首先就是先更新系统套件的清单,然后进行升级。 以下需要 root 权限的指令一律都加上 sudo,如果你是 root 身份其实不需要 sudo,但没关系都可以作用。 执行 sudo apt-get update 执行 sudo apt-get upgrade -f 看到 Do you want to continue? [Y/n] 继续按 Enter 即可 然后设定系统时区: 执行 sudo dpkg-reconfigure tzdata 进入选单选 Asia 然后选 Shanghai 就是中国时区 (UTF+8)

接着我们安装新的套件们,这些是 Ruby on Rails 所需要的东西。请输入以下指令(这是一行): 执行 sudo apt-get install -y build-essential git-core bison openssl libreadline6-dev curl zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 autoconf libc6-dev libpcre3-dev libcurl4-nss-dev libxml2-dev libxslt-dev imagemagick nodejs libffi-dev 看到 Do you want to continue? [Y/n] 继续按 Enter 即可

设定 apt-get 只使用 ipv4 使用 Linode 的学员,因为 ipv6 线路不稳,如果 apt-get update 卡在 0% [Connecting to security.ubuntu.com (2001:67c:1360:8001::17)] 的话,请编辑 /etc/sysctl.conf 加入这三行 net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 然后执行 sudo sysctl -p 后,再次执行 `sudo apt-get update

  1. 安装 Ruby 我们使用 Brighbox 已经编译好的 Ruby 套件,输入以下指令,会把 Brighbox 提供的套件加进清单,然后安装: 执行 sudo apt-get install software-properties-common 执行 sudo apt-add-repository ppa:brightbox/ruby-ng 执行 sudo apt-get update 执行 sudo apt-get install ruby2.4 ruby2.4-dev 安装好之后,输入 ruby -v 应该就会看到 ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux-gnu] 就是成功了。

接着安装 Bundler gem,等会安装 Rails 时会需要这个 Ruby 套件: 执行 sudo gem install bundler --no-ri --no-rdoc --no-ri --no-rdoc 参数的意思是不需要安装文档,可以节省安装时间 如果服务器在中国境内的话,可以改用 sudo gem install bundler --no-ri --no-rdoc --source https://gems.ruby-china.org 会比较快。

  1. 安装数据库服务器 以下提供 MySQL 和 PostgreSQL 的安装方式,请择一安装即可: 本机电脑可以用 brew 安装 MySQL 和 PostgreSQL,对于正式营运上线的项目,本机电脑最好也更换成和服务器一样的数据库,让本机环境与服务器环境尽量一样。

MySQL MySQL 是一个非常受欢迎的关联式数据库,可以说是大多数网络公司的首选。以下是安装MySQL的指令,过程中会提示你设定数据库的root密码(请记下来,等会设定 Rails 会用到)。 执行 sudo apt-get install mysql-common mysql-client libmysqlclient-dev mysql-server 过程中请配置一个数据库的 root 密码 (请记下来,等会设定 rails 的 database.yml 会用到)

接着我们进入 mysql console 建立新的数据库: 执行 mysql -u root -p 进入 mysql console 后,输入: CREATE DATABASE rails_recipes CHARACTER SET utf8mb4; 这会建立一个叫做 rails_recipes 的数据库(注意,数据库名称不要包括横线-),等会你的Rails就用这个数据库。执行完,输入 exit 离开 mysql console。

请把 rails_recipes 换成你自己项目的名称 PostgreSQL MySQL 是网络公司的最爱,分布式扩充和商业支持的生态系非常丰富。PostgreSQL 则是对进阶的 SQL 语法支援比较多,以及支援更多的储存格式,例如 PostGIS。 你也可以选择安装PostgreSQL: 执行 sudo apt-get install postgresql libpq-dev postgresql-contrib 修改帐号 postgres 的密码 执行 sudo -u postgres psql,然后打 \password 后,就可以设置数据库的密码(请记下来,等会设定 rails 的 database.yml 会用到)。

执行 sudo -u postgres createdb rails_recipes 建立一个叫做 rails_recipes 的数据库

  1. 安装 Nginx + Passenger 网站服务器 在本机开发的时候,我们使用 puma 这一套由 Ruby 写的网站服务器,无论是静态档案(图片/CSS/JS)或是会进到 Rails 处理的动态网页,一律都是由 puma 来处理。 在正式 production 环境中,我们会用更高效能的网站服务器来处理,其中 Nginx 是目前最流行的网站服务器(用C语言开发的),可以非常高效能地提供静态档案,效能是纯 Ruby 网站服务器的数十倍以上。因此像图档/CSS/JS等等静态资源,都会由 Nginx 处理。至于 Rails 动态网页的部分,我们会安装 Passenger 这个 Nginx 的扩充模组来执行 Ruby 程序:Nginx 会把非静态档案的 HTTP Request 转交给 Passenger 来处理。 以下安装程序参考自 Installing Passenger + Nginx 的步骤: sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7

sudo apt-get install -y apt-transport-https ca-certificates

sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger xenial main > /etc/apt/sources.list.d/passenger.list'

sudo apt-get update

sudo apt-get install -y nginx-extras passenger 打开你的浏览器,输入服务器的 IP 位置,应该就可以看到默认的 Nginx 静态网页了:Welcome to nginx on Ubuntu!

  1. 新增 deploy 用户 将下来我们想要找地方放我们 Rails 项目代码。因为 root 和 ihower 帐号权限很大,习惯上我们会在服务器上另开一个专门的帐号来放Rails代码。这里我们另开一个 deploy 帐号来使用: 在远端执行 sudo adduser --disabled-password deploy 新增帐号 --disabled-password deploy 参数会让deploy无法用密码登入,因为我们打算用 SSH Key 来登入更安全。 设定用 SSH Key 登入 deploy 帐号 在远端执行 sudo su deploy 切换到 deploy 身份: 执行 mkdir ~/.ssh 执行 touch ~/.ssh/authorized_keys 回到本机电脑把公钥印出来,执行 cat ~/.ssh/id_rsa.pub 就会印在画面上。 回到远端服务器继续: nano ~/.ssh/authorized_keys 把公钥贴上去 chmod 700 ~/.ssh chmod 644 ~/.ssh/authorized_keys 这样就好了,本机可以直接 ssh deploy@<主机IP位置> 无须输入密码。

  2. 安装 Capistrano Capistrano 是 Rails 社区中最常使用的布署工具,以下是安装和使用步骤。 以下使用百宝箱教程的项目来进行示范: 修改 Gemfile 加入 capistrano 首先在本机的 Rails 项目修改 Gemfile: Gemfile

  3. gem 'mysql2' # mysql2 和 pg 择一安装即可
  4. gem 'pg'

    group :development, :test do

  5. gem 'capistrano-rails'
  6. gem 'capistrano-passenger'

    gem 'rspec-rails' gem 'byebug', platform: :mri end 数据库用 MySQL 的话,加上 gem "mysql2",数据库用 PG 的话,则用 gem "pg"。 执行 bundle 安装 本机设定 capistrano 执行 cap install,这会新增一些配置档案。 编辑 Capfile: Capfile require "capistrano/scm/git" install_plugin Capistrano::SCM::Git

  7. require 'capistrano/rails'

  8. require 'capistrano/passenger' 修改 config/deploy.rb config/deploy.rb
  9. sh "ssh-add"

    config valid only for current version of Capistrano

    lock "3.8.1"

  10. set :application, "message"

  11. set :application, "message" # 请用你自己的项目名称

  12. set :repo_url, "[email protected]:me/my_repo.git"

  13. set :repo_url, "[email protected]:shenzhoudance/message.git" # 请用你自己项目的git位置

    Default branch is :master

    ask :branch, git rev-parse --abbrev-ref HEAD.chomp

    Default deploy_to directory is /var/www/my_app_name

    set :deploy_to, "/var/www/my_app_name"

  14. set :deploy_to, "/home/deploy/message" # 这样服务器上代码的目录位置,放在 deploy 帐号下。请用你自己的项目名称。

    Default value for :format is :airbrussh.

    set :format, :airbrussh

    You can configure the Airbrussh format using :format_options.

    These are the defaults.

    set :format_options, command_output: true, log_file: "log/capistrano.log", color: :auto, truncate: :auto

    Default value for :pty is false

    set :pty, true

    Default value for :linked_files is []

  15. append :linked_files, "config/database.yml", "config/secrets.yml"

  16. append :linked_files, "config/database.yml", "config/secrets.yml"

    Default value for linked_dirs is []

  17. append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system"

  18. append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system"

  19. set :passenger_restart_with_touch, true

    Default value for default_env is {}

    set :default_env, { path: "/opt/ruby/bin:$PATH" }

    Default value for keep_releases is 5

  20. set :keep_releases, 5

  21. set :keep_releases, 5

修改 config/deploy/production.rb,设定要用哪一个 branch 放在服务器上,以及服务器的 IP 位置:

  • set :branch, "master"
  • server "example.com", user: "deploy", roles: %w{app db web}, my_property: :my_value

  • server "自己的ip", user: "deploy", roles: %w{app db web}, my_property: :my_value

在本机执行 cap production deploy:check,这会自动登入远端服务器建立一些 Capistrano 需要的架构目录(稍后会解说)。

你会看到一个 ERROR 说服务器上缺少一些档案,让我们进远端服务器上新增这些档案: 远端设定 database.yml 和 secrets.yml 请用 deploy 身份登入 ssh [email protected],或是切换到 deploy 身份 sudo su deploy: 在远端新增 /home/deploy/rails-recipes/shared/config/database.yml 这个档案,内容是: 如果是 MySQL 数据库: production: adapter: mysql2 encoding: utf8mb4 database: rails_recipes host: localhost username: root password: xxxxxxxxxx

如果是 PG 数据库: production: adapter: postgresql pool: 25 database: rails_recipes host: localhost username: postgres password: xxxxxxxxxx password 记得换成你的数据库密码 在本机执行 rake secret,这会产生一段乱数的key,等会要用。

在远端新增 /home/deploy/rails-reipes/shared/config/secrets.yml 这个档案,内容是: production: secret_key_base: 把刚刚的乱数key贴上来

这个地方一定要空格

本机再次执行 cap production deploy:check

执行部署 本机执行部署 cap production deploy,这个指令会登入远端服务器,把 Github 上的代码抓下来,然后自动执行 bundle 安装套件、跑数据库 migration 和编译 assets 编译等等步骤:

第一次会比较久,需耗时数十分钟,取决于网络环境与 CPU 速度: 如果您用国内的服务器,跑 01 bundle install --path /home/deploy/rails-recipes/shared/bundle 这一步可能因为网络问题而失败。建议你可以修改 Gemfile 第一行,改成 source 'https://gems.ruby-china.org'使用国内的 rubygems.org 镜像服务器,因为服务器本身是没有翻墙的。改完请执行 bundle,然后 git commit 和 git push 上去。然后再重新执行 cap production deploy。 如果服务器 CPU 等级比较差,跑 01 bundle exec rake assets:precompile 这一步会比较久,如果出现 Errno::ECONNRESET: Connection reset by peer - recvfrom(2) 请重试几次 cap production deploy。 完成后,capistrano 的设定就告一个段落了,可以 commit 了。 之后有修改代码,只要 git push 到 Github 上,然后再次执行 cap production deploy,这样服务器上就会拉下最新的代码。 Capistrano 目录结构解说 在远端的部署目录 /home/deploy/rails-receips 下,Capistrano 建立了一些目录: releases 20170728140659 20170728141211 20170728174109 20170729041358 ..... current shared bundle config log public/system public/assets tmp 每次执行 cap production deploy 时,capistrano 都会在 releases 都会建一个新的目录,然后从 git repo 把最新的代码抓下来,执行 bundle 安装套件、跑数据库 migration、编译 assets 编译等等步骤,都完成之后,会更新 current 目录(这是一个 ln -s 的捷径)指向最新的 releases/xxxx 目录,最后 touch tmp/restart.txt 告诉 Passenger 重启 Rails。 这样做的好处是在部署过程中,服务器仍然可以稳稳地用本来的版本,不会受到新版本的影响,直到部署过程都完成之后,才会修改 current 目录重启 Rails。 也由于每次部署都会建立新的 releases/xxx 目录,因此不同版本之间需要共享的档案和目录,就会放在 shared 下,例如 bundle 目录是放安装的 Ruby 套件、public/system 是默认用户上传档案放的位置、public/assets 是静态档案编译后放的位置。 在 config/deploy.rb 的设定中,linked_files 和 linked_dirs 就是在配置部署过程中,需要将这些 shared 下的档案和目录,连结到新的 releases 目录里面去。

  1. 完成 Nginx 设定 在远端用 root 权限编辑 /etc/nginx/nginx.conf 这个档案:

    让 Nginx 可以读到环境变量 PATH,Rails 需要这一行才能调用到 nodejs 来编译静态档案

  2. env PATH;

    user www-data; worker_processes auto; pid /run/nginx.pid;

    events {

    worker_connections 768;
    # multi_accept on;
    

    }

    http {

    关闭 Passenger 和 Nginx 在 HTTP Response Header 的版本资讯,减少资讯洩漏

  3. passenger_show_version_in_header off;
  4. server_tokens off;

    设定档案上传可以到100mb,默认只有1Mb超小气的,上传一张图片就爆了

  5. client_max_body_size 100m;

    gzip on; gzip_disable "msie6";

    最佳化 gzip 压缩

  6. gzip_comp_level 5;
  7. gzip_min_length 256;
  8. gzip_proxied any;
  9. gzip_vary on;
  10. gzip_types application/atom+xml application/javascript application/x-javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/svg+xml image/x-icon text/css text/xml text/plain text/javascript text/x-component;

    打开 passenger 模组

  11. include /etc/nginx/passenger.conf;

  12. include /etc/nginx/passenger.conf;

    下略

    在远端用 root 权限新增 /etc/nginx/sites-enabled/rails-recipes.conf 这个档案(档名可以自订无所谓) server { listen 80; server_name 自己的ip; # 用你自己的服务器 IP 位置

    root /home/deploy/message/current/public; # 用你自己的项目名称位置

    passenger_enabled on;

    passenger_min_instances 1;

    location ~ ^/assets/ { expires 1y; add_header Cache-Control public; add_header ETag ""; break; } }

以上设定包括设定 Assets 静态档案成为永不过期(Rails的Assets Pipeline会加上版本号,所以不需要担心)、设定 Passenger 至少开一个进程(Process)。其中 server_name 应该填网域名称。不过如果目前没有的话,只好先填 IP 位置。 如果有多个 domain 连到同一个网站,可以用空白区隔,例如:

server_name dongnishijain.com www.dongnishijian.com; 这样三个网址都会连到同一个 Rails 了。如果之后想在同一个服务器装多个网站,那么就需要有不同的网域名称,每个网站有自己的 /etc/nginx/sites-enabled/xxxxx.conf 设定档案,这样 Nginx 才能区别用户是要打开那一个网站。

最后执行 sudo service nginx restart 才会套用新的 Nginx 设定。 如果 Nginx 设定档格式不对,例如结尾少了分号 ;,那么 sudo service nginx restart 会失败,Nginx 服务器就死掉了。这时候请回头修好设定档,然后执行 sudo service nginx start 就会启动 Nginx 了。如果无法启动请检查 /etc/nginx/nginx.conf 和 /etc/nginx/sites-enabled/rails-recipes.conf。

打开浏览器连过去,大功告成。

参考地址: Linux 云服务器部署运维 http://wangjiao-blog.logdown.com/posts/2260929-linux-cloud-server-deployment-operation-and-maintenance

轨道部署命令记录(阿里云) http://lichen-blog.logdown.com/posts/2615514-rails-deployment

推荐学习文章: 李笑来Xdite金石,十倍速区块链新世界“点线面体”思维方式的三个代表 https://mp.weixin.qq.com/s?timestamp=1517875586&src=3&ver=1&signature=Y6p2K-0AfRyU*uCTgcUfOEDlEXz4brc9JerUV5u3Rs0cy*yVAxE3752lZ-ML2GvNA3FYZwi9OP6n84Ex5AVRAp*S8wQq-2-xeiTVddidlfMpWW*dbDK1u4XR7OkSPUel8lhivLEKNui-HVZq4stYy7IPKXEBm87e-GL9eRAxMuk=

把握一种思维方式聚焦主攻方向快速切入十倍速区块链新世界 https://mp.weixin.qq.com/s?timestamp=1517875586&src=3&ver=1&signature=Y6p2K-0AfRyU*uCTgcUfOEDlEXz4brc9JerUV5u3Rs0cy*yVAxE3752lZ-ML2GvNA3FYZwi9OP6n84Ex5AVRAqFduxEynZFvlZYVFIXxoyq15IYg4zewhneKotlGpl-JdKmrv55DFsjo*6x1*1CT-Z9G2kQYvv9m4qFOxeWdKdU=

肖威 2018.02.14

results matching ""

    No results matching ""