我对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/