How to serve Flask static files using Nginx?

2020-05-31 13:17发布

问题:

I've a web application with this structure:

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

I've managed to run the web application using nginx and wsgi, but the problem is that the static files are not served, i mean, the server can't find them when i go to their URL. It gives me 404.

Here's my nginx configuration file part:

 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;
}

Is there something missing?

回答1:

Add this to your nginx configuration

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

replace /project_path/ with your app's absolute path, you should note that it doesn't include static directory and all the contents inside /project_path/static/ will be serverd in url /static/.



回答2:

From How to Configure NGINX for a Flask Web Application

I found this solution to be better:

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

Replace <path to project> with your project's directory, of course.

Note in this solution that static is included in the path! This is really good for security! The risk of accidentally serving application source files is reduced. By default flask puts the source files in the <path to project> and a small mistake in configurations could make these source files visible to attackers.