如何在默认端口上启动thin?

21

我正在学习thin服务器,现在我可以使用thin start来启动服务器,但端口是3000,我应该在浏览器中输入localhost:3000以获取网页。

我希望像其他网站一样去除3000端口。因此,我使用命令thin -p 80 start来使用默认的http端口。但我遇到了这个错误:

root@makserver:~/apps/videosite# thin --port 80 start
>> Using rack adapter
>> Thin web server (v1.2.7 codename No Hup)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:80, CTRL+C to stop
/usr/local/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:572:in `start_tcp_server': no acceptor (RuntimeError)
    from /usr/local/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:572:in `start_server'
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/thin/backends/tcp_server.rb:16:in `connect'
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/thin/backends/base.rb:49:in `block in start'
    from /usr/local/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `call'
    from /usr/local/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run_machine'
    from /usr/local/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run'
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/thin/backends/base.rb:57:in `start'
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/thin/server.rb:156:in `start'
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/thin/controllers/controller.rb:80:in `start'
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/thin/runner.rb:177:in `run_command'
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/thin/runner.rb:143:in `run!'
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/bin/thin:6:in `<top (required)>'
    from /usr/local/bin/thin:19:in `load'
    from /usr/local/bin/thin:19:in `<main>'

端口80上还有其他程序在运行吗? - Brandon Frohbieter
9个回答

25

这表示端口可能已经在使用中。

另外,尝试使用管理员权限运行它。

sudo thin start -p 80

感谢Tom Crinson的博客文章


1
Mokiato的回答应该会对你有所帮助。 - Simon Perepelitsa
这表示端口可能已经在使用中。- Bingo。谢谢!(似乎在构建Thin时,“端口正在使用”错误消息也在使用中。) - Ben Hull

24

看起来是某个旧的 Ruby 进程挂了。

打开活动监视器并杀死所有 Ruby 进程。

或者使用终端:

ps -e | grep "ruby"

那么:

kill {process id}

正是我所需要的,而且喜欢命令行的答案。加加。 - kyleturner

20
rvmsudo rails server thin -p 80

1
这让我遇到了与 sudo thin start -p 80 相同的“/usr/bin/env: ruby: No such file or directory”错误。运行rvmsudo有何不同? - Day Davis Waterbury

12

如果您不想使用sudo来启动Web服务器(可能用户不是sudoer),您可以始终以超级用户身份登录,并设置端口80流量重定向到端口x:

sudo iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3000
sudo iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 3000

查看iptables

sudo iptables --list -n -t nat
sudo iptables --list -n

这样,你就可以将Web服务器作为其他权限较低的用户运行。

感谢此帖子


2
在这里提供的所有解决方案中(感谢大家),这是对我有效的一个。感谢Louis! - Day Davis Waterbury
1
这也是各种端口限制的通用解决方案。 - prusswan

5

传统上,端口80是特权端口(实际上所有小于1024的端口都是),因此您需要具有超级用户特权才能绑定到该端口。

查看文档后,他们建议nginx后面运行它,这通常是一个好主意。假设您使用软件包管理器安装了nginx,您可能收到了如何使nginx在启动时启动的说明,并且它将默认绑定到端口80。


我刚刚安装了nginx,但是当我启动它时,出现了一些错误[emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use)。顺便说一下,我的服务器正在VPS上运行。 - mko
1
@yozloy 正如 @Semyon Pereplitsa 所说,这意味着该端口上已经绑定了某些内容(通常是 Apache)。如果想要找出在您的服务器上正在使用该端口的程序,请尝试运行 lsof -i :80 (假设您已安装了 lsof;如果没有,请先安装)。假设它是 Apache,并且您想使用 nginx 替代它,则应该卸载 Apache,或更改启动设置,使其不默认启动(如何执行此操作取决于您的操作系统)。 - Hank Gay

1

我无法使用sudo在端口80上运行Thin,因为我使用RVM安装了Ruby,而根用户没有访问权限。此外,在运行Thin之前,我必须设置一个环境变量来设置我的mongodb访问URL。以下一行代码解决了我的问题:

rvmsudo MONGODB_URI=MY_MONGO_URI thin start -p 80 -d

1

请查看这个帖子:Ruby on Rails服务器选项

不建议直接通过80端口将'thin'暴露在互联网上。您应该使用Apache作为Web服务器,并将http请求重定向到thin应用程序服务器。您可以将以下内容添加到httpd.conf文件中以将流量重定向到Rails:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
<VirtualHost *:80>
    ServerName YOUR SERVER NAME
    DocumentRoot YOUR ROOT
    ProxyPass / http://YOURSITE.com:3000/
    ProxyPassReverse / http://YOURSITE.com:3000/
    ProxyPreserveHost On
</VirtualHost>

-1

你可以尝试使用8080端口。我们在GWT应用程序中这样做,这比3000更方便。


-1
也许尝试一下 "sudo bundle exec thin start -p 80"?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接