Как настроить конфигурацию nginx .well-known/acme-challenge с прокси для Django?
Я очень запутался в конфигурации Nginx .well-known/acme-challenge и в том, как она работает с прокси для Django. Вот моя конфигурация фронтенда, которая работает:
server {
listen 80;
server_name myserve.com;
root /var/www/html/myapp_frontend/myapp/;
index index.html;
location / {
try_files $uri$args $uri$args/ /index.html;
}
location /.well-known/acme-challenge {
allow all;
root /root/.acme.sh/;
}
return 301 https://myserver.com$request_uri;
}
server {
listen 443 ssl;
server_name myserver.com;
location / {
root /var/www/html/myapp_frontend/myapp/;
index index.html index.htm;
try_files $uri$args $uri$args/ /index.html;
}
ssl_certificate /root/.acme.sh/myserver.com/fullchain.pem;
ssl_certificate_key /root/.acme.sh/myserver.com/privkey.pem;
}
Итак, на фронтенде у меня нет проблем с определением: root /var/www/html/myapp_frontend/myapp/;
Теперь я могу запустить скрипт acme следующим образом:
/root/.acme.sh/acme.sh --issue -d myserver.com -w /var/www/html/myapp_frontend/myapp/
Все работает нормально. Но у меня проблемы с бэкендом Django, потому что в конфигурации nginx используется прокси:
upstream myapp {
server backend:8000;
}
server {
listen 80;
server_name api.myserver.com;
location / {
proxy_pass http://myapp;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
location /.well-known/acme-challenge {
allow all;
root /root/.acme.sh/;
}
return 301 https://api.myserver.com$request_uri;
}
server {
listen 443 ssl;
server_name api.myserver.com;
location / {
proxy_pass http://myapp;
}
ssl_certificate /root/.acme.sh/api.myserver.com/fullchain.pem;
ssl_certificate_key /root/.acme.sh/api.myserver.com/privkey.pem;
}
Обратите внимание, что у меня нет конфигурации для папки "/var/www/html/myapp_backend/myapp/", как у меня есть в конфигурации фронтенда, потому что сейчас я использую прокси.
Теперь я не могу запустить скрипт acme следующим образом: /root/.acme.sh/acme.sh --issue -d myserver.com -w /var/www/html/myapp_backend/myapp/
Как настроить папку для SSL-провайдера, чтобы он мог проверить мой бэкенд?
Я не знаю, возможно ли это сделать только в конфигурации Nginx, но я пришел к выводу, что при использовании прокси именно Django должен создать url к /.well-known/acme-challenge/
В основном я задаю URL следующим образом:
urlpatterns = [
re_path(r'^acme-challenge/(?P<file_name>[\w\-]+)$', get_challenge),
]
и
urlpatterns = [
...
path('.well-known/', include('myapp.wellknonw.urls')),
]
Обратите внимание, что для приема нескольких имен файлов я использую следующее: (?P<имя_файла>[\w-]+)$
А мои взгляды таковы:
@require_GET
def get_challenge(request, file_name=None):
lines = []
if file_name:
path = f'{BASE_DIR}/myapp/.well-known/acme-challenge/{file_name}'
try:
with open(path) as f:
lines = f.readlines()
f.close()
except:
pass
return HttpResponse("".join(lines), content_type="text/plain")
В docker мой том на: /myapp/.well-known/acme-challenge/
указывает на: /var/www/html/myapp_backend/myapp/