Как настроить конфигурацию 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/

Вернуться на верх