使用Nginx从一台服务器服务两个站点


67

我已经在服务器上启动并运行了Rails应用程序,现在我想添加另一个。

我希望Nginx检查请求的内容并根据域名拆分流量

两个站点都有自己的nginx.conf符号链接到启用了站点的符号中,但是启动nginx时出现错误 Starting nginx: nginx: [emerg] duplicate listen options for 0.0.0.0:80 in /etc/nginx/sites-enabled/bubbles:6

他们俩都在听80,但事情不同。

网站#1

upstream blog_unicorn {
  server unix:/tmp/unicorn.blog.sock fail_timeout=0;
}

server {
  listen 80 default deferred;
  server_name walrus.com www.walrus.com;
  root /home/deployer/apps/blog/current/public;

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

  try_files $uri/index.html $uri @blog_unicorn;
  location @blog_unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://blog_unicorn;
  }

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

站点二:

upstream bubbles_unicorn {
  server unix:/tmp/unicorn.bubbles.sock fail_timeout=0;
}

server {
  listen 80 default deferred;
  server_name bubbles.com www.bubbles.com;
  root /home/deployer/apps/bubbles/current/public;

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

  try_files $uri/index.html $uri @bubbles_unicorn;
  location @bubbles_unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://bubbles_unicorn;
  }

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

1
仅供参考,语法“默认”在0.8.21 nginx.org/en/docs/http/request_processing.html中
13年

@spuder谢谢,这突然解决了我的"default_server" parameter can be specified for the default "listen" directive only错误
user3132194

Answers:


110

该文件说:

default_server参数(如果存在)将使服务器成为指定的address:port对的默认服务器。

同样显而易见的是,只能有一个默认服务器。

它也说:

listen指令可以具有几个特定于套接字相关系统调用的附加参数。可以在任何listen指令中指定它们,但对于给定的address:port对只能指定一次。

因此,您应该从其中一个指令中删除default和。同样适用于指令。deferredlisten 80ipv6only=on


好的,我做到了,并且克服了nginx启动时的错误检查。站点2正常工作,站点1从nginx返回400。有什么建议?
克里斯

与此相同:stackoverflow.com/questions/7334193/… 访问日志中没有错误,但“-” 400 0“-”“-”没有错误
Chris

如果您在nginx错误日志中没有错误,那么该错误是从unicorn返回的。检查。为了确认这一假设,您可以尝试从您的/assets/位置请求一些静态文件。
VBart 2012年

在那里看不到任何错误。如果我直接命中IP,我将正确获得站点2,但是域将返回400。这是DNS配置问题吗?我在两个站点上都通过namecheap对www和@使用A(地址)。一个人行之有效,而另一个人行不通
Chris

我直接要求了一项资产,并且也索要了400项资产
克里斯

15

刚遇到同样的问题,但是重复的default_server指令不是此消息的唯一原因。

您只能backlogserver_name指令之一上使用参数。

网站1:

server {
    listen 80 default_server backlog=2048;
    server_name www.example.com;
    location / {
        proxy_pass http://www_server;
    }

网站2:

server {
    listen 80;    ## NOT NOT DUPLICATE THESE SETTINGS 'default_server backlog=2048;'
    server_name blogs.example.com;
    location / {
        proxy_pass http://blog_server;
    }

0

我有同样的问题。我通过修改/etc/nginx/sites-available/example2.com文件修复了该问题。我将服务器块更改为

server {
        listen 443 ssl; # modified: was listen 80;
        listen [::]:443; #modified: was listen [::]:80;
        . . .
}

在/etc/nginx/sites-available/example1.com中,我注释掉了listen 80listen [::]:80因为服务器块已经配置为443。


3
这不能解决问题。现在,一台服务器正在侦听端口80,而另一台服务器正在侦听端口443。问题是关于在同一端口但域不同的情况下运行两台服务器。
petermeissner'5
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.