nginx(+ passenger)似乎不在端口80上运行

时间:2013-01-01 13:23:56

标签: ruby-on-rails-3 macos nginx passenger homebrew

我的用户帐户上安装了nginx( 乘客 )( via 自制 )。几个小时后我觉得这件事只是拒绝工作,因为我无法让任何Rails3应用程序响应一个简单的nginx声明的位置。经过深思熟虑( AKA试错法)后,我得出结论认为它确实有效,但拒绝使用80端口。

我知道,自制安装是每用户安装,因此它不应该只在root用户端口上运行(即。端口1024及以下 ),但自制的以及网上的各种来源)表明只需通过sudo nginx运行服务器就足以允许它使用端口80。 / p>

这些是 工作的重要配置文件:

的/ etc /主机:

##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       doomhub.local localhost
255.255.255.255 broadcasthost
::1             localhost 
fe80::1%lo0     localhost

/usr/local/etc/nginx/nginx.conf:

#user  nobody;
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    passenger_root /Users/ellmo/.rvm/gems/ruby-1.9.3-p125/gems/passenger-3.0.18/;
    passenger_ruby /Users/ellmo/.rvm/rubies/ruby-1.9.3-p125/bin/ruby;

    include       mime.types;
    default_type  application/octet-stream;

    access_log  logs/access.log;  #main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

        server {
            server_name doomhub.local;
            listen 8080;
            root /Users/ellmo/rails/doomhub/public;
            passenger_enabled on;
            passenger_use_global_queue on;
            rails_env development;
        }
}

当我将应用程序的服务器端口更改为80时,我自然会在重启时收到:

nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)

...但是当我sudo时,错误将不会显示,该过程将以root作为其所有者开始。但是,在浏览器中打开http://doomhub.local不会返回任何内容(嗯,从技术上讲,它是“浏览器无法解析地址”错误,但我没有其他错误,没有nginx错误)。我没有记录,也没有任何记录。

当我将侦听端口更改回8080(或其他任何东西)时,当我以常规用户身份运行时,它就像魅力一样......但是我真的想在浏览器中使用http://doomhub.local而不是http://doomhub.local:8080

是否有任何阻止OSX应用程序侦听端口80的东西,我错过了?如您所见,我 CAN 使用它,因此没有其他过程。它只是不听任何事。

有没有办法将浏览器中的8080视为“普通” http 端口?

编辑:

将乘客用户指定为Jan Schejbal建议并没有解决我的问题,过了一段时间我最终为乘客创建了 rvm 包装器(而不是允许它使用明确的红宝石二进制文件),如这篇伟大的帖子所述:

http://everydayrails.com/2010/09/13/rvm-project-gemsets.html

感谢创建 passenger / bundler-only rvm包装,当我以 root 启动nginx时,我设法让应用程序运行。我可以指定仅限root用户和用户允许的侦听端口(即我测试了8080和81 ),即使所有 NOT 与包装二进制文件相关。然而...

......我仍然没有在80端口上得到任何东西。

2 个答案:

答案 0 :(得分:7)

正确诊断

哈! 我完全忘了我的系统上安装了 pow 。在我开始玩 nginx 之前,我知道我已经完全禁用了它,但这还不够。您可能知道 pow 是一个自动创建localhost域的零配置服务器工具 - 这也意味着它..."适当的"端口80,键入时可以看到:

sudo ipfw list

这应该返回类似:

00100 fwd 127.0.0.1,20559 tcp from any to me dst-port 80 in
65535 allow ip from any to any

...这清楚地表明端口80上的任何IP连接都转发到20559( pow&#39> s 端口)< / p>

溶液

我们现在要做的是删除此端口-80转发信息并使用其中的其他端口。这样我们就可以轻松地为多个rails应用程序(每个都有自己的gemset和配置)托管开发服务器,并通过乘客上游代理它们。

There's a great write-up on how to achieve the first part of this task。对我来说,似乎只需手动更改 ipfw 条目就足够了,但我选择了博客条目。如果您这样做 - 请确保使用pow's manual中正确的 pow 安装/卸载脚本;例如,在安装脚本成功编译之前,我必须完全 un -install pow

答案 1 :(得分:0)

我认为以root身份运行会导致权限问题,导致应用无法正常工作。您是否与PassengerUserSwitchingPassengerUser一起尝试了PassengerGroup选项?

编辑:错过了“无法解析地址”错误。仍尝试上述(乘客有时很奇怪),但也尝试运行netstat以查看端口是否正确绑定。