如何设置nginx config .well-known/acme-challenge与Django的代理?

rseugnpd  于 2022-11-21  发布在  Nginx
关注(0)|答案(1)|浏览(137)

我对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 /var/www/html/myapp_frontend/myapp/;
     }

     return 301 https://myserver.com$request_uri;
 }

因此,在前端,我可以毫无问题地定义:我的应用程序的前端/我的应用程序/
现在,我可以像这样运行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;
     }

     return 301 https://api.myserver.com$request_uri;
 }

请注意,我实际上并没有像前端配置中那样对文件夹“/var/www/html/myapp_backend/myapp/”进行配置,因为我现在使用的是代理。
现在我不能像这样运行acme脚本:

/root/.acme.sh/acme.sh --issue -d myserver.com -w /var/www/html/myapp_backend/myapp/

如何配置SSL提供程序的文件夹,使其能够检查我的后端?

0vvn1miw

0vvn1miw1#

我不知道是否可以只在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 <file_name>[\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:
        return HttpResponse("File not found!",
                            status=status.HTTP_404_NOT_FOUND)

    return HttpResponse("".join(lines), content_type="text/plain")

我在《 Docker 》中卷到:/myapp/.知名/acme-challenge/
安装到:/var/www/html/我的应用程序后端/我的应用程序/

相关问题