Как получить доступ к удаленной базе данных с помощью Rails+Nginx+Postgresql+DigitalOcean?

У меня есть приложение, в котором я использовал базу данных, расположенную на том же сервере (DigitalOcean Droplet), что и приложение. Итак, в моем приложении Rails это было:

конфиг/база данных.yml:

production:
  <<: *default
  database: example_production
  username: rails
  password: <%= ENV['EXAMPLE_DATABASE_PASSWORD'] %>

И это работало. Теперь я хочу выделенный сервер для базы данных. DigitalOcean выпустила для него кластеры баз данных. Так что я создал его.

Мой config/database.yml я изменил на:

production:
  url: <%= ENV["DO_DATABASE"] %>

Я сделал рельсы db:migrate и db:seed. И это сработало. Когда я проверяю содержимое базы данных, внутри все в порядке. Итак, у меня есть подключение к БД.

Но после перезапуска моего приложения, когда я перехожу на свою веб-страницу, я получаю:

502 Bad Gateway nginx/1.14.0 (Ubuntu)

Через некоторое время он меняется на:

503 Service Unavailable No server is available to handle this request.

Журнал ошибок моего сервера выглядит так:

2019/02/18 23:33:06 [error] 32636#32636: *1267 connect() failed (111: Connection refused) while connecting to upstream, client: some_IP_which_doesnt_matter, server: _, request: "GET / HTTP/1.0", upstream: "http://127.0.0.1:3000/", host: "cloud.digitalocean.com"

Итак: даже если бы я мог подключиться к удаленной базе данных для миграции и заполнения, я не могу получить к ней доступ через веб-страницу. Когда я возвращаюсь (на время) во внутреннюю базу данных, тогда страница работает.

Я не знаю, идет ли речь о конфигурации сервера или конфигурации его базы данных (в кластере базы данных DigitalOcean я не могу получить доступ к файлам конфигурации, у меня есть только прямой доступ к postgresql).

В базе данных настройки уровня DigitalOcean обычные, поэтому: Моя капля добавлена ​​в «РАЗРЕШЕННЫЕ ВХОДЯЩИЕ ИСТОЧНИКИ». По сути, на панели базы данных DigitalOcean есть несколько вариантов настройки. Похоже, что он должен просто работать «как шарм», когда вы подключаетесь к нему.

Я много пробовал с «серверным блоком» NGINX для моего приложения моей капли. Теперь файл /etc/nginx/sites-available/rails выглядит так:

server {
    listen   80;
    listen [::]:80;
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    root /home/rails/model_app/public;
    server_name _;
    index index.htm index.html;

        location ~ /.well-known {
                allow all;
        }

        # From https://object.io/site/2015/rails-nginx-easy-assets
        #
        # Cache forever publicly: files for generated assets
        #   /assets/application-2565b50fc38a0b3a44882faa3e936262.css
        #
        # This setup means a CDN may cache these files
        location ~ "^/assets/.+-[0-9a-f]{32}.*" {
                gzip_static on;
                expires     max;
                add_header  Cache-Control public;
        }

        location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Port 443;
        proxy_set_header X-Client-Verify SUCCESS;
        proxy_set_header X-Client-DN $ssl_client_s_dn;
        proxy_set_header X-SSL-Subject $ssl_client_s_dn;
        proxy_set_header X-SSL-Issuer $ssl_client_i_dn;
        proxy_read_timeout 1800;
        proxy_connect_timeout 1800;
        }
}

Моя настройка брандмауэра:

Status: active

To                         Action      From
--                         ------      ----
80/tcp                     ALLOW       Anywhere                  
443/tcp                    ALLOW       Anywhere                  
22/tcp                     LIMIT       Anywhere                  
3000                       ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
Nginx Full                 ALLOW       Anywhere                  
OpenSSH                    ALLOW       Anywhere                  
25060                      ALLOW       Anywhere                  
25061                      ALLOW       Anywhere                  
25060/tcp                  ALLOW       Anywhere                  
25061/tcp                  ALLOW       Anywhere                  
53                         ALLOW       Anywhere                  
53/tcp                     ALLOW       Anywhere                  
53/udp                     ALLOW       Anywhere                  
80/tcp (v6)                ALLOW       Anywhere (v6)             
443/tcp (v6)               ALLOW       Anywhere (v6)             
22/tcp (v6)                LIMIT       Anywhere (v6)             
3000 (v6)                  ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)             
Nginx Full (v6)            ALLOW       Anywhere (v6)             
OpenSSH (v6)               ALLOW       Anywhere (v6)             
25060 (v6)                 ALLOW       Anywhere (v6)             
25061 (v6)                 ALLOW       Anywhere (v6)             
25060/tcp (v6)             ALLOW       Anywhere (v6)             
25061/tcp (v6)             ALLOW       Anywhere (v6)             
53 (v6)                    ALLOW       Anywhere (v6)             
53/tcp (v6)                ALLOW       Anywhere (v6)             
53/udp (v6)                ALLOW       Anywhere (v6)  

Так что мне кажется, что дело в настройке NGINX, но сейчас я понятия не имею, где искать. Любые идеи?

[РЕДАКТИРОВАТЬ]

Речь идет о сервере приложений - puma. С "локальной" базой он запускается автоматически:

rails@app:~/model_app$ ps aux | grep [p]uma
rails    31314  5.7  1.6 1054540 133500 ?      Ssl  06:05   0:02 puma 3.12.0 (tcp://0.0.0.0:3000) [model_app]

С «удаленной» базой данных это не так. Когда я запускаю его:

bundle exec puma

Тогда результат:

rails@app:~$ ps aux | grep [p]uma
rails      535  1.6  1.7 1056636 142552 pts/3  Sl+  06:13   0:06 puma 3.12.0 (tcp://0.0.0.0:3000) [model_app]

Мой файл: /etc/systemd/system/rails.service

[Unit]
Description=ExampleApp
Requires=network.target

[Service]
Type=simple
User=rails
Group=rails
WorkingDirectory=/home/rails/model_app/
ExecStart=/bin/bash -lc 'bundle exec puma'

TimeoutSec=30s
RestartSec=30s
Restart=always

[Install]
WantedBy=multi-user.target

Почему он не запускается автоматически, когда я связываю удаленную базу данных?

502 и 503 не похоже, что они имеют какое-либо отношение к вашей базе данных.

engineersmnky 19.02.2019 22:03

Да, но все же: когда я включаю настройку «внутренней базы данных» в Rails, ошибок нет, и страница работает. Когда я включаю настройку «remote db», у меня возникает ошибка 503.

Motash 19.02.2019 22:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
567
1

Ответы 1

Вы проверили, работает ли ваш сервер приложений? Nginx выдает 502 при сбое переадресации прокси. Попробуйте запустить ps aux | grep [p]uma (замените puma сервером приложений, который вы используете) и посмотрите, работает ли он.

Если он не запущен, то запустите его, он должен работать. Если это все еще не работает, проверьте наличие ошибок в логах nginx (/var/log/nginx/error.log). Вы найдете проблему там. Если вам все еще нужна помощь, опубликуйте последние несколько строк из файла журнала здесь, чтобы мы могли попытаться понять проблему.

Вы правы, это про пуму. Он не запускался автоматически, поэтому, когда я сделал это вручную, страница работает. Как заставить его запускаться автоматически, а затем со сценарием «удаленная база данных»? Я отредактировал вопрос и вставил несколько строк «grep».

Motash 20.02.2019 07:22

Дополнительная вещь: когда puma включена вручную, страница удаленной базы данных работает (я предполагаю, что она считывает все значения из БД), но когда я пытаюсь добавить/отредактировать в БД некоторые значения (например, регистрация пользователя, которая работала с «локальной» БД) Я получаю ошибку 422.

Motash 20.02.2019 07:38

После расследования я выяснил, что моя переменная env <%= ENV["DO_DATABASE"] %> была замечена системой во время миграции, но не была замечена при перезапуске сервера с помощью systemctl restart rails.service . Понятия не имею почему. Но я решил вставить в свой код исключительно данные. Затем перезапуск сервера работает правильно (приложение начинает работать). Спасибо за помощь.

Motash 25.02.2019 18:48

Другие вопросы по теме