Назад | Перейти на главную страницу

Истекло время ожидания восходящего потока Puma и NGINX (110: время ожидания соединения истекло)

Доступ к приложению Puma, запущенному со службой systemd за прокси-сервером Nginx, приводит к следующей ошибке в журнале ошибок nginx:

 *6 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 1.2.3.4, server: mydomain.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/deploy/opt/app/shared/sockets/puma.app.sock/", host: "mydomain.com"

Журнал обслуживания Puma не содержит ошибок.

Однако запуск приложения Puma вручную локально (до nginx) не вызывает ошибок. Точно так же запуск того же приложения на http-прокси вместо unix-сокета puma также отлично работает, позволяя Nginx правильно обрабатывать запросы к серверу. Похоже, проблема не в моем backend ruby.

Стек

/etc/nginx/sites_available/mydomain.com

upstream app {
  server unix:/home/deploy/opt/app/shared/sockets/puma.app.sock;
}

server {
  listen 80;
  server_name mydomain.com;
  root /home/deploy/opt/app/public;

  location / {
    try_files $uri @puma;
  }

  location @puma {
    include proxy_params;

    proxy_pass http://app;
  }
}

/etc/systemd/system/puma-app.service

[Unit]
Description=Puma HTTP Server
After=network.target

[Service]
# Foreground process (do not use --daemon in ExecStart or config.rb)
Type=simple

# Preferably configure a non-privileged user
User=deploy
Group=sudo

# Specify the path to your puma application root
WorkingDirectory=/home/deploy/opt/app

# Helpful for debugging socket activation, etc.
Environment=DEBUG=1
EnvironmentFile=/home/deploy/opt/app/.env

# The command to start Puma
ExecStart=/home/deploy/.rbenv/shims/bundle exec puma -C /home/deploy/opt/app/config/puma.rb

TimeoutSec = 15
Restart=always

[Install]
WantedBy=multi-user.target

/home/deploy/opt/app/config/puma.rb

# Change to match your CPU core count
workers ENV.fetch("PUMA_WORKERS") { 1 }

# Min and Max threads per worker
threads ENV.fetch("PUMA_MIN_THREADS") { 1 }, ENV.fetch("PUMA_MAX_THREADS") { 10 }

app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/shared"

# Set up socket location
bind "unix://#{shared_dir}/sockets/puma.app.sock"

# Redirect STDOUT to log files
stdout_redirect "#{app_dir}/log/puma.stdout.log", "#{app_dir}/log/puma.stderr.log", true

# Set master PID and state locations
pidfile "#{shared_dir}/pids/puma.app.pid"
state_path "#{shared_dir}/pids/puma.app.state"
rackup app_dir

activate_control_app

Похоже, это проблема с разрешениями.

Переезд /home/deploy/opt/app/shared/sockets/puma.app.sock к /run/app/puma.app.sock (файлы + .pid и .state) исправили эту проблему.

Также мне пришлось назначить пользователя deploy в / запустить / приложение /

sudo chown -R deploy:sudo /run/app