NixOS上Nginx反向代理加载CSS/JS返回404问题求助
问题分析
你遇到的404本质是静态资源的路径解析错误:Golang服务里的静态资源用了绝对路径(比如/static/style.css),当通过https://server/myapp访问时,浏览器会把资源请求发往https://server/static/style.css(域名根路径),而不是https://server/myapp/static/style.css,但你的Nginx只配置了/myapp/的转发,没覆盖这些静态资源路径,导致404。
解决方案
因为要支持多容器,不能把所有/static请求指向同一个服务,所以有两种针对性的解决方式:
方案1:调整Golang服务的资源路径(推荐)
让服务生成的资源路径和访问前缀绑定,避免绝对路径的问题:
- 如果用模板渲染页面,把资源引用改成相对路径,比如将
<link href="/static/style.css">改为<link href="./static/style.css">; - 或者在Golang中配置路由前缀,比如把服务的根路由设为
/myapp/,静态文件路由对应/myapp/static/和/myapp/js/,这样Nginx转发/myapp/到容器的/myapp/时,资源路径会自动匹配。
方案2:修改Nginx配置适配路径(无需改代码)
针对/myapp前缀下的所有子路径做转发,确保每个请求都能对应到Golang容器的正确路径。
Nginx配置示例(原生配置)
server { listen 443 ssl; server_name server.name; # SSL证书配置(NixOS下可通过ACME自动管理) # 匹配所有/myapp开头的请求,转发到容器对应路径 location ~^/myapp/(.*) { proxy_pass http://localhost:8181/$1; # 传递必要的请求头,确保服务能正确处理 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # 其他应用的转发配置,比如/myapp2 location ~^/myapp2/(.*) { proxy_pass http://localhost:8282/$1; # 同上请求头配置 } }
NixOS下的configuration.nix配置写法
services.nginx = { enable = true; virtualHosts."server.name" = { enableACME = true; # 自动申请SSL证书 forceSSL = true; locations = { # 正则匹配/myapp下的所有请求,转发到Golang容器 "~^/myapp/(.*)" = { proxyPass = "http://localhost:8181/$1"; extraConfig = '' proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; ''; }; # 新增其他应用的转发规则 "~^/myapp2/(.*)" = { proxyPass = "http://localhost:8282/$1"; extraConfig = '' proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; ''; }; }; }; };
方案对比
- 方案1:代码层面解决,路径逻辑更清晰,适合长期维护,但需要改动Golang服务代码;
- 方案2:纯配置调整,无需修改服务,快速适配多容器场景,适合现有服务不想改动的情况。
内容的提问来源于stack exchange,提问作者hmaier
相关产品推荐
相关产品推荐

