Мне удалось настроить Django с Gunicorn и Nginx до такой степени, что все работает правильно - за исключением одной желаемой функции.
Я хотел бы иметь возможность обслуживать /static/index.html при доступе только к root (/
) без изменение отображаемого URL-адреса в браузере. Я не уверен, что здесь использовать (переписать или псевдоним или что-то еще?) Вот мой текущий nginx.conf
upstream test_server {
server unix:/path/to/project/project.sock fail_timeout=10s;
}
server {
listen 80;
server_name <IP>;
location = /favicon.ico { access_log off; log_not_found off; }
location = / {
alias /path/to/project/static/; # Does not work! See comment below
}
location /static/ {
alias /path/to/project/static/; # works!
}
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://unix:/path/to/project/project.sock; # communicates with Gunicorn/Django
}
}
Комментарий сверху: кажется, что путь вперед index.html
как запрос к Django, в результате чего Django жалуется «Not Found: /index.html», хотя Django даже не должен знать об этом. Imo Nginx должен просто вернуть /static/index.html сюда без участия Django.
Как я могу это исправить (все еще отображается <IP>/
в браузере, а не <IP>/static/index.html
)?
server {
# listen, server_name, etc...
root /path/to/project;
location = / {
rewrite ^ /static/index.html;
}
location /static/ {
}
location / {
# proxy ...
}
}
Я нашел решение. Он немного отличался от того, что предложил AlexeyTen:
server {
# listen, server_name, etc...
location = / {
root /path/to/project;
rewrite ^/$ /static/index.html last;
}
location /static/ {
alias /path/to/project/static/;
}
location / {
# proxy ...
}
}
root
вне блоков местоположения не работали, равно как и не включили его напрямую в URL перезаписи.