我目前正在尝试在本地服务器(而不是VPS!)上部署Rails 5应用程序。我决定将Puma作为应用服务器,将nginx作为反向代理。在开发中,Rails应用程序的所有功能都正常。该应用程序还包括一个使用ActionCable向客户端发送更新的子页面,这些子页面显示在日志中。该应用程序不使用数据库,因为不需要在其中存储内容。此外,该项目需要使用SSL。
当我尝试使用当前设置启动它时,打开网站的URL会收到无法与服务器建立连接的消息。但是在日志中我实际上可以看到nginx处理请求,之后什么也没发生。我对nginx和puma不是很熟悉,但从日志中我会猜到ActionCable可能会出现问题吗?
3月29日更新:
此信息可能会有所帮助: 服务器上的系统是Debian 9,nginx版本是1.10.3,rails 5.1.4和puma 3.9.1。
我还有更多的nginx。当我试图访问网站时,我为nginx工作者做了一个strace:
>>> strace -f -s 512 -a 512 -o /tmp/nginx.out -p 23518ls
23518 recvfrom(11, "\26", 1, MSG_PEEK, NULL, NULL) = 1
23518 read(11, "\26\3\1\2\0\1\0\1\374\3\3\250\365,\30\333\35\37\26\1\240R\25\246\310\10\356\20z\357M\n)\356\364E\26\350L\336\266k\364 \267\23\322\2666\20\23H\257\274U\0\227}PH_\340\352\342\245\263\215:1\"\326U\1773\202\227\0\36\300+\300/\314\251\314\250\300,\3000\300\n\300\t\300\23\300\24\0003\0009\0/\0005\0\n\1\0\1\225\0\0\0$\0\"\0\0\37website-url-was-here.com\0\27\0\0\377\1\0\1\0\0\n\0\n\0\10\0\35\0\27\0\30\0\31\0\v\0\2\1\0\0#\0\340\236L\256\5\352\303t\10R\33L\200L\253n\363\1\24:\250\4\231\204\242\3769\273\326\35C\202\25\234R\35\343\0bYM\341\214\256\4S\32\32\2542V\313\3658G\320\215\314\273\323\243\327:N\200\227\266\212\2463\311\36_\31sy\3\347\31@\327\254k\300\344\215\336\263\207\376|30Z\317:r;~#4\34\340\37sy$\231\310\240\217\266\222\311(\372r\213_\"\220W.\343\363\214+/%p\25\272\6\365\227t\221\303\256\33Q\21\344k\372\334\343W[\206\235\300\332\276{\3205#\253\351bh\3629j\231\276\216\325-M\233\224Q\323i\347\312Tt\366h\277_\223\331\236\22\372\350\324j6R\3164X\312F\362OF\7\365\225\3272\353D4\353O@\370\37\345\260b*\200\37\242\247\31p\0\20\0\16\0\f\2h2\10http/1.1\0\5\0\5\1\0\0\0\0\0\r\0\30\0\26\4\3\5\3\6\3\10\4\10\5\10\6\4\1\5\1\6\1\2\3\2\1\0\25\0001\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 16709) = 517
23518 getpid() = 23518
23518 getpid() = 23518
23518 write(11, "\26\3\3\0d\2\0\0`\3\3a\274\256\7\v\303\275\327\v\21gPo\1\342\311e\303\310\252,]\213\223+\332\325\221\324\327S\371 \267\23\322\2666\20\23H\257\274U\0\227}PH_\340\352\342\245\263\215:1\"\326U\1773\202\227\300/\0\0\30\377\1\0\1\0\0\27\0\0\0\20\0\v\0\t\10http/1.1\24\3\3\0\1\1\26\3\3\0(\372)\17\301\347\237c\204\321\32_J\371i\31\332N\252R\227\220\22e\0109Y3\344]?\207\31\240Ya\377S\231\31r", 156) = 156
23518 read(11, 0x55f00c064ec3, 16709) = -1 EAGAIN (Resource temporarily unavailable)
23518 epoll_wait(8, [{EPOLLIN, {u32=2553787544, u64=140520998810776}}], 512, 58183) = 1
23518 read(11, "\24\3\3\0\1\1\26\3\3\0(\0\0\0\0\0\0\0\0yR\24\270\26\34x\264?\250\251\0344m\350c\210\357/da#C\261\211\37\335\351J\342\213\34", 16709) = 51
23518 read(11, 0x55f00c05f963, 16709) = -1 EAGAIN (Resource temporarily unavailable)
23518 epoll_wait(8, [{EPOLLIN|EPOLLOUT, {u32=2553787080, u64=140520998810312}}], 512, 58182) = 1
23518 recvfrom(10, "\201${\"type\":\"ping\",\"message\":1522309419}", 4096, 0, NULL, NULL) = 38
23518 write(3, "\27\3\3\0>\235\365\306=\362$44K\3429\240\322\262\246D\24M\271\371=\334\236\202\373\30TDI-'\225\v\343\37\341\224[\351\342NZ\340\335\355\274d~\351Z\312@\326\240\275\234g\312X\3517w", 67) = 67
23518 recvfrom(10, 0x55f00c054ec0, 4096, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
23518 epoll_wait(8, [{EPOLLIN|EPOLLOUT, {u32=2553787080, u64=140520998810312}}], 512, 58817) = 1
23518 recvfrom(10, "\201${\"type\":\"ping\",\"message\":1522309422}", 4096, 0, NULL, NULL) = 38
23518 write(3, "\27\3\3\0>\235\365\306=\362$45\3245\275\352S~\330m\244\312{\346\267\217\347\335\224\323\324n\276\304\220D\255K\16\217\317\25\322&\325J\346AV\1c\277,2\334\363\344\241\342*\367Db\361\37\216", 67) = 67
23518 recvfrom(10, 0x55f00c054ec0, 4096, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
23518 epoll_wait(8, <detached ...>
也许这有帮助吗? 我也在puma错误日志中找到了这个:
=== puma startup: 2018-03-29 09:34:16 +0200 ===
[2018-03-29 09:34:24.505] ERROR -- Specified 'redis' for Action Cable pubsub adapter, but the gem is not loaded. Add `gem 'redis'` to your Gemfile (and ensure its version is at the minimum required by Action Cable).: nil
ActionCable不能在没有redis的情况下工作吗?我没有安装它。
这是来自日志:
172.19.28.1 - - [27/Mar/2018:16:13:49 +0200] "GET /cable HTTP/1.1" 301 185 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
和
host, request: "GET /cable HTTP/1.1", upstream: "http://unix:/path/to/app/shared/sockets/puma.sock:/500.html", host: "hips-wordpress.helmholtz-hzi.de:9292"
2018/03/27 15:36:06 [error] 15944#15944: *154 connect() to unix:/path/to/app/shared/sockets/puma.sock failed (111: Connection refused) while connecting to upstream, client: 172.19.28.1, server: local
配置/环境/ production.rb:
[...]
# Mount Action Cable outside main process or domain
config.action_cable.url = [/ws:\/\/*/, /wss:\/\/*/]
config.action_cable.allowed_request_origins = [/http:\/\/*/, /https:\/\/*/]
#Use of SSL
config.force_ssl = false
[...]
配置/ puma.rb:
#!/usr/bin/env puma
# directory '/path/to/app/'
# Change to match your CPU core count
workers 2
# Min and Max threads per worker
threads 0, 1
app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/shared"
# Default to production
rails_env = ENV['RAILS_ENV'] || "production"
environment rails_env
# Set up socket location
bind "unix://#{shared_dir}/sockets/puma.sock"
# Logging
stdout_redirect "#{shared_dir}/log/puma.stdout.log", "#{shared_dir}/log/puma.stderr.log", true
# Set master PID and state locations
pidfile "#{shared_dir}/pids/puma.pid"
state_path "#{shared_dir}/pids/puma.state"
activate_control_app
# Allow puma to be restarted by `rails restart` command.
plugin :tmp_restartq
配置/ nginx.cfg:
events {
worker_connections 1024;
}
http {
upstream app {
# Path to Puma SOCK file, as defined previously
server unix:/path/to/app/shared/sockets/puma.sock;
}
server {
listen 9292 ssl;
server_name app.de ;
ssl_certificate /path/to/app/config/cert/certificate.pem ;
ssl_certificate_key /path/to/app/config/cert/public_key.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
root /path/to/app;
try_files $uri/index.html $uri @app;
location @app {
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://app;
}
location /cable {
proxy_pass http://app;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
}
}
要启动我使用启动脚本的所有内容:
#!/bin/bash
PATH=/path/to/app
cd $PATH
nginx -c config/nginx.cfg
export SECRET_KEY_BASE= <secret_key_base>
export RAILS_SERVE_STATIC_FILES=true
RAILS_ENV=production rails assets:precompile
puma -vvv -C config/puma.rb
此时我已经尝试修复了几个问题,这就是为什么配置部分由不同的教程和stackoverflow问题组装而成。根据我的理解,SSL应该不是问题,至少不是来自nginx方面。美洲狮似乎永远不会收到任何请求,因为日志保持空白。和nginx似乎无法将/ cable请求重定向到puma(这是订阅ActionCable Channel的url)。我是否为ActionCable的配置做错了什么? 我真的无法找到关于如何使用带有nginx / puma组合的生产中的ActionCable和SSL设置rails应用程序的教程。
如果您需要任何其他信息,我会将其包含在问题中。