准备

ssh 登录

首先 ssh 登录服务器,免密码登录可以参考 ssh 免密码登录服务器

创建部署用户

$ sudo adduser deploy

安装依赖

Ruby

这里使用 RVM 安装和管理 Ruby

$ gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
$ curl -sSL https://get.rvm.io | bash

等待安装完成

# 显示可用的 Ruby 版本
$ rvm list known
# 安装
$ rvm install 2.5.3

更换 Gem 源(使用 ruby-china 源)

$ gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
$ gem sources -l
$ bundle config mirror.https://rubygems.org https://gems.ruby-china.com

Node

$ curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash -
$ sudo apt update
$ sudo apt install -y nodejs
$ node -v
$ npm -v

更换 npm 源

$ npm config set registry http://registry.npm.taobao.org/
$ npm config set disturl https://npm.taobao.org/dist
$ npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass

Yarn

$ curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
$ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
$ sudo apt update && sudo apt-get install yarn

更换 Yarn 源

$ yarn config set registry http://registry.npm.taobao.org/
$ yarn config set disturl https://npm.taobao.org/dist
$ yarn config set sass_binary_site https://npm.taobao.org/mirrors/node-sass

Nginx

Nginx 安装

$ sudo apt install nginx

如果遇到类似的问题:

Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
invoke-rc.d: initscript nginx, action "start" failed.
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since 三 2019-03-06 11:50:31 CST; 11ms ago
Process: 32601 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=1/FAILURE)
Process: 32596 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)

可能是 80 端口已经被占用了,可以编辑 /etc/nginx/sites-enabled/default 更换端口

Nginx 配置

编辑文件 /etc/nginx/sites-enabled/default

我们把 Nginx 作为反向代理,将收到的 Http 请求转发给 Rails 的 Puma 服务器,这里的 Puma 服务器就作为Nginx 的上游(upstream),Nginx 和 Puma 之间通过 Unix 套接字连接,所以首先配置 Nginx 的上游,假设用户为 deploy,项目名为 sample_app,项目位于 deploy 用户主目录

upstream app {
server unix:/home/deploy/sample_app/shared/sockets/puma.sock;
}

然后配置 Nginx 服务器

server {
listen 80;
server_name 192.168.1.2; # 服务器域名或 IP # public 静态文件
root /home/deploy/sample_app/public; # 找不到文件发给上游 Rails 应用
try_files $uri/index.html $uri @app; location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app;
} # 改为使用自定义的错误页面
error_page 500 502 503 504 /500.html;
error_page 404 /404.html;
keepalive_timeout 10;
}

PostgreSQL

安装

$ sudo apt update
$ sudo apt-get install postgresql postgresql-contrib libpq-dev

创建数据库账号

# 切换到 postgres 账户
$ sudo su postgres
# 创建数据库用户
$ createuser -s deploy
# 连接数据库 psql 客户端
$ psql
# 修改密码
postgres=# \password deploy
# 退出
postgres=# \q

远程连接配置

pg_hba.conf

$ sudo vi sudo vi /etc/postgresql/9.5/main/pg_hba.conf

找到 # IPv4 local connections:添加:

host    all             all             10.0.0.1/8(根据需要配置)              md5

postgresql.conf

$ sudo vi /etc/postgresql/9.5/main/postgresql.conf

找到 #listen_addresses = 'localhost',改为

listen_addresses = '*'

Rails 配置

Gemfile

gem 'pg'

database.yml

production:
<<: *default
adapter: postgresql
encoding: unicode
database: appname
username: deploy
password: <%= ENV['APPNAME_DATABASE_PASSWORD'] %>

Puma

Puma 配置

编辑项目 config/puma.rb

添加:

# workers 设置为 CPU 核心数
workers 1
threads 1, 6
# 后台运行
daemonize true
rails_env = ENV['RAILS_ENV'] || "production"
environment rails_env
app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/shared"
bind "unix://#{shared_dir}/sockets/puma.sock"
stdout_redirect "#{shared_dir}/log/puma.stdout.log", "#{shared_dir}/log/puma.stderr.log", true
pidfile "#{shared_dir}/pids/puma.pid"
state_path "#{shared_dir}/pids/puma.state" on_worker_boot do
require "active_record"
ActiveRecord::Base.connection.disconnect! rescue ActiveRecord::ConnectionNotEstablished
ActiveRecord::Base.establish_connection(YAML.load_file("#{app_dir}/config/database.yml")[rails_env])
end

新建 log,pids,sockets 文件夹

$ mkdir -p shared/log shared/pids shared/sockets

部署项目

上传项目到服务器

$ scp -r /path/to/project deploy@1.2.3.4:~/
# 也可以使用 Git

安装项目依赖

$ bundle install

安装 Webpacker

$ bundle exec rails webpacker:install

配置生产环境密钥

生成密钥

$ RAILS_ENV=production rake secret

设置环境变量

编辑 ~/.bashrc,添加:

export SECRET_KEY_BASE='刚才生成的密钥'

使设置生效

$ source ~/.bashrc

编译 Assets

$ RAILS_ENV=production rake assets:precompile

创建数据库

$ bundle exec rake db:create

数据库迁移

$ RAILS_ENV=production rails db:migrate

启动服务器

$ puma
# 重启
$ pumactl restart
# 停止
$ pumactl stop

Rails + Webpacker + Puma + Nginx 部署的更多相关文章

  1. 使用passenger在Centos7部署Puma+Nginx+Ruby on Rails

    安装ruby环境 RVM(ruby版本管理工具)安装 gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A170311 ...

  2. CentOS Mono Nginx 部署 MVC4+WebApi

    CentOS Mono Nginx 部署 MVC4+WebApi 经过几天的折磨,终于在CentOS上成功部署了MVC4+WebApi.Mono上的服务器推荐两种:Jexus(国产高人写的一款很牛的服 ...

  3. Ubuntu上通过nginx部署Django笔记

    Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式.今天在Ubuntu上使用Nginx部署Django服务,虽然不是第一次搞这个了,但是发现还是跳进了好多坑,g ...

  4. Ubuntu 14.04 上使用 Nginx 部署 Laravel

    本教程将会涉及以下工具: Ubuntu 14.04 LTS PHP 5.5 MySQL Laravel 5.0 Nginx 参考文章:Ubuntu 14.04 上使用 Nginx 部署 Laravel ...

  5. 使用uWSGI+nginx部署Django项目

    最近使用django写了一些项目,不过部署到服务器上碰到一些问题,还有静态文件什么的一堆问题,这里总结一下碰到的问题和解决方案,总体思路是按照官方文档走的. 原文地址:http://uwsgi-doc ...

  6. FastDFS+Nginx部署详细教程

    本例使用到的所有tar和zip包地址:http://download.csdn.net/detail/corey_jk/9758664 本例中使用CentOS1.CentOS2两台机器实现. 1 GC ...

  7. Centos6.5中Nginx部署基于IP的虚拟…

    Centos6.5 中Nginx 部署基于IP 的虚拟主机 王尚2014.11.18 一.介绍虚拟主机 虚拟主机是使用特殊的软硬件技术,把一台真实的物理电脑主机 分割成多个逻辑存储单元,每个单元都没有 ...

  8. Ubuntu 下使用 Nginx 部署 .NET Core 2.0 网站

    前言 本文介绍如何在 Ubuntu 16.04 服务器上安装 .NET Core 2.0 SDK.创建项目与发布,并使用 Nginx 部署 .NET Core 2.0 Web 项目. 安装 .NET ...

  9. CentOS7上Docker简单安装及nginx部署

    安装 如果原来安装过docker,先把原来的删掉,再安装(如果是首次安装docker忽略第一步,直接在第二步看起) 1.1先查看下已经安装了那些docker yum list installed | ...

随机推荐

  1. ABAP分享二 ALV标准范例DEMO汇总

    SAP软件针对ALV的使用方法,提供了ALV标准demo程序: sap提供的ALV标准demo程序,只是展示简单的数据,用function ALV即可,若有复杂的增删改查操作 建议使用OO ALV,下 ...

  2. Windows相关操作(备忘)

    查看服务端口是否能通:telnet 192.168.1.11 8888 查看端口是否被占用 netstat -ano

  3. python serial模块使用,是pyserial而非serial

    import serial from serial.tools.list_ports import comports 运行这两句时分别遇到错误 第一个先提示 no module name of ser ...

  4. Node.js实现图片上传功能

    node接口实现 const express = require('express') const mysql = require('mysql') const cors = require('cor ...

  5. go 语言学习图解

  6. 25.md5 collision(NUPT_CTF)

    抓住两点提示: 1.md5碰撞 2.please input a 利用0 == 字符串是成立的,从而可以绕过MD5检查. 所以找一个md5是0e开头的值,因为 php 在处理 == 的时候当碰到的字符 ...

  7. SpringBoot与数据层

    1.JDBC <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  8. Python 爬虫从入门到进阶之路(四)

    之前的文章我们做了一个简单的例子爬取了百度首页的 html,我们用到的是 urlopen 来打开请求,它是一个特殊的opener(也就是模块帮我们构建好的).但是基本的 urlopen() 方法不支持 ...

  9. 【重拾基础】耐人寻味的CSS属性white-space

    <耐人寻味的CSS属性white-space>,本文说的white-space是一个控制换行和空白处理的CSS属性.我曾经被这个属性烦死,一直没记住,今天决定还是写下来好好琢磨下. 属性值 ...

  10. Go-包

    Go-包 包的介绍以及使用 为什么使用包 为了更加好的维护代码 包的位置 必须再GOPATH路径的src中 能导入的内容 导入的内容名称必须是大写字母开头不然无法导入 包 src中的一个文件夹为一个包 ...