gpt4 book ai didi

ruby-on-rails-3 - 在 EC2 上使用 nginx + unicorn 服务 Rails 3 应用程序出现问题

转载 作者:行者123 更新时间:2023-12-02 04:03:19 26 4
gpt4 key购买 nike

当我将浏览器指向“rails_app.com”时,我可以在 EC2 实例上查看 rails_app/public/index.html,但是当我删除 rails_app/public/index.html 时出现 nginx 403 错误,

      directory index of "/home/www-data/rails_app/public/" is forbidden, 

而不是能够看到我的 Rails 3.0.3 rails_app。我正在使用
Nginx Version 0.8.54
Unicorn_rails Version 3.4.0

我读过的一篇文章说,我需要确保用户 www-data 可以使用正确版本的 ruby​​,我做到了。我将用户和组的 rails_app 的目录所有者设置为 www-data,并将权限设置为 775。通过查看访问日志,我可以看到 HTTP 请求正在到达 nginx。我为我的域名“rails_app.com”设置了 DNS,以指向一个 AWS 弹性 IP 地址,该地址是我在 rails 应用程序上运行 nginx + unicorn 的 EC2 实例的弹性 IP。

我想我解决了上面的这个 403 错误,如下面的更新 2 中所述。现在我收到 500 错误。我修复了 500 错误,如下面的更新 4 中所述。

我正在运行 nginx
/usr/sbin/nginx -c /home/www-data/rails_app/config/nginx.conf

我正在运行 unicorn
bundle exec unicorn_rails -p 8000 -E production -c /home/www-data/rails_app/config/unicorn.rb -D

这是我的 unicorn .rb:
worker_processes 1
preload_app true
main_dir = '/home/www-data/rails_app'
working_directory '/home/www-data/rails_app'
listen 8000, :tcp_nopush => true
listen "/tmp/shop.socket", :backlog => 2048
timeout 30
user 'www-data'
shared_path = "#{main_dir}/shared"
pid "#{shared_path}/pids/unicorn.pid"
stderr_path "#{shared_path}/log/unicorn.stderr.log"
stdout_path "#{shared_path}/log/unicorn.stdout.log"

更新 1 - 在阅读了这篇 link 之后,我简化了我的 nginx.conf关于 Nginx 的陷阱。
这是我的 nginx.conf:

更新 2 - 这个 post ,表示在try_files中有$uri/会导致403错误,因为nginx无法列出目录。所以我从 try_files 中删除了 $uri/,现在我得到一个 500 错误,在 nginx 或 unicorn 错误日志中没有任何显示。任何想法如何调试这个?
user www-data www-data;
worker_processes 2;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
accept_mutex on;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;

tcp_nopush on;
tcp_nodelay off;

keepalive_timeout 65;
client_body_timeout 120;
upstream app_server {
# server 127.0.0.1:8000 fail_timeout=0;
server unix:/tmp/shop.socket fail_timeout=0;
}

log_format main '\$remote_addr - \$remote_user [\$time_local] \$request '
'"\$status" \$body_bytes_sent "\$http_referer" '
'"\$http_user_agent" "\$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

server {
listen 0.0.0.0:80 ;
server_name rails_app.com *.rails_app.com;
index index.html index.htm index.php;
root /home/www-data/rails_app/public;

client_max_body_size 50M;

location / {
try_files $uri/index.html $uri.html $uri @app;
}

location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server;

} # location /

error_page 500 502 503 504 /500.html;
location = /50x.html {
root /home/www-data/rails_app/public;
}

} # server

} # http

使用 unicorn 的 TCP 端口,我可以看到 unicorn 正在使用
netstat -natp

现在我得到的错误是显示的 500.html 页面:
   We're sorry, but something went wrong.

nginx 错误日志文件或 unicorn 错误日志文件中没有错误。

更新 3 -

当我深入研究这一点时,我认为问题可能出在 unicorn 身上。当我在 example 上运行 rails 应用程序时,它工作正常,但那个rails应用程序使用的是sqlite3而不是mysql。此示例还允许通过在此处使用 before_fork 和 after_fork 代码实现零停机时间部署:
 before_fork do |server, worker|
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end

当我尝试使用 mysql 运行我的 rails_app 并在我的 unicorn.rb 文件中使用上面的 before_fork、after_fork 代码时,它失败并出现错误:
active_record/connection_adapters/abstract/connection_pool.rb:316:in `retrieve_connection': ActiveRecord::ConnectionNotEstablished (ActiveRecord::ConnectionNotEstablished)

更新 4 -

我将 -d (调试)添加到 unicorn_rails 命令行
bundle exec unicorn_rails -p 8000 -E production -c /home/www-data/rails_app/config/unicorn.rb -d -D  

并发现了一些错误,第一个是 config/application.rb 缺少 config.secret_token。添加并继续调试。

最佳答案

终于让它工作了。最后一个问题是 Unicorn 提示“/”没有路由。运行 'bundle exec rake routes' 没有产生任何结果。一旦 'bundle exec rake routes' 生成路由,如 here 所述,然后网站出现了。

关于ruby-on-rails-3 - 在 EC2 上使用 nginx + unicorn 服务 Rails 3 应用程序出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9059712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com