如何从充当 Node.js 服务器反向代理的 Nginx 服务器中提供静态文件?

25

我的当前nginx配置如下:

upstream nodejs {
    server 127.0.0.1:3000;
}

server {
    listen 8080;
    server_name localhost;
    root ~/workspace/test/app;
    index index.html;

    location / {
        proxy_pass http://nodejs;
        proxy_set_header Host $host ; 
        proxy_set_header X-Real-IP $remote_addr; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

我对nginx非常非常新手,但至少我知道nginx比node/express更擅长提供静态文件服务。我该如何配置服务器以便nginx提供静态文件?


如果你要这么傲慢,请至少提供链接,然后我会删除我的问题。我已经找过了,但很难找到它。 - m0meni
2个回答

28

我使用了这个新配置来解决它:

upstream nodejs {
    server localhost:3000;
}

server {
    listen 8080;
    server_name localhost;
    root ~/workspace/test/app;

    location / {
        try_files $uri @nodejs;
    }

    location @nodejs {
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_pass http://nodejs;
        proxy_set_header Host $host ; 
        proxy_set_header X-Real-IP $remote_addr; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

感谢以下 Stack Overflow 帖子:


如何使用 NGINX 直接提供所有现有的静态文件,但将其余部分代理到后端服务器。


try_files $uri /$uri @nodejs; 应该改为 try_files $uri $uri/ @nodejs; - Alexey Ten
这个配置意味着首先nginx尝试提供静态文件,如果找不到,则重定向到nodejs服务器? - Santosh
@HS 是的,那正是它的意思。 - m0meni
@garkin同意,但我想知道如何在没有显式/public/文件夹的情况下完成它。我明白一个文件可以从几乎任何导致文件的路径中提供服务,这可能是可利用的。 - m0meni
这个配置有点问题。在后端之前,你不应该将每个请求代理到文件系统。静态文件应该从一个确定的单独的URL中提供服务。具有共享内容的本地文件夹应该明确命名,比如PUBLIC。(对于忍者编辑,我很抱歉) - garkin
1
这个问题是在根URL上出现了403错误。解决方法:将try_files $uri @nodejs;更改为只尝试提供文件而不是目录的方式。 - François Romain

23

你很可能需要在 server 中再添加一个 location 块来处理静态文件。

location /static {
  alias /path/to/static/files;
}

这里使用了alias指令。然后你可以访问localhost:8080/static/some_file.css来获取文件。

附注:你不需要当前设置的rootindex。(rootalias类似,但在使用上略有不同之处


我想要的是,即使在URI中没有static,也能够提供来自/static目录下的内容... - dcsan
@dscan 然后你可以将位置块设置为 location / { 并将别名(alias)指向您的静态文件。 - Sanketh Katta
但是 location / 肯定会干扰 try {} 块并路由到应用服务器本身吧?请求路径按顺序从上到下测试吗?因为应用服务器将接受任何内容,并在应用内没有路由时返回 404。 - dcsan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接