【问题标题】:nginx (+ passenger) doesn't seem to run on port 80 [closed]nginx(+乘客)似乎没有在端口 80 上运行 [关闭]
【发布时间】:2013-01-01 13:23:56
【问题描述】:

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

我知道,homebrew 安装是按用户安装的,因此它不应该能够在仅限 root 的端口上运行(即端口 1024 及以下 ),但 homebrew 本身以及网络上的各种来源)建议只需通过 sudo nginx 运行服务器就足以允许它使用端口 80。

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

/etc/hosts:

##
# 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 而不是 @987654332 @。

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

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

编辑:

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

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

感谢创建仅限乘客/捆绑程序的 rvm 包装器,当我以 root 身份启动 nginx 时,我设法让应用程序运行。我可以同时指定 root-only 和用户允许的监听端口(即。我测试了 8080 和 81)并且即使使用所有 NOT的 gem,应用程序也可以正常服务> 与包装二进制文件有关。然而……

...我仍然在 80 端口上一无所获。

【问题讨论】:

  • 如果您使用其他特权端口会发生什么,例如81?
  • 在 81 下运行它,这是我学到的一些新东西。首先,当我指定doomhub.local:81 地址并显示passenger's“gem-missing”错误时,它会在浏览器中打开。当我再次将端口更改为8080,然后尝试以root 身份运行nginx(即使它现在可以作为用户工作),我也遇到了同样的错误。这使我得出结论,问题在于 root 用户无法访问应用程序中的任何 gem(即使给出了 rvm ruby​​ 的路径)。我可能必须想办法向 root 表明他需要使用 rvm gems。

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


【解决方案1】:

正确诊断

哈! 我完全忘记了我的系统上安装了 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的 端口

解决方案

我们现在要做的是删除此端口 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 安装脚本才能成功编译。

【讨论】:

  • 中了同样的陷阱!谢谢。
  • 除了 Pow 之外,来自 hood.ie 的 local-tld(没有机架部分的 Pow)也有类似的技巧。我没有有用的 ipfw 规则,所以可以简单地做一个刷新来删除 local-tld 规则。
【解决方案2】:

我假设以 root 身份运行会导致权限问题,从而导致应用程序无法运行。您是否尝试过将PassengerUserSwitching 选项与PassengerUserPassengerGroup 一起使用?

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

【讨论】:

  • 我需要阅读有关此用户切换的信息,我希望它可以解决我的 root 访问用户的 rvm rubies 和 gems 的问题。
猜你喜欢
  • 2018-12-25
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
相关资源
最近更新 更多