Обслуживание статического HTML и т.д. и Django из корня '/' с помощью nginx

У меня есть nginx, настроенный для успешного обслуживания веб-сайта Django. Я хотел бы, чтобы он также обслуживал каталог HTML файлов, изображений и т.д. Если URL не соответствует файлу в этом каталоге, запрос должен идти к Django.

В настоящее время я имею следующее (с удаленными неактуальными настройками, например, SSL, логирование и т.д.):

upstream myproject_server {
  server unix:/webapps/myproject/run/gunicorn.sock fail_timeout=0;
}

server {
  server_name example.com;

  rewrite ^/favicon.ico$ /static/myproject/favicons/favicon.ico last;
  rewrite ^/robots.txt$ /static/myproject/robots.txt last;

  location /static/ {
    # Django's static files
    alias /webapps/myproject/code/myproject/static_collected/;
  }

  location / {
    if (!-f $request_filename) {
      proxy_pass http://myproject_server;
      break;
    }
  }
}

Если у меня есть каталог с разными файлами, например, такой: /webapps/myproject/code/myproject/static_html/:

static_html/
  test.html
  directory/
    foo.html
    bar.png
    another/
      hello.pdf
  etc...

Что мне нужно добавить в nginx.conf, чтобы эти файлы эффективно обслуживались на /test.html, /directory/foo.html и т.д.?

Вам нужен оператор root для поиска файлов в каталоге static_html. Ваш -f проверяет только существование файла, но не каталога, поэтому URI, указывающие на каталог, отправляются в proxy_pass. Вы можете изменить это на -e для проверки существования файлов или каталогов. См. документацию if..

Например:

location / {
    root /webapps/myproject/code/myproject/static_html;
    if (!-e $request_filename) {
        proxy_pass http://myproject_server;
    }
}

Однако предпочтительным решением, вероятно, будет полное отсутствие блока if. См. try_files документацию.

Например:

location / {
    root /webapps/myproject/code/myproject/static_html;
    try_files $uri $uri/ @proxy;
}
location @proxy {
    proxy_pass http://myproject_server;
}
Вернуться на верх