nginx无法连接到rails app

时间:2013-05-20 22:00:43

标签: ruby-on-rails nginx passenger

nginx错误日志说:failed (2: No such file or directory)我在浏览器中看到404错误。访问我的应用程序主页(www.myapp.com)时,我正在"欢迎访问nginx" 页面。

我尝试了很多配置变体。这是当前的一个:

配置文件

user  mo;
worker_processes  4;
error_log /opt/nginx/logs/error.log;
pid   /opt/nginx/logs/nginx.pid;
events {
worker_connections  1024;
}

http {
passenger_root /home/mo/gemshome/gems/passenger-4.0.2;
passenger_ruby /usr/local/bin/ruby193;

rails_env production;

include       mime.types;
default_type  application/octet-stream;
sendfile        on;
keepalive_timeout  65;


server {
listen       80;
    server_name  www.myapp.com;
    root /home/mo/myapp/public;
passenger_enabled on;
    location / {
        root   html;
        index  index.html index.htm;
    }

    # redirect server error pages to the static page /50x.html              

然而,我不确定是否正确设置了rails生产环境(nginx配置文件对应的行)。

我关注了所有或大部分phusion HOWTO。

运行webrick服务器时,应用程序正常运行。所以我假设我的应用程序正常运行,但这是在端口3000上运行所以我需要知道如何一起运行nginxpassenger

2 个答案:

答案 0 :(得分:2)

简短回答

我们正在使用thin网络服务器。 nginx配置为将所有请求重定向到正在运行的thin实例,这是秘密。

这个想法是:

  • Rails正在端口运行,比方说3000
  • nginx直接处理应用程序'目录中的所有静态
  • nginx将所有请求(不是静态的)重定向到localhost:3000

示例配置

这是nginx配置文件:

server {
    listen       80;
    server_name myapp.com;
    client_max_body_size 800M;
    client_header_timeout 23m;
    client_body_timeout 23m;
    send_timeout 23m;

    root /home/user/myapp/public/;
    error_log /home/user/myapp/log/nginx_errors.log;
    access_log /home/user/myapp/log/nginx_access.log;

# One more statics route
#    location /assets/(.+-[a-z0-9]+\.\w+) {
#        root /home/user/myapp/public/assets/$1;
#        internal;
#    }

    location /images/(.+)(\?.*)? {
        root /home/user/myapp/public/images/$1;
        internal;
    }

    location / {
        proxy_read_timeout 120;
        proxy_connect_timeout 120;

        proxy_redirect          off;
        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-Sendfile-Type X-Accell-Redirect;

        if (-f $request_filename) {
            expires max;
            break;
        }

        if (!-f $request_filename) {
            proxy_pass http://127.0.0.1:3000;
            break;
        }
    }
}

这是thin配置文件:

chdir: /home/user/myapp/
environment: production
address: 0.0.0.0
port: 3000
timeout: 30
log: log/thin.log
pid: tmp/pids/thin.pid
max_conns: 1024
max_persistent_conns: 100
require: []
wait: 30
servers: 1
daemonize: true
threaded: true

使用瘦和nginx运行应用程序

因此,要运行您的应用程序,其中nginx处理所有静态并很好地将您从myapp.com重定向到您的Rails应用程序'实例,请执行以下操作:

  1. thin gem依赖项添加到Gemfilegem 'thin'
  2. 安装所有捆绑包:bundle install
  3. 复制并粘贴,然后将nginx配置文件编辑为/etc/nginx/sites-available/myapp.conf
  4. nginxln -s /etc/nginx/sites-enabled/myapp.conf /etc/nginx/sites-available/myapp.conf
  5. 启用您的网站
  6. thin处创建/etc/thin配置文件,复制并粘贴此帖子中的内容,然后进行更正:mkdir /etc/thin && touch /etc/thin/myapp.yml
  7. 为您的系统全局安装thinthin install(然后按照说明操作)
  8. 运行thin,然后运行nginx/etc/init.d/thin start && /etc/init.d/nginx restart
  9. 注意:如果您在本地运行服务器并希望在/etc/hosts域上测试您的应用程序,请不要忘记添加到myapp.com的路由:

    127.0.0.1 myapp.com
    

    后记

    据我所知,

    nginx主要用作代理服务器或静态处理服务器。这是因为它的极简和速度。 nginx非常擅长这些任务。

    然而,Phusion Passenger真的非常慢。我在工作中发现了自己。这就是为什么我们切换到thin

    所以我的回答是基于我自己的经验,仅此而已。

    但是,您可以使用passenger代替thin - nginx仍会将您重定向到您的应用。但处理您的请求可能需要更多时间。

    希望有一天这会有所帮助。谢谢你的问题和快乐的编码!

答案 1 :(得分:0)

在* passenger_enabled on * write * rails_env开发之后的服务器块中; *到下一行并删除rails_env生产;从http块然后重新加载服务器。