如何使用Django的代理来设置nginx-config.aknown/acme挑战



我对Nginx.众所周知的/acme挑战配置以及它如何与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;
}

因此,在前端,我可以毫无问题地定义: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;
}
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提供程序的文件夹以检查我的后端?

我不知道是否只有在Nginx配置中才能做到这一点,但我得出的结论是,使用代理,Django应该创建一个/.aknowledge/acme-challenge/的url

我基本上设置了这样一个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挑战/

安装到:/var/www/html/myapp_backend/myapp/

最新更新