如何在服务器配置 Rails 项目环境

263 阅读3分钟

如果数据库是 MySQL 的项目

sudo apt-get install mysql-server
sudo apt-get install libmysqlclient-dev

可以在服务器用 docker 启动一个 MySQL 数据库

docker run -v /home/mysql57/data:/var/lib/mysql57/data --name=mysql -it -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

如果启动的时候,3306 端口被占用,那么可以用这个链接解决

sudo netstat -nlpt |grep 3306
sudo service mysql stop

克隆项目到服务器 ubuntu 目录

Ruby 依赖于几个可以通过包管理器安装的包。安装完成后,可以安装 rbenv 并使用它来安装 Ruby

首先,更新包列表:

sudo apt update

接下来,安装 Ruby 所需的依赖项:

sudo apt install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm5 libgdbm-dev

按照这个来安装安装 rbenv

然后安装 ruby

rbenv install 2.5.8
# 我的服务器是1核1G,非常慢,需要耐心等待
RUBY_CONFIGURE_OPTS=--disable-install-doc rbenv install 2.5.8 
rbenv global 2.5.8

按照这个来安装安装 nvm

如果报错 OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to gitee.com:443,使用 git config --global http.sslBackend "openssl" 解决

然后安装 node

nvm install 14

有的项目需要 imagemagick

sudo apt install imagemagick

项目需要版本 1.17.3 的 bundler,先 gem install bundler:1.17.3 安装 bundler

进入项目目录,在项目目录运行 bundle

如果 bundle 的时候遇到错误:There was an error while trying to write to ../Gemfile.lock. It is likely that you need to grant write permissions for that path.,可以用这个方法解决

sudo chown -R $(whoami):$(whoami) myappfolder
# myappfolder 是你的目录

创建数据库,数据库迁移

如果报错:Missing secret_key_base for 'production' environment, set this string with rails credentials:edit
可以用下面的命令执行

SECRET_KEY_BASE=1111 RAILS_ENV=production bundle exec rails db:create
SECRET_KEY_BASE=1111 RAILS_ENV=production bundle exec rails db:migrate

rails s 启动项目

在服务器用 rails s 命令在后台启动项目,需要在 config/puma.rb 文件添加一行 daemonize

SECRET_KEY_BASE=1111 RAILS_ENV=production bundle exec rails s

服务器IP:3000 打开页面

如果打不开,有可能是没有开放 3000 端口,去服务器安全组放开 3000 端口

打开之后,我看到的页面是没有 CSS 样式,需要编译静态资源到 public 目录

SECRET_KEY_BASE=1111 RAILS_ENV=production bundle exec rails assets:precompile

此时,我服务器报错 Cannot allocate memory,搜索到了这里

执行

echo 42768 > /proc/sys/kernel/pid_max

重新编译

SECRET_KEY_BASE=1111 RAILS_ENV=production bundle exec rails assets:precompile

重启项目之前需要结束掉原来项目的进程

lsof -i:3000
kill -9 pid # pid 是刚才查出来的占用 3000 端口的 pid

重启之后,还是没有 CSS 样式

还有一个问题

需要打开项目目录 config/environments/production.rb,修改

config.public_file_server.enabled = true # ENV['RAILS_SERVE_STATIC_FILES'].present?

这里暂时先不改

先用下面的命令:

RAILS_SERVE_STATIC_FILES=true SECRET_KEY_BASE=1111 RAILS_ENV=production bundle exec rails s

服务器IP:3000 打开页面,有 CSS 样式了,完成。

目前还没有介绍如何用 nginx 代理静态资源,以及如何用脚本停止、重启 Rails 项目。

修改 nginx 配置文件:/etc/nginx

nginx -s reload  # 修改配置后重新加载生效
service nginx restart
systemctl restart nginx
touch tmp/pids/puma.pid
sh manage.sh start production