配置Nginx以回复http://my-domain.com/.well-known/acme-challenge/XXXX

mar*_*ins 2 nginx lets-encrypt certbot

我无法让nginx返回我放入的文件/var/www/letsencrypt

nginx /站点可用/mydomain.conf

server {
  listen 80 default_server;
  listen [::]:80 default_server ipv6only=on;
  server_name my-real-domain.com;

  include /etc/nginx/snippets/letsencrypt.conf;

  root /var/www/mydomain;
  index index.html;
  location / {
    try_files $uri $uri/ =404;
  }
}
Run Code Online (Sandbox Code Playgroud)

nginx /代码段/letsencrypt.conf

location ^~ /.well-known/acme-challenge/ {
  default_type "text/plain";
  root /var/www/letsencrypt;
}
Run Code Online (Sandbox Code Playgroud)

我运行以下命令: certbot certonly --webroot -w / var / www / letsencrypt / -d my-real-domain.com

但是certbot尝试访问的页面始终是404。

调试

$ echo hi > /var/www/letsencrypt/hi
$ chmod 644 /var/www/letsencrypt/hi
Run Code Online (Sandbox Code Playgroud)

现在我应该可以了curl localhost/.well-known/acme-challenge/hi,但是那行不通。仍然是404。知道我缺少了什么吗?

buk*_*jot 5

选项root /var/www/letsencrypt/;告诉nginx“这是基本目录”,因此最终路径为/var/www/letsencrypt/.well-known/acme-challenge/

因此,您有2个选择:

  1. 更改路径,例如

    $ echo hi > /var/www/letsencrypt/.well-known/acme-challenge/hi
    
    Run Code Online (Sandbox Code Playgroud)
  2. 更改nginx的行为,因此nginx会将其视为别名:

    location ^~ /.well-known/acme-challenge/ {
      default_type "text/plain";
      rewrite /.well-known/acme-challenge/(.*) /$1 break;
      root /var/www/letsencrypt;
    }
    
    Run Code Online (Sandbox Code Playgroud)

而且不要忘记make killall -1 nginx重新加载配置

  • 而不是“killall -1 nginx”来重新加载配置。您可以执行“sudo nginx -t”来验证配置,如果返回成功,则执行“sudo service Nginx restart” (3认同)