同一服务器用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的域名匹配不完整,以及默认服务器规则导致的请求分流错误,修复步骤如下:
补全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配置保持不变 }确保julsapp-live的域名匹配无冲突
确认julsapp-live的server块中server_name仅包含juliandetering.com和www.juliandetering.com,避免和其他域名重叠。验证配置并重启Nginx
先执行配置校验:nginx -t校验通过后重启服务:
systemctl restart nginx检查DNS解析
确认两个域名都正确解析到当前服务器IP,同时清除本地DNS缓存,避免旧解析记录干扰测试。
内容的提问来源于stack exchange,提问作者KleinerWarden

