准备

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. EXCEPTION_ACCESS_VIOLATION(0xc0000005)

    EXCEPTION_ACCESS_VIOLATION(0xc0000005)eclipse.ini中添加:-XX:CompileCommand=exclude,org.eclipse.jdt.inte ...

  2. PHP switch的写法

    switch switch (expression) { case label1: expression = label1 时执行的代码 ; break; case label2: expressio ...

  3. tensorflow 神经网络模型概览;熟悉Eager 模式;

    典型神经网络模型:(图片来源:https://github.com/madalinabuzau/tensorflow-eager-tutorials) 保持更新,更多内容请关注 cnblogs.com ...

  4. python科学计算和数据分析常用库

    NumPy NumPy最强大的是n维数组,该库还包含基本的线性代数函数.傅立叶变换.随机函数和其他底层语言(如Fortran.C和C++)集成的工具. SciPy SciPy建立在NumPy基础上,它 ...

  5. 关于soapui接口的笔记

    1.接口包含内容 #request: HTTP版本/请求地址url 请求方法:GET.POST.PUT.DELETE等 请求头:content—type 请求正文:请求参数 #response: 状态 ...

  6. 【转】开发一个这样的 APP 要多长时间?

    作者:蒋国刚 www.cnblogs.com/guogangj/p/4676836.html 呵呵. 这是一个“如有雷同,纯属巧合”的故事,外加一些废话,大家请勿对号入座.开始了…… 我有些尴尬地拿着 ...

  7. 《IM开发新手入门一篇就够:从零开发移动端IM》

        登录 立即注册 TCP/IP详解 资讯 动态 社区 技术精选 首页   即时通讯网›专项技术区›IM开发新手入门一篇就够:从零开发移动端IM   帖子 打赏 分享 发表评论162     想开 ...

  8. shell中字典的一个用法示例

    1. shell中字典的用法示例, 数组用法同字典 2. 以上使用sell配合字典实现的功能, 使用awk能轻松搞定, 如下: awk '{print $2}' file.txt | sort | u ...

  9. vue--过滤与动画

    什么是过渡和动画 元素在显示和隐藏时,实现过渡或者动画的效果,常用的过滤和动画都是使用CSS来实现的. 在CSS中操作transition(过渡)或 animation(动画)达到不同效果 为目标元素 ...

  10. 【Linux命令】用户身份(useradd,groupadd,usermod,passwd,userdel)

    目录 用户身份 useradd userdel usermod groupadd groupdel passwd chage 用户身份 在linux系统中和windows一样有用户之分.root用户为 ...