Skip to content

ZH CN Configuration

Billy.Zheng edited this page Apr 21, 2026 · 5 revisions

Procodile 使用 Procfile 来定义进程,也可以通过同目录下Procfile.optionsProcfile.local 文件提供额外配置。

Procfile

Procfile 用来定义进程名和命令:

web: bundle exec puma -C config/puma.rb
worker: bundle exec rake app:worker

进程名在大小写不敏感的意义下必须唯一。例如,webWeb 会被视为重复,因此不允许同时存在。

Procfile 中的定时进程

Procodile 支持直接在 Procfile 里定义定时进程。

使用 __AT__ 分隔进程名和 cron 表达式:

"cleanup__AT__*/10 * * * * *": bundle exec rake cleanup

注意:

  • __AT__ 必须使用大写的 AT,并且左右两侧都必须恰好有两个下划线。
  • cron 表达式使用五个或六个以空格分隔的字段:
    • second(可选)
    • minute
    • hour
    • day
    • month
    • weekday
  • 可选的 second 字段是在传统五字段 crontab 语法基础上的扩展。

你也可以在 options files 中通过 processes.<name>.at 来定义 schedule。更完整的说明见 定时进程

Options Files

这里统称 Procfile.optionsProcfile.localoptions files

在 options files 中,进程名必须和 Procfile 中的条目完全一致。

Procfile.options

Procfile.options 用来存放通常应该随应用一起提交的共享配置。

# 在 status 输出和其他用户可见消息中显示的应用名
app_name: Llama Kit

# 应用的绝对路径(可选,但在使用符号链接部署时很有用)
root: /absolute/path/to/app

# 存放所有 PID 文件的目录(默认是 `pids`)
pid_root: tmp/procodile-pids

# Procodile supervisor 日志文件的路径
# 默认是应用根目录下的 `procodile.log`
log_path: log/procodile.log

# 每个进程单独日志文件的目录。如果设置了这个目录,
# 每个进程都可以写到独立文件,而不是共用 procodile.log
log_root: log

# 应用应该以哪个用户身份运行。如果指定,Procodile 会通过 sudo
# 以该用户重新执行自身,因此 supervisor 和托管进程都会以该用户运行。
user: rails

# 如果你的应用提供 console,可以在这里配置,这样 `procodile console`
# 就能在应用环境已经加载好的情况下启动它。
console_command: bundle exec rails console

# 提供给所有子进程的环境变量
env:
  RAILS_ENV: production
  SECRET_KEY_BASE: XXX

# 按进程分别配置的选项
processes:
  web:
    # 需要启动多少个该类型的实例(默认是 1)
    quantity: 2

    # 该进程的 STDOUT/STDERR 输出写到哪里(默认写到 procodile.log,
    # 如果配置了 log_root,也可能写到对应目录下)
    log_path: log/processes/web.log

    # 如果没有设置 log_path,则在 log_root 下使用的文件名
    log_file_name: webserver.log

    # 该进程使用哪种重启模式(默认是 term-start)
    # 见 [[重启模式|ZH-CN-Restart-Modes]]。
    restart_mode: usr2

    # 在 respawn window 内允许的最大自动拉起次数(默认是 5)
    max_respawns: 10

    # respawn window 的大小,单位是秒(默认是 3600)
    respawn_window: 300

    # 停止该进程时发送的信号(默认是 TERM)
    term_signal: INT

    # 如果设置了这个值,Procodile 会自动为该进程的实例分配 `PORT`,
    # 从这个端口号开始往上找
    allocate_port_from: 7000

    # 端口分配时使用的网络协议。
    # 支持 tcp 和 udp(默认是 tcp)。代理功能要求使用 tcp。
    network_protocol: tcp

    # 当 supervisor 级别的 proxy 模式开启时,为该进程配置代理监听地址和端口。
    # 默认没有 proxy port,默认地址是 127.0.0.1。
    proxy_port: 5050
    proxy_address: 0.0.0.0

    # 提供给该进程所有实例的环境变量
    env:
      PORT: 5500

  cron_cleanup:
    # 按计划执行这个进程。cron 表达式使用五个或六个以空格分隔的字段。
    # 如果存在,可选的第一个字段是 second。
    at: "*/10 * * * * *"
    # 如果以后把一个已存在的 scheduled process 的 `at` 删掉然后执行 reload,
    # 当前实现会把它当作普通的 long-running process 来处理。
    # 每次调度运行都会在这里指定的秒数范围内随机向后延迟。
    random_delay: 600

Procfile.local

Procfile.local 用来存放机器本地或部署相关的覆盖配置,通常不会提交到版本库。

和上面一样,你不需要把所有选项都写一遍,只需要写你想覆盖的部分即可。

processes:
  worker:
    quantity: 4

在 Options Files 中定义定时进程

除了使用 Procfile 里的特殊语法,你也可以在 options files 里通过 at: 来定义 schedule:

processes:
  cron_cleanup:
    # 按计划执行这个进程。cron 表达式使用五个或六个以空格分隔的字段。
    # 如果存在,可选的第一个字段是 second。
    # WARNING: 如果以后把一个已存在的 scheduled process 的 `at` 删掉然后执行
    # reload,当前实现会把它当作普通的 long-running process 来处理。
    at: "*/10 * * * * *"
    # 每次调度运行都会在这里指定的秒数范围内随机向后延迟。
    random_delay: 600

这和在 Procfile 里写成 cron_cleanup__AT__*/10 * * * * * 是等价的。

环境变量

全局环境变量可以定义在 env 下,按进程的环境变量可以定义在 processes.<name>.env 下。

如果启动 supervisor 时使用了 --env-file,优先级是:process env > env file > global env。详情见 环境文件

服务器级配置

服务器级配置允许你定义一个或多个应用,这样你就可以在不先进入应用目录的情况下直接执行 procodile 命令。Procodile 会自动确保命令在正确的应用上下文中执行。

这个文件应该放在 /etc/procodile

root: /opt/appmail/app/current

多个应用

如果你的服务器上有多个应用,也可以把它们都定义在这个文件里。执行 procodile 时,会提示你选择其中一个应用。

-
  name: Widgets App
  root: /path/to/widgets/app
-
  name: Another App
  root: /path/to/another/app

Clone this wiki locally