1

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

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

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

/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,我错过了吗?如您所见,我可以使用它,因此没有其他过程。它只是不听任何东西。

有没有办法8080在浏览器中将其视为“正常” http端口?

编辑:

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

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

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

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

4

2 回答 2

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 的 端口

解决方案

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

关于如何完成此任务的第一部分有一篇很棒的文章。对我来说,似乎只需手动更改ipfw条目就足够了,但我选择了博客条目。如果您这样做 - 请确保您使用pow 手册中正确的pow安装/卸载脚本;例如,在安装脚本成功编译之前,我必须完全卸载pow 。

于 2013-01-01T20:26:59.793 回答
0

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

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

于 2013-01-01T13:29:17.380 回答