Rails + Webpacker + Puma + Nginx 部署
准备
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 部署的更多相关文章
- 使用passenger在Centos7部署Puma+Nginx+Ruby on Rails
安装ruby环境 RVM(ruby版本管理工具)安装 gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A170311 ...
- CentOS Mono Nginx 部署 MVC4+WebApi
CentOS Mono Nginx 部署 MVC4+WebApi 经过几天的折磨,终于在CentOS上成功部署了MVC4+WebApi.Mono上的服务器推荐两种:Jexus(国产高人写的一款很牛的服 ...
- Ubuntu上通过nginx部署Django笔记
Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式.今天在Ubuntu上使用Nginx部署Django服务,虽然不是第一次搞这个了,但是发现还是跳进了好多坑,g ...
- Ubuntu 14.04 上使用 Nginx 部署 Laravel
本教程将会涉及以下工具: Ubuntu 14.04 LTS PHP 5.5 MySQL Laravel 5.0 Nginx 参考文章:Ubuntu 14.04 上使用 Nginx 部署 Laravel ...
- 使用uWSGI+nginx部署Django项目
最近使用django写了一些项目,不过部署到服务器上碰到一些问题,还有静态文件什么的一堆问题,这里总结一下碰到的问题和解决方案,总体思路是按照官方文档走的. 原文地址:http://uwsgi-doc ...
- FastDFS+Nginx部署详细教程
本例使用到的所有tar和zip包地址:http://download.csdn.net/detail/corey_jk/9758664 本例中使用CentOS1.CentOS2两台机器实现. 1 GC ...
- Centos6.5中Nginx部署基于IP的虚拟…
Centos6.5 中Nginx 部署基于IP 的虚拟主机 王尚2014.11.18 一.介绍虚拟主机 虚拟主机是使用特殊的软硬件技术,把一台真实的物理电脑主机 分割成多个逻辑存储单元,每个单元都没有 ...
- Ubuntu 下使用 Nginx 部署 .NET Core 2.0 网站
前言 本文介绍如何在 Ubuntu 16.04 服务器上安装 .NET Core 2.0 SDK.创建项目与发布,并使用 Nginx 部署 .NET Core 2.0 Web 项目. 安装 .NET ...
- CentOS7上Docker简单安装及nginx部署
安装 如果原来安装过docker,先把原来的删掉,再安装(如果是首次安装docker忽略第一步,直接在第二步看起) 1.1先查看下已经安装了那些docker yum list installed | ...
随机推荐
- [转]UiPath Invoke Code
本文转自:https://dotnetbasic.com/2019/08/uipath-invoke-code.html We will learn step by step tutorial for ...
- 搭建Vue开发环境
1.安装Node.js 安装包下载地址: https://nodejs.org/en/ 安装时可以选择是否自动安装必要的工具,如Chocolatey.Python2,这里我选择了自动安装 Node.j ...
- 软工第八次实验——Git
hiahiahia我又来作恶了,莫名其妙的第八次实验还要更新! 文章目录 一.Git 1.1 概述 1.1.1 Git 1.1.2 分布式版本控制系统 1.1.3 指令集 1.2 版本控制系统 1.2 ...
- 解读并加工BeautifulReport 报告模板
使用unittest框架的脚本执行完成后,会生成一个html格式的报告 这个报告是提前制作了一个html的模板,然后将对应的内容写入到模板中,并生成一个最终的报告,这个报告模板在通过 pip inst ...
- log4j日志打印的配置文件简单使用
log4j.properties #将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码 log4j.rootLogger=DEBUG,c ...
- js中触发表单提交
html代码: <form action="/test/action" method="get" id="myForm"> &l ...
- 关于如何将sublime配置C++环境的总结
首先我得说,嗯,为了这个玩意为翻烂了99%的百度能搜到的文章.研究了关于Win7 32位,64位,Win10版本的配置,Win10的已经写好了一篇文章,可是Win7党(我是都用的,在家用Win10,学 ...
- npm与cnpm的区别
NPM(Node Package Manager,节点包管理器)是NodeJS的包管理器,用于节点插件的管理(包括安装,卸载和管理依赖等).NPM是随同新版的NodeJS一起安装的包管理工具,所以我们 ...
- [问题排查]通过调度系统远程执行脚本,报mysql command not found异常
今天在公司使用LS调度系统(百度内部的工具),执行远程脚本的时候,每次都失败. 脚本内容比较简单,其实就是将HDFS(AFS)中的数据插入到Palo(Doris)数据库中,脚本如下: mysql -h ...
- 修改shell命令提示符和命令的输入颜色
修改命令提示符颜色 修改命令提示符的话,只需修改PS1环境变量即可. PS1='\[\033[01;31m\][\u@\h \W]$ \[\033[00m\]' 效果如图: 修改命令输入的颜色 修改命 ...