Logo
Section 1 / 5

配置生产环境

了解生产环境配置所需的更改。

导入

配置生产环境

了解生产环境配置所需的更改。

一些准备工作

你听说过烹饪术语 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。

🍀 实践练习

让我们自己动手试试:

  1. 点击 Run 按钮。
  2. 生成生产环境配置密钥。
  3. 编辑生产环境的 web 文件。
  4. 点击 Run 按钮。
  5. 通过以下命令查看修改后的文件:
    1cat .env/production/web 2 3cat .env/production/database

注意: 应用将在约 2 分钟后启动。请在看到 "Generate production config key" 消息后生成密钥。

No configuration found for ID: af38273f812e5fa8717fc4061ad87990a224d9fc3ce35c3035ead4ae3b6a77d6

解决方案如下:

  1. 点击 Run 按钮。
  2. 通过以下命令生成生产环境配置密钥:
    1docker-compose exec web bin/rails secret
  3. 修改后的生产环境 web 文件内容为:
    1DATABASE_HOST=database 2RAILS_ENV=production 3SECRET_KEY_BASE=<your_production_config_key> 4RAILS_LOG_TO_STDOUT=true 5RAILS_SERVE_STATIC_FILES=true
  4. 点击 Run 按钮。
  5. 通过以下命令查看修改后的文件:
    1cat .env/production/web 2 3cat .env/production/database

解决方案:

  1. 点击 Run 按钮。
  2. 通过以下命令生成生产环境配置密钥:
    1docker-compose exec web bin/rails secret
  3. 修改后的生产环境 web 文件内容为:
    1DATABASE_HOST=database 2RAILS_ENV=production 3SECRET_KEY_BASE=<your_production_config_key> 4RAILS_LOG_TO_STDOUT=true 5RAILS_SERVE_STATIC_FILES=true
  4. 点击 Run 按钮。
  5. 通过以下命令查看修改后的文件:
    1cat .env/production/web 2cat .env/production/database

至此,生产环境的基本配置已完成。 🎉

生产环境的格局

一个生产环境镜像