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
}