nginx阻止同一端口的美洲狮

Ror*_*ach 1 ruby-on-rails nginx puma

我有一个在puma和nginx上运行的rails应用程序.我用sudo service nginx restartpuma/rails 启动nginxrvmsudo rails server -p 80

这是我的错误:

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

仅当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>'
Run Code Online (Sandbox Code Playgroud)

任何关于如何让nginx允许美洲狮与它交谈的帮助将非常感激.

编辑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;
}
Run Code Online (Sandbox Code Playgroud)

cod*_*nny 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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在你需要做两件事:

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

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

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