nginx阻止同一端口的美洲狮

时间:2016-02-04 14:17:19

标签: ruby-on-rails nginx puma

我有一个在puma和nginx上运行的rails应用程序。我使用sudo service nginx restart启动nginx,然后使用rvmsudo rails server -p 80

启动puma / rails

这是我的错误:

`initialize': Address already in use - bind(2) for "localhost" port 80 (Errno::EADDRINUSE)

仅当nginx已在运行时才会出现此错误。

完整错误是:

 $rvmsudo rails server -p 80

=> Booting Puma
=> Rails 4.2.4 application starting in development on http://localhost:80
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
Puma 2.14.0 starting...
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://localhost:80
Exiting
/home/my-user-name/apps/my-web-app/shared/bundle/ruby/2.1.0/gems/puma-2.14.0/lib/puma/binder.rb:233:in `initialize': Address already in use - bind(2) for "localhost" port 80 (Errno::EADDRINUSE)
    from /home/my-user-name/apps/my-web-app/shared/bundle/ruby/2.1.0/gems/puma-2.14.0/lib/puma/binder.rb:233:in `new'
    from /home/my-user-name/apps/my-web-app/shared/bundle/ruby/2.1.0/gems/puma-2.14.0/lib/puma/binder.rb:233:in `add_tcp_listener'
    from (eval):2:in `add_tcp_listener'
    from /home/my-user-name/apps/my-web-app/shared/bundle/ruby/2.1.0/gems/puma-2.14.0/lib/rack/handler/puma.rb:33:in `run'
    from /home/my-user-name/apps/my-web-app/shared/bundle/ruby/2.1.0/gems/rack-1.6.4/lib/rack/server.rb:286:in `start'
    from /home/my-user-name/apps/my-web-app/shared/bundle/ruby/2.1.0/gems/railties-4.2.4/lib/rails/commands/server.rb:80:in `start'
    from /home/my-user-name/apps/my-web-app/shared/bundle/ruby/2.1.0/gems/railties-4.2.4/lib/rails/commands/commands_tasks.rb:80:in `block in server'
    from /home/my-user-name/apps/my-web-app/shared/bundle/ruby/2.1.0/gems/railties-4.2.4/lib/rails/commands/commands_tasks.rb:75:in `tap'
    from /home/my-user-name/apps/my-web-app/shared/bundle/ruby/2.1.0/gems/railties-4.2.4/lib/rails/commands/commands_tasks.rb:75:in `server'
    from /home/my-user-name/apps/my-web-app/shared/bundle/ruby/2.1.0/gems/railties-4.2.4/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
    from /home/my-user-name/apps/my-web-app/shared/bundle/ruby/2.1.0/gems/railties-4.2.4/lib/rails/commands.rb:17:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'

如何让nginx让puma与之交谈的任何帮助都将非常感激。

编辑1 nginx.conf

upstream puma {
  server unix:///home/my-user-name/apps/my-web-app/shared/tmp/sockets/my-web-app-puma.sock;
}

server {
  listen 80 default_server deferred;

  listen 443 ssl;

  # server_name example.com;
  ssl_certificate /etc/ssl/mysite/mysite.com.chained.crt;
  ssl_certificate_key /etc/ssl/mysite/mysite.key;

  root /home/my-user-name/apps/my-web-app/current/public;
  access_log /home/my-user-name/apps/my-web-app/current/log/nginx.access.log;
  error_log /home/my-user-name/apps/my-web-app/current/log/nginx.error.log info;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @puma;
  location @puma {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    proxy_pass http://puma;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 10M;
  keepalive_timeout 10;
}

2 个答案:

答案 0 :(得分:5)

实际上,让我在不请求您的nginx配置的情况下回答这个问题。您的设置如下:

  • nginx在端口80上侦听传入的HTTP请求
  • 根据配置,它会将这些请求转发给正确的应用程序实例。
  • 这称为反向代理设置。

因此,让我们看看一个通用的nginx配置,该配置将告诉我们如何监听端口80并将所有请求转发给在端口3000上运行的应用程序:

# our http block to handle HTTP traffic with nginx
http {
  include mime.types;
  default_type  application/octet-stream;
  sendfile on;
  keepalive_timeout  65;

  # NGinx Server Configuration
  server {

    listen 80; #listen on port 80
    server_name my.domain.com;  # which domain we are listening for.

    # Add some basic auth
    # Remove this if not needed.
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;

    # Set up the location to map all requests to the Ruby App
    location / {
      proxy_pass http://127.0.0.1:3000;
      access_log off;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
    }
  }
}

现在你需要做两件事:

  • 重新启动你的nginx
  • 在端口3000上启动你的puma应用程序

希望这能解释2如何协同工作以及您需要在文件中进行哪些更改以帮助他们进行沟通。

基本上:如果nginx声称端口80,puma无法声明它并且需要在不同的端口上运行,让nginx将所有流量重新路由到该端口并返回。

答案 1 :(得分:1)

在puma.rb文件中,您应该删除有关端口的行。由于您已经在配置中使用了sock,因此没有理由在tcp端口上运行puma。

当你开始使用puma时:

puma -C config / puma.rb

你应该只看到“听取unix:”,而不是tcp:

enter image description here

简而言之,你应该在unix socket上运行puma而不是在tcp端口上运行puma。只需注释端口指令。

enter image description here

一旦你这样做,它应该工作。顺便说一句,你应该对selinux宽容,因为selinux 会禁用套接字,你最终会看到消息“403 Forbidden”