You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx配置Let’s Encrypt证书时出现“no "ssl_certificate" is defined in server”错误求助

Nginx配置Let’s Encrypt证书时出现“no "ssl_certificate" is defined in server”错误求助

嘿,我看了你的配置,问题根源很明确——你的default.conf里的默认server块同时监听了443端口,但完全没有配置SSL证书,而Nginx在处理HTTPS请求时,会优先匹配到这个标记了default_server的443监听块,这就导致了SSL握手时找不到证书的错误。

下面是具体的修复步骤和优化建议:

第一步:修复default.conf的监听配置

把default.conf里的443监听行全部删掉,让它只负责处理未匹配到特定域名的HTTP请求就行,修改后的内容如下:

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  _;
    root          /var/www/;
    index index.html index.htm index.nginx-debian.html;

    include /etc/nginx/default.d/*.conf;

    location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ {
        add_header Access-Control-Allow-Origin "*";
        expires 7d;
        access_log off;
    }

    location / {
        try_files $uri $uri/ =404;
    }

    error_page 404 /404.html;
    location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }

    #return 301 http://$host$request_uri;
}

第二步:优化mywebsite.conf的冗余配置

你现在的配置里有不少重复的server块,很容易出问题。可以合并成更清晰的结构,避免规则冲突:

# 处理www域名的HTTP/HTTPS请求,全部跳转到主域名的HTTPS
server {
    listen 80;
    listen 443 ssl;
    server_name www.mywebsite.com;

    # 这里必须配置证书,否则访问www的HTTPS会报错
    ssl_certificate /etc/letsencrypt/live/mywebsite.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mywebsite.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

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

# 主域名的HTTP请求跳转到HTTPS
server {
    listen 80;
    server_name mywebsite.com;
    return 301 https://$host$request_uri;
}

# 主域名的HTTPS服务,反向代理到你的Node应用
server {
    listen 443 ssl;
    server_name mywebsite.com;

    location / {
        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;
        proxy_pass              "http://127.0.0.1:3100";
        proxy_redirect http:// https://;
    }

    ssl_certificate /etc/letsencrypt/live/mywebsite.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mywebsite.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

第三步:验证配置并重启Nginx

修改完之后,先执行命令验证配置是否合法:

nginx -t

如果输出nginx: configuration file /etc/nginx/nginx.conf test is successful,就可以重新加载Nginx配置了:

systemctl reload nginx

额外检查点

  • 确认证书文件的权限:执行ls -l /etc/letsencrypt/live/mywebsite.com/,确保fullchain.pem和privkey.pem的权限是-rw-r--r--(644),保证Nginx用户能读取这些文件。
  • 再次确认防火墙的443端口是开放的:firewall-cmd --list-all,检查是否包含https服务。

这样应该就能解决你遇到的SSL证书错误了,试试访问你的域名看看吧!

备注:内容来源于stack exchange,提问作者Shan Robertson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 13:02:38