准备

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. 使用docker部署filebeat和logstash

    想用filebeat读取项目的日志,然后发送logstash.logstash官网有相关的教程,但是docker部署的教程都太简洁了.自己折腾了半天,踩了不少坑,总算是将logstash和filebe ...

  2. oracle截取时间的年/月/日/时/分/秒

    修改日期格式为年月日时分秒: alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';select to_char(sysdate,'yyy ...

  3. 从简单Sql探索优化之道

    从简单Sql探索优化之道 梁敬彬 2016-03-17 09:39:41 本文需要优化的语句是select count(*) from t,这简单的统计语句一出,估计不少人纳闷了,能有啥优化空间,还优 ...

  4. Community structure enhanced cascade prediction 笔记

    目录 一.摘要 二.杂记 三.模型思想 四.实验 五.其他 六.参考文献 一.摘要 深度学习不用去手工提取特征,但是现有深度模型没有在传播预测任务中使用社区结构.所以提出一个CS-RNN框架,把社区在 ...

  5. 六、接上一个博客-ITK例子运行结果

    一.程序介绍 该程序的主要思路如下: 二.程序参数 1-程序自己创建三维图像的时候 我自己计算得到的参数如下: 三维图像参数:  旋转参数: 光线投射法参数: 当我们输入参数:  -v 得到程序的输出 ...

  6. acwing 851. spfa求最短路 模板

    地址 https://www.acwing.com/problem/content/description/853/ 给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出 ...

  7. Python中的模块引用机制

    一.模块引用 Def: 在Python 程序中使用另一个文件定义的类(方法).函数.数据等 被引用模块位置.通常 Python2 : "/Library/Python/2.7/site-pa ...

  8. 安装PS

    1:下载溜云库 2:查找PS软件,下载 3:按照教程安装

  9. Node.js module export async function

    一.Demo 1.首先定义 module 文件:bbb.js const fs = require("fs"); function readFileSync() { let res ...

  10. HDU - 5952 Counting Cliques

    Counting Cliques HDU - 5952 OJ-ID: hdu-5952 author:Caution_X date of submission:20191110 tags:dfs,gr ...