0

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

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

配置文件

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 配置文件中的相应行)。

我遵循了所有或大部分的phusionHOWTO。

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

4

2 回答 2

2

简短的回答

我们正在使用网络服务器。配置为将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处理所有静态的应用程序并很好地将您从 Rails 应用程序实例重定向myapp.com到您的 Rails 应用程序实例,请执行以下操作:

  1. thingem 依赖项添加到您的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. 创建您的thin配置文件/etc/thin,复制并粘贴此帖子中的内容,然后更正它:mkdir /etc/thin && touch /etc/thin/myapp.yml
  6. thin为您的系统全局安装:(thin install然后按照说明进行操作)
  7. 运行thin然后运行nginx/etc/init.d/thin start && /etc/init.d/nginx restart

注意:/etc/hosts如果您在本地运行服务器并想在域上测试您的应用程序,请不要忘记添加路由myapp.com

127.0.0.1 myapp.com

后记

nginx,据我所知,主要用作代理服务器或静态处理服务器。这是因为它的最小化和速度。nginx真的很擅长这样的任务。

然而,Phusion Passenger是一个非常非常慢的。这是我在工作中自己发现的。这就是我们切换到thin.

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

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

希望有一天这会对某人有所帮助。感谢您的提问和愉快的编码!

于 2013-05-21T08:34:21.250 回答
0

在 *passenger_enabled on* 之后的服务器块中,将 *rails_env development;* 写入下一行并删除 rails_env production; 从 http 块然后重新加载服务器。

于 2013-05-21T08:18:31.620 回答