You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一服务器用Unicorn、Nginx部署两个Rails应用的域名指向问题

问题描述

我有一个部署在sebastiandetering.com的Ruby on Rails应用,通过Mina gem部署,HTTPS自2022年起正常运行。现在尝试在同一服务器为兄弟部署juliandetering.com的Rails应用(后续将配置HTTPS),但访问该域名时显示的仍是sebastiandetering.com的应用,尽管Nginx配置中已将upstream指向julsapp-live。

两个应用的Nginx配置文件

/etc/nginx/sites-enabled/julsapp-live

upstream julsapp-live {
    server unix:/home/julsapp-live/app/shared/unicorn.sock fail_timeout=0;
}

server {
    server_name juliandetering.com;

    root /home/julsapp-live/app/current/public;
      
    location /assets/  {
        gzip_static on; # serve pre-gzipped version
        expires 1M;
        add_header Cache-Control public;
    }

    
    location / {
        try_files $uri @app;
    }

    location @app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://julsapp-live;
    }

    listen 80;
}

server {
    listen 80;
    server_name www.juliandetering.com;
    return 301 http://juliandetering.com$request_uri;
}

/etc/nginx/sites-enabled/rails-demo

upstream rails-demo {
    server unix:/home/rails-demo/app/shared/unicorn.sock fail_timeout=0;
}

server {
    server_name www.sebastiandetering.com;

    root /home/rails-demo/app/current/public;
      
    location /assets/  {
        gzip_static on; # serve pre-gzipped version
        expires 1M;
        add_header Cache-Control public;
    }

    location / {
        try_files $uri @app;
    }

    location @app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://rails-demo;
    }

    listen 443 ssl; # managed by Certbot 
    listen [::]:443 ssl; # added by SebD 10/13/2022 to try to match peertube server conf
    ssl_certificate /etc/letsencrypt/live/sebastiandetering.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/sebastiandetering.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
    listen 80;
    server_name www.sebastiandetering.com;
    return 301 http://sebastiandetering.com$request_uri;
}

服务状态

两个应用的systemctl状态均显示正常运行:

root@vultr:~# systemctl status rails-demo
● rails-demo.service - rails-demo service
     Loaded: loaded (/etc/systemd/system/rails-demo.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2024-01-18 21:28:36 UTC; 3h 35min ago

root@vultr:~# systemctl status julsapp-live
● julsapp-live.service - julsapp-live service
     Loaded: loaded (/etc/systemd/system/julsapp-live.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2024-01-18 22:46:31 UTC; 2h 17min ago

测试情况

我曾测试修改rails-demo的Nginx配置,将root和proxy_pass指向julsapp-live的upstream,此时julsapp-live应用可正常显示,但访问sebastiandetering.com也会显示该应用。

需求

请问如何配置Nginx,使访问juliandetering.com时显示julsapp-live应用,访问sebastiandetering.com时显示rails-demo应用?


解决方案

问题核心是Nginx的域名匹配不完整,以及默认服务器规则导致的请求分流错误,修复步骤如下:

  1. 补全sebastiandetering.com的域名匹配规则
    当前rails-demo的80端口server块仅匹配www.sebastiandetering.com,缺少裸域名sebastiandetering.com的处理;HTTPS server块同样只匹配子域名,导致裸域名的HTTPS请求会匹配到Nginx默认服务器(大概率是rails-demo的配置)。

    修改rails-demo的80端口重定向块:

    server {
        listen 80;
        server_name sebastiandetering.com www.sebastiandetering.com;
        return 301 https://www.sebastiandetering.com$request_uri;
    }
    

    同时更新HTTPS server块的域名匹配:

    server {
        server_name sebastiandetering.com www.sebastiandetering.com;
        # 原有SSL配置保持不变
    }
    
  2. 确保julsapp-live的域名匹配无冲突
    确认julsapp-live的server块中server_name仅包含juliandetering.com和www.juliandetering.com,避免和其他域名重叠。

  3. 验证配置并重启Nginx
    先执行配置校验:

    nginx -t
    

    校验通过后重启服务:

    systemctl restart nginx
    
  4. 检查DNS解析
    确认两个域名都正确解析到当前服务器IP,同时清除本地DNS缓存,避免旧解析记录干扰测试。


内容的提问来源于stack exchange,提问作者KleinerWarden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 19:40:15