Skip to content

Nginx部署ssl证书 踩坑

前提

需要申请提前 ssl 证书,一般在购买域名的时候,都可以免费申请,如果需要更安全的证书一般需要钱,但个人使用免费即可。腾讯云ssl证书申请

不过腾讯申请的免费证书不支持泛域名,即*.xxx.com。每个子域名都需要单独申请,比较麻烦。 或者使用 Let's Encrypt 申请,这个支持泛域名和根域名。

首先把下载的 ssl 证书解压,把 Nginx 下的两张证书传输到服务器,存放位置你自己决定,案例放在 /etc/ssl

Nginx部署ssl证书

然后修改你的 nginx 配置 vim /etc/nginx/conf.d/xxx.conf

PS:配置文件的路径可能我与你们的不一样,使用你们自己的 nginx 配置文件路径

nginx
server {
  # 监听的端口
  listen  443;
  # 配置域名(leezhian.com),无域名可以填写直接的ip地址
  server_name leezhian.com;
  # gzip 压缩配置
  gzip on;
  gzip_buffers 4 8k;
  gzip_comp_level 6;
  gzip_min_length 1k;
  gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
  gzip_disable "MSIE [1-6]\.";
  gzip_http_version 1.1;
  gzip_vary on;
  # 此处有陷阱
  ssl on;
  # ssl文件公钥目录(就是刚才上传的那两个文件)
  ssl_certificate /etc/ssl/1_leezhian.com_bundle.crt;
  # ssl文件私钥目录
  ssl_certificate_key /etc/ssl/2_leezhian.com.key;
  ssl_session_timeout 5m;
  ssl_protocols TLSv1.2 TLSv1.3; 
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  ssl_prefer_server_ciphers on;
  # 项目文件的根路径
  root    /data/blog;
  location / {
    index index.html;
  }
}

保存配置。检查 配置nginx -t

然而报错,nice! 😭

nginx: [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead in /etc/nginx/conf.d/blog.conf:4

根据提示: ssl 这条指令已启用了,建议使用 listen ...ssl(1.1版本后要求的)

重回 nginx 修改配置

nginx
# 删除ssl on;
# 把 listen 改为
listen  443 ssl;

重新检查配置!成功!✌️ 然后执行nginx -s reload 重启nginx

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

验证👉 验证个屁呀,能看到这篇文章就代表成功了!😂😂😂


附加http 重定向为 https

nginx
server {
  listen 80;
  server_name leezhian.com;
  return 301 https://$host$request_uri; 
  # or
  # rewrite ^(.*)$  https://$host$1 permanent;
}

2023.02.09 更新

现在很多静态生成器或者 ssr 框架,都会带有类似“美化路由”的技术,即本质是访问 hello.html,但实际地址栏显示的是 https://xxx/hello,导致按常规的多页面配置 nginx 时会导致 404

目前当前博客就是使用该方案

404 的出现

如果你不修改 nginx 配置的情况下,类似上面的配置,你请求首页是没有问题的,然后再通过首页点击链接跳转到其他页面(如 https://xxx/hello)也是没有为题的。

但如果你直接通过地址栏访问 https://xxx/hello,服务器会返回 404。

原因在于你请求的 /hello 在服务器找不到呀,你脑子知道找的是 /hello.html,但 nginx 并不知道你要找什么后缀的,只能直接去目录下找 hello 这个文件,找不到 404。

nginx
# 省略部分代码
location / {
  index index.html;
  # 意思是先尝试 uri 的路径查找(https://xxx/hello),查找不到,尝试添加 html 后缀查找(https://xxx/hello.html),再查找不到就查找这个目录下的 index(https://xxx/hello/index.html)
  try_files $uri $uri.html $uri/index.html
}

Released under the MIT License.