Nginx配置问题:如何将Meteor应用反向代理到example.com/meteor
解决Nginx反向代理Meteor到子路径example.com/meteor的问题
你的配置问题主要出在两个关键地方:server_name不能包含路径,以及没处理Meteor应用的路径前缀和WebSocket需求。我来给你一步步修正:
先说说你原来配置的错误点
server_name example.com/meteor www.example.com/meteor是无效的:Nginx的server_name字段只能指定纯域名,不能带路径后缀,这是你配置失败的核心原因之一。- 直接把
/代理到3000会和你现有的默认静态文件/PHP服务冲突,导致其他路径无法正常访问。 - 没有处理路径重写:你的Meteor应用运行在3000端口的根路径,当用户访问
example.com/meteor/xxx时,后端收到的请求是/meteor/xxx,但Meteor期望的是/xxx,所以需要重写路径。 - 缺少WebSocket支持:Meteor依赖WebSocket实现实时功能,原来的配置没有相关头信息,即使代理成功,实时功能也会失效。
正确的配置方案
你需要新建一个针对example.com的server块(和默认的_ server块分开),在里面保留原有静态文件/PHP的处理逻辑,同时添加/meteor路径的代理配置:
server { listen 80; listen [::]:80; server_name example.com www.example.com; # 保留你原来默认配置里的静态文件和PHP处理 root /var/www/html; index index.html index.htm index.nginx-debian.html index.php; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php5-fpm.sock; } # 重点:Meteor反向代理配置 location /meteor { # 重写路径,去掉/meteor前缀,传给后端Meteor的是正确的根路径请求 rewrite ^/meteor/(.*)$ /$1 break; # 设置代理头,让Meteor能正确识别客户端信息 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; # 代理到本地3000端口的Meteor应用 proxy_pass http://127.0.0.1:3000; # 支持WebSocket,Meteor实时功能必须的配置 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 延长超时时间,避免长连接被过早断开 proxy_connect_timeout 7d; proxy_send_timeout 7d; proxy_read_timeout 7d; } }
额外需要注意的事项
调整Meteor的ROOT_URL:重启Meteor应用前,设置环境变量让它知道自己运行在
/meteor路径下:export ROOT_URL=http://example.com/meteor # 然后重启你的Meteor应用这一步很重要,否则Meteor生成的内部链接会指向根路径,导致资源加载错误。
重启Nginx生效:修改配置后,执行命令重启Nginx:
sudo systemctl restart nginx确认默认server块的优先级:你的默认server块(
server_name _)已经设置了default_server,所以其他未匹配的域名会走那个配置,example.com会走我们新建的这个server块,不会冲突。
内容的提问来源于stack exchange,提问作者hideous
相关产品推荐
相关产品推荐

