配置生产环境
了解生产环境配置所需的更改。
一些准备工作
你听说过烹饪术语 mise en place 吗?字面意思是“一切就绪”,指的是在真正开始烹饪之前所做的准备工作。
同样,尽管我们迫不及待地想看到应用在生产环境中运行,但在此之前仍有一些准备工作需要完成。
在本章中,我们将:
-
为部署到生产环境打下基础,从如何在以 Docker 为中心的环境中配置不同环境开始;
-
预编译我们的资源文件并将其嵌入镜像中,以便在生产环境中提供服务;
-
学习如何共享自定义镜像,使其不仅限于本地机器使用。
砧板和削皮刀都准备好了吗?我们开始吧。
修改数据库配置
Rails 以其开箱即用的多环境支持而闻名。这如何与我们的 Docker 设置相契合?
我们的生产环境配置将不同于开发环境,但我们需要哪些设置,又该如何组织呢?
此前,我们为配置创建了如下文件结构:
1$ tree .env 2.env 3└── development 4 ├── database 5 └── web 61 directory, 2 files
我们需要为生产环境配置建立类似的结构作为起点:
1$ tree .env 2.env 3├── development 4│ ├── database 5│ └── web 6└── production 7 ├── database 8 └── web 92 directories, 4 files
生产环境的 web 文件
接下来,我们在 .env/production/web 文件中添加更多变量,内容如下:
1DATABASE_HOST=database 2RAILS_ENV=production 3SECRET_KEY_BASE= 4RAILS_LOG_TO_STDOUT=true 5RAILS_SERVE_STATIC_FILES=true
我们必须记得将 RAILS_ENV 设置为 production,以确保应用以生产模式启动。
Rails 使用 SECRET_KEY_BASE 作为安全机制来签名其设置的 cookies,从而验证接收到的 cookies 是否可信。此处故意留空,因为我们需要为生产环境生成一个新的密钥。
生成生产环境配置密钥
可以使用 Rails 提供的便捷 Rake 任务完成此操作:
1$ docker-compose exec web bin/rails secret 2 39d6d05e1990f81bbba154b1fc54c23c6ffaafb081a07e5ac3731160a6126e711c2f1d7623b6d 45140c03686462cda966344fe6f1b35fa44c14eaba50769692c74
生成的密钥需要粘贴到你的 .env/production/web 文件中,作为 SECRET_KEY_BASE 环境变量的值。
默认情况下,Rails 将日志写入磁盘上的 logs/<environment>.log 文件。但在 Docker 环境中,容器内部的文件系统日志难以访问。因此,配置应用将日志输出到 stdout,这样我们就可以通过 Docker 的日志命令查看日志。这可以通过将 RAILS_LOG_TO_STDOUT 环境变量设为 true 来实现。
此外,为了让 Rails 服务静态资源,需将 RAILS_SERVE_STATIC_FILES 设为 true,以在生产环境中提供这些资源。
生产环境的 database 文件
.env/production/database 文件需要更新为如下内容:
1POSTGRES_USER=postgres 2POSTGRES_PASSWORD=my-production-password 3POSTGRES_DB=myapp_production
Postgres 密码已更改,以区别于开发环境。数据库名称也更新为 myapp_production,而非 myapp_development。
🍀 实践练习
让我们自己动手试试:
- 点击 Run 按钮。
- 生成生产环境配置密钥。
- 编辑生产环境的 web 文件。
- 点击 Run 按钮。
- 通过以下命令查看修改后的文件:
1cat .env/production/web 2 3cat .env/production/database
注意: 应用将在约 2 分钟后启动。请在看到 "Generate production config key" 消息后生成密钥。
No configuration found for ID: af38273f812e5fa8717fc4061ad87990a224d9fc3ce35c3035ead4ae3b6a77d6
解决方案如下:
- 点击 Run 按钮。
- 通过以下命令生成生产环境配置密钥:
1docker-compose exec web bin/rails secret - 修改后的生产环境 web 文件内容为:
1DATABASE_HOST=database 2RAILS_ENV=production 3SECRET_KEY_BASE=<your_production_config_key> 4RAILS_LOG_TO_STDOUT=true 5RAILS_SERVE_STATIC_FILES=true - 点击 Run 按钮。
- 通过以下命令查看修改后的文件:
1cat .env/production/web 2 3cat .env/production/database
解决方案:
- 点击 Run 按钮。
- 通过以下命令生成生产环境配置密钥:
1docker-compose exec web bin/rails secret - 修改后的生产环境 web 文件内容为:
1DATABASE_HOST=database 2RAILS_ENV=production 3SECRET_KEY_BASE=<your_production_config_key> 4RAILS_LOG_TO_STDOUT=true 5RAILS_SERVE_STATIC_FILES=true - 点击 Run 按钮。
- 通过以下命令查看修改后的文件:
1cat .env/production/web 2cat .env/production/database
至此,生产环境的基本配置已完成。 🎉