2016-02-04 5 views
0

У меня есть приложение для рельсов, работающее на puma и nginx. Я запускаю Nginx с sudo service nginx restart затем PUMA/рельсах с rvmsudo rails server -p 80nginx блокирующий пуму из того же порта

Это моя ошибка:

`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, чтобы пума, чтобы поговорить с ним было бы очень признателен.

EDIT 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; 
} 
+0

покажите свою конфигурацию nginx. Но если nginx обрабатывает входящий запрос на порт 80, то нет, вы не можете запустить приложение на порт 80. –

ответ

4

На самом деле, позвольте мне ответить на этот вопрос, не требуя конфигурации 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; 
    } 
    } 
} 

Теперь вам нужно сделать 2 вещи :

  • перезагрузить Nginx
  • запустить приложение пума на порт 3000

Надеюсь, это объяснит, как 2 работают вместе и что вам нужно изменить в своем файле, чтобы помочь им общаться.

в основном: Если nginx утверждает, что порт 80, puma не может требовать его и ему нужно запускать на другом порту, позволяя nginx перенаправить весь трафик на этот порт и обратно.

0

В файле puma.rb вы должны удалить строку о порте. Поскольку вы уже используете носок в конфигурации, нет никаких причин для запуска puma на порту tcp.

При запуске пуму с:

пумы -C конфиг/puma.rb

вы должны видеть только "Прослушивание на UNIX:", а не на TCP:

enter image description here

В двух словах, вы должны запустить puma на unix-разъем, а не на порт tcp. Просто прокомментируйте директиву порта.

После того, как вы сделаете это, он должен работать. И, кстати, вы должны быть разрешающими на selinux, потому что selinux отключит сокет, и вы получите сообщение «403 Forbidden»