Nginx部署ssl证书 踩坑
前提
需要申请提前 ssl 证书,一般在购买域名的时候,都可以免费申请,如果需要更安全的证书一般需要钱,但个人使用免费即可。腾讯云ssl证书申请
不过腾讯申请的免费证书不支持泛域名,即*.xxx.com
。每个子域名都需要单独申请,比较麻烦。
或者使用 Let’s Encrypt 申请,这个支持泛域名和根域名。
首先把下载的 ssl 证书解压,把 Nginx 下的两张证书传输到服务器,存放位置你自己决定,案例放在 /etc/ssl
。

然后修改你的 nginx 配置 vim /etc/nginx/conf.d/xxx.conf
PS:配置文件的路径可能我与你们的不一样,使用你们自己的 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 修改配置
# 删除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
。
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。
# 省略部分代码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}