【发布时间】: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