如何使用 Nginx 提供 Flask 静态文件?

Posted

技术标签:

【中文标题】如何使用 Nginx 提供 Flask 静态文件?【英文标题】:How to serve Flask static files using Nginx? 【发布时间】:2015-10-19 08:32:01 【问题描述】:

我有一个具有这种结构的网络应用程序:

|
|__ static
   |__style.less
   |__images
|__ myapp.py
|__ wsgi.py

我已经设法使用 nginx 和 wsgi 运行 Web 应用程序,但问题是没有提供静态文件,我的意思是,当我转到它们的 URL 时,服务器找不到它们。它给了我 404。

这是我的 nginx 配置文件部分:

 server 
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /var/www/public_html;
    index index.php index.html index.htm;

    server_name xxxxxxx.com;

    location / 
        try_files $uri $uri/ =404;
    

    location /myapp 
        include uwsgi_params;
        uwsgi_pass unix:/var/www/public_html/myapp/myapp.sock;

有什么遗漏吗?

【问题讨论】:

【参考方案1】:

来自How to Configure NGINX for a Flask Web Application

我发现这个解决方案更好:

location /static  
    alias /<path to project>/static;

当然,将&lt;path to project&gt; 替换为您的项目目录。

请注意,在此解决方案中,static 包含在路径中!这对安全性非常有好处!降低了意外提供应用程序源文件的风险。默认情况下,flask 将源文件放在&lt;path to project&gt; 中,配置中的一个小错误可能会使这些源文件对攻击者可见。

【讨论】:

Jason,这不太安全,容易受到别名遍历攻击。见github.com/yandex/gixy/blob/master/docs/en/plugins/…【参考方案2】:

将此添加到您的 nginx 配置中

location ^~ /static/  
    include  /etc/nginx/mime.types;
    root /project_path/;

/project_path/替换为您的应用的绝对路径,您应该注意它不包含静态目录,并且/project_path/static/中的所有内容都将在网址/static/.

【讨论】:

谢谢您,您的代码有效,但现在我看到模板在网站上不起作用(它只是向我展示了我一直创建的 404.html 模板,并且没有'不要使用templates 目录中的其他模板。 只要确定模板是否在静态文件夹中 nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/… @JohnMagistr 不建议在每个位置块中添加根,但您可以使用根在位置内覆盖服务器根,这没关系。 ^~ 有什么作用?

以上是关于如何使用 Nginx 提供 Flask 静态文件?的主要内容,如果未能解决你的问题,请参考以下文章

Flask:如何提供静态 html?

通过Nginx部署flask项目和静态站点

网站后端_Python+Flask.0009.FLASK静态资源之默认及自定义资源目录?

如何使用 nginx 在某个位置路径提供静态文件目录?

如何在 Docker 上使用 Nginx 和 Django 提供静态文件?

docker、nginx、django 以及如何提供静态文件