我已经设置了一个nixOS来运行一个nginx作为docker容器的反向代理。在docker容器中运行一个golang服务器,它通过一个函数处理/并从static和js两个文件夹返回文件。它运行在8181端口上。代码如下:
我的应用程序的结构看起来像这样。
在
当我访问URL
当使用端口8181而不是URL(
我希望nginx能将加载CSS和JS的请求重定向到容器。
编辑: 确切的错误是:
另一个重要信息是,我希望在同一个反向代理上以这种方式运行多个容器。因此,将CSS或JS文件指向相同位置的方法不起作用。
func main() {
static := http.FileServer(http.Dir("static"))
js := http.FileServer(http.Dir("js"))
http.Handle("/static/", http.StripPrefix("/static/", static))
http.Handle("/js/", http.StripPrefix("/js/", js))
// Register function to "/"
http.HandleFunc("/", indexHandler)
fmt.Println("Server is starting...")
err := http.ListenAndServe("0.0.0.0:8181", nil)
if err != nil {
log.Fatal("cannot listen and server", err)
}
}
func indexHandler(w http.ResponseWriter, r *http.Request) {
wd, err := os.Getwd()
var static = filepath.Join(wd, "static")
var index = filepath.Join(static, "index.html")
if err != nil {
log.Fatal("cannot get working directory", err)
}
// Check if the request is an OPTIONS preflight request
if r.Method == "OPTIONS" {
// Respond with status OK to preflight requests
w.WriteHeader(http.StatusOK)
return
}
// POST-Request
if r.Method == http.MethodPost {
// do something
} else {
// Loading the index.html without any data
tmpl, err := template.ParseFiles(index)
err = tmpl.Execute(w, nil) // write response to w
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
log.Fatal("problem with parsing the index template ", err)
}
}
}
我的应用程序的结构看起来像这样。
├── web
│ ├── Dockerfile
│ ├── go.mod
│ ├── server.go
│ └── static
│ │ ├── index.html
│ │ ├── style.css
│ │ └── table.html
│ └── js
│ └── htmx.min.js
在
configuration.nix
中,nginx
部分的配置如下。 services.nginx = {
enable = true;
recommendedGzipSettings = true;
recommendedOptimisation = true;
recommendedProxySettings = true;
recommendedTlsSettings = true;
virtualHosts."myapp" = {
sslCertificate = "/etc/ssl/nginx/ssl.cert";
sslCertificateKey = "/etc/ssl/nginx/ssl.key";
sslTrustedCertificate = "/etc/ssl/nginx/ssl.chain";
forceSSL = true; # Redirect HTTP to HTTPS
locations = {
"/myapp" = { proxyPass = "http://localhost:8181/"; };
};
extraConfig = ''
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
'';
};
};
当我访问URL
https://server/myapp
时,index.html
会加载,但是style.css
和htmx.min.js
会返回404错误。当使用端口8181而不是URL(
http://server:8181
)来访问容器时,一切都正常加载。我希望nginx能将加载CSS和JS的请求重定向到容器。
编辑: 确切的错误是:
GET https://server.name/static/style.css net::ERR_ABORTED 404
,尽管我正在访问https://server.name/myapp
。另一个重要信息是,我希望在同一个反向代理上以这种方式运行多个容器。因此,将CSS或JS文件指向相同位置的方法不起作用。
/myapp
来提供所有内容对我来说是有效的。 - undefined<base>
元素吗?如果是的话,请将其移除然后再试一次。 - undefined<base>
元素。 - undefined