Nginx 不呈现美洲豹应用程序

Nginx not rendering puma application

我正在尝试使用 Puma 和 Nginx 为我的 rails 应用程序提供服务。当我到达页面时,它会呈现默认的 nginx 页面。我试过两种不同的配置。这第一次失败 "upstream" directive is not allowed here. 第二次警告 Starting nginx: nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored

(1) 覆盖 nginx.conf

nginx.conf

upstream puma {
  server unix:///home/deploy/apps/exelon-api/shared/tmp/sockets/rails-api-puma.sock;
}
server {
  listen 80 default_server deferred;
  # server_name example.com;
  root /home/deploy/apps/rails-api/current/public;
  access_log /home/deploy/apps/rails-api/current/log/nginx.access.log;
  error_log /home/deploy/apps/rails-api/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) 使用启用的站点

nginx.conf

user nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
events {
  worker_connections  1024;
}
http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;
  access_log    /var/log/nginx/access.log;
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_requests 100;
  keepalive_timeout  65;
  gzip  on;
  gzip_http_version 1.0;
  gzip_comp_level 2;
  gzip_proxied any;
  gzip_vary off;
  gzip_types text/plain text/css application/x-javascript text/xml application/xml application/rss+xml application/atom+xml text/javascript application/javascript application/json text/mathml;
  gzip_min_length  1000;
  gzip_disable     "MSIE [1-6]\.";
  variables_hash_max_size 1024;
  variables_hash_bucket_size 64;
  server_names_hash_bucket_size 64;
  types_hash_max_size 2048;
  types_hash_bucket_size 64;
  include /etc/nginx/conf.d/*.conf;
  include /etc/nginx/sites-enabled/*;
}

sites-enable/rails-api_production

upstream puma_rails-api_production { 
  server unix:/home/deploy/apps/rails-api/shared/tmp/sockets/rails-api-puma.sock fail_timeout=0;
}
server {
  listen 80;
  client_max_body_size 4G;
  keepalive_timeout 10;
  error_page 500 502 504 /500.html;
  error_page 503 @503;
  server_name localhost rails-api.local;
  root /home/deploy/apps/rails-api/current/public;
  try_files $uri/index.html $uri @puma_rails-api_production;
  location @puma_rails-api_production {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://puma_rails-api_production;
    # limit_req zone=one;
    access_log /home/deploy/apps/rails-api/shared/log/nginx.access.log;
    error_log /home/deploy/apps/rails-api/shared/log/nginx.error.log;
  }
  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }
  location = /50x.html {
    root html;
  }
  location = /404.html {
    root html;
  }
  location @503 {
    error_page 405 = /system/maintenance.html;
    if (-f $document_root/system/maintenance.html) {
      rewrite ^(.*)$ /system/maintenance.html break;
    }
    rewrite ^(.*)$ /503.html break;
  }
  if ($request_method !~ ^(GET|HEAD|PUT|PATCH|POST|DELETE|OPTIONS)$ ){
    return 405;
  }
  if (-f $document_root/system/maintenance.html) {
    return 503;
  }
  location ~ \.(php|html)$ {
    return 405;
  }
}

第二个错误实际上是说您有两个用 listen 80 定义的 server 部分(这实际上意味着 0.0.0.0:80 其中 0.0.0.0 等于 "any address")和 localhostserver_name.

因此,您必须采取的行动取决于您想要实现的目标:

默认有一些其他应用程序

如果您希望您的应用程序与您在服务器上拥有的(或将来想要拥有的)其他一些应用程序一起可以通过某个主机名访问,假设example.com,您只需从您添加的条目中的 server_name 中删除 localhost

在这种情况下,您必须通过您在 server_name ( example.com) 中为其指定的名称之一访问您的应用程序,既不是 localhost 也不是服务器 IP。

注意如果您仍然需要确保您指定的域解析为服务器地址。

如果它在您自己的本地计算机上并且您希望能够访问您的应用程序以进行开发(例如测试它如何与 nginx 一起工作),您可以 添加行 127.0.0.1 name.here(例如,127.0.0.1 example.com)。

如果它 在您拥有的某些服务器上 并且您希望其他人能够通过同一域访问应用程序,您必须 buy/register 它(如果它尚未被其他人注册,它发生了)并创建指向您的应用程序服务器 IP 的 A DNS 记录。

将您的应用设置为默认应用

如果您希望此应用在服务器上成为默认应用,您可以:

  1. 查找其他 server 定义为 listen 80 default; 的部分(因此,如果它们没有 default 或侦听任何其他端口,如 8080 或 443,您可以安全地离开它们)并从那里删除 default - 每个端口和 IP 组合只能有一个默认服务器部分。

  2. 将服务器部分的 listen 80; 更改为 listen 80 default;。这将告诉 nginx 您希望此服务器部分处理所有未被其他部分捕获的请求。

这将允许您通过 IP 访问应用程序并将任何域指向它,而无需在 server_name 部分中指定它。您仍然需要注册或购买域名才能将其指向应用程序。