简体   繁体   中英

How to serve Flask static files using Nginx?

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?

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/ .

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.

I've got the same issue, but unfortunately these answers don't help.

My tree:

├── app.py
├── service
│   └── __init__.py
├── static
│   └── styles.css
├── templates
│   └── home.html
└── venv
    ├── bin

nginx configuration file:

server {
    listen 80;
    server_name ...;
    
    location /static {
        alias /home/root/d_testing/static;
    }
    
    location / {
        proxy_pass http://localhost:8000;
        include /etc/nginx/proxy_params;
        proxy_redirect off;
    }
}

I run my flask app with gunicorn: gunicorn -w 3 app:app

But it displays text without styles. What's wrong?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM