Обслуживание статического 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;
}