【问题标题】:How to access remote database with Rails+Nginx+Postgresql+DigitalOcean?如何使用 Rails+Nginx+Postgresql+DigitalOcean 访问远程数据库?
【发布时间】:2019-07-13 09:35:18
【问题描述】:

我有一个应用程序,我使用的数据库与应用程序位于同一服务器 (DigitalOcean Droplet) 中。 所以在我的 Rails 应用程序中是:

config/database.yml:

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

而且它正在工作。 现在我想要一个专用的数据库服务器。 DigitalOcean 为其发布了数据库集群。所以我创建了它。

我的 config/database.yml 我改成了:

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

我已经制作了 rails db:migrate 和 db:seed。它奏效了。当我检查数据库内容时,一切都在里面。 所以我有一个与 db 的连接。

但是,在我的应用重新启动后,当我转到我的网页时,我收到:

502 Bad Gateway nginx/1.14.0 (Ubuntu)

一段时间后它变为:

503 Service Unavailable 没有可用于处理此请求的服务器。

我的服务器错误日志如下所示:

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 数据库面板中几乎没有设置选项。当您连接到它时,它看起来应该只是“像魅力一样”工作。

我在我的 droplet 应用程序中尝试了很多 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]

对于“远程”数据库,它不会;t。当我运行它时:

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 似乎与您的数据库无关。
  • 是的,但仍然:当我在 Rails 中打开“内部数据库”设置时,没有错误并且页面可以正常工作。当我打开“远程数据库”设置时,出现 503 错误。

标签: ruby-on-rails postgresql nginx digital-ocean


【解决方案1】:

您是否检查过您的应用服务器是否正在运行?当代理转发失败时,Nginx 给出 502。尝试运行ps aux | grep [p]uma(将 puma 替换为您正在使用的应用服务器)并查看它是否正在运行。

如果它没有运行,则运行它,它应该可以工作。如果仍然无法正常工作,请检查 nginx 日志 (/var/log/nginx/error.log) 中的错误。你会在那里发现问题。如果您仍需要帮助,请在此处发布日志文件的最后几行,以便我们尝试了解问题。

【讨论】:

  • 你是对的,它是关于 puma 的。它不是自动启动的,所以当我手动启动时,页面可以正常工作。如何让它在“远程数据库”场景下自动启动?我编辑了问题并粘贴了一些“grep”行。
  • 附加的东西:手动打开远程数据库页面的 puma 工作(我猜它从 db 读取所有值),但是当我尝试添加/编辑到 db 一些值(比如用户注册正在使用“本地”数据库)我收到错误 422。
  • 经过调查,我发现我的环境变量 在进行迁移时被系统看到,但在通过 systemctl restart rails 重新启动服务器时没有看到。服务 。我不知道为什么。但我决定在我的代码中插入异常数据。然后服务器重新启动正常工作(应用程序开始运行)。感谢您的帮助。
猜你喜欢
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 2016-11-28
  • 2016-04-25
相关资源
最近更新 更多