Nginx + Einhorn

Nginx + Einhorn

Ich arbeite an einer Migration von Nginx + Passenger zu Nginx + Unicorn und bin an einem Punkt angelangt, an dem ich nicht weiterkomme.

Wenn ich versuche, meinen Testserver anzuzeigen, erhalte ich nur eine 404-Seite. Ich bin sicher, dass in meiner Vhost-Konfiguration etwas nicht stimmt, aber ich sehe einfach nicht, wo das Problem liegt.

Wir sind für jede Hilfe sehr dankbar.

Dies ist die aktuelle Version meiner vhost-Datei

upstream unicorn-staging {
  server unix:/data/appname/staging/current/tmp/sockets/unicorn-staging.sock fail_timeout=0;
}

server {
  listen 80 deferred;
  listen 443;
  ssl on;
  root /data/appname/staging/current/public;
  server_name foo;
  access_log /data/appname/staging/current/log/unicorn-staging-access.log;
  error_log /data/appname/staging/current/log/unicorn-staging-error.log;
  client_max_body_size 4G;
  ssl_certificate /data/appname/staging/shared/certs/appname.crt;
  ssl_certificate_key /data/appname/staging/shared/certs/appname.key;

  location / {
    proxy_pass http://unicorn-staging;
    proxy_redirect     off;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https; # for SSL, add this

    client_max_body_size       10m;
    client_body_buffer_size    128k;

    proxy_connect_timeout      90;
    proxy_send_timeout         90;
    proxy_read_timeout         90;

    proxy_buffer_size          4k;
    proxy_buffers              4 32k;
    proxy_busy_buffers_size    64k;
    proxy_temp_file_write_size 64k;

    index  index.html index.htm;
  }

  location ~ \.(jpg|png|mp3|ogg)$ {
    valid_referers server_names;
    if ($invalid_referer) {
      return 403;
    }
  }

  location ~ \.(jpg|png|mp3|ogg|js|css|html|gif)$ {
    gzip_static on;
    expires max;
    add_header  Cache-Control public;
  }

  location ~ ^/(images|javascripts|stylesheets|assets)/  {
    root /data/appname/staging/current/public; # for asset pipeline and other static files
    expires max;
    break;
  }
  # redirect server error pages to the stat
  error_page  500 502 503 504  /50x.html;
}

Antwort1

Ihre Unicorn-Konfiguration ist höchstwahrscheinlich nicht richtig eingerichtet.

Dies passiert auf meinem Server, wenn nginx läuft, Unicorn aber nicht. Der Grund dafür ist, dass nginx versucht, die Anfrage an den Socket weiterzuleiten, Unicorn aber nicht da ist, um sie zu empfangen.

Standardmäßig lauscht Unicorn nur auf Port 8080. Sie können Ihre Unicorn-Einstellungen ändern, um auf einem anderen Port oder Socket zu lauschen.

Wenn Sie eine Unicorn-Konfigurationsdatei () verwenden config/unicorn.rb, sollte diese Datei etwa Folgendes enthalten (beachten Sie, dass Sie den Socket-Pfad ändern müssen):

listen File.expand_path("tmp/sockets/unicorn.sock", RAILS_ROOT)

Zu Debugzwecken lasse ich es auch auf einem Port lauschen.

listen File.expand_path("tmp/sockets/unicorn.sock", RAILS_ROOT)
listen 3000, :tcp_nopush => true

Um Unicorn auf Ihrem Produktionswebserver zu starten, muss ein Befehl ähnlich dem folgenden ausgeführt werden:

bundle exec unicorn -E production -c config/unicorn.rb

Dies verwendet die Unicorn-Konfigurationsdatei. Siehehttp://unicorn.bogomips.org/Unicorn/Configurator.htmlfür eine Beispielkonfigurationsdatei.

Wenn Sie keine Unicorn-Konfigurationsdatei verwenden, ist ein Befehlszeilenschalter im folgenden Format erforderlich:

-l, --listen ADDRESS

Zum Beispiel:

bundle exec unicorn -l tmp/sockets/unicorn.sock

Beachten Sie, dass ich einen relativen Pfad verwende, da es sich bei dem pwdvon mir verwendeten um das Stammverzeichnis von Rails handelt.

verwandte Informationen