单机nginx配置SSL证书和静态内容部署
最近部署静态博客的主机频繁发生变动,每次都需要重新配置Nginx服务以及证书。这件事看似不复杂,但是这种低频的操作往往会频繁的踩坑,而且是同样的坑。所以这里简单记录下关键的内容,以后可以直接参考。
# 开启443端口和配置证书
申请证书有很多种途径,可以使用免费的certbot,也可以使用云平台提供的免费证书。我通常会使用阿里云提供的免费证书服务,不过阿里云的免费证书的策略稍有变化,以前可以免费一年,最近似乎变成了免费3个月。
下载完证书后,我一般会把pem和key两个文件存放在/etc/nginx/certs目录。如果这个目录不存在,可以创建。
开启443端口的配置,通常我会在/etc/nginx/conf.d目录下创建独立的配置文件。比如我的域名是devsam.cc,我通常会创建devsamcc_443.conf文件,并添加如下内容:
server {
# 将原有 listen 80 修改为 listen 80 改为 listen 443 ssl
listen 443 ssl;
# 选择性开启http2。1.25.1版本以后要用下面这种方式开启。
http2 on;
# 原有 server_name,可继续新增更多当前证书支持的域名
server_name devsam.cc www.devsam.cc;
# ======================= 证书配置开始 =======================
# 指定证书文件(中间证书可以拼接至该pem文件中),请将 /etc/ssl/cert/ssl.pem 替换为您实际使用的证书文件的绝对路径
ssl_certificate /etc/nginx/certs/devsam.cc.pem;
# 指定私钥文档,请将 /etc/ssl/cert/ssl.key 替换为您实际使用的私钥文件的绝对路径
ssl_certificate_key /etc/nginx/certs/devsam.cc.key;
# 配置 SSL 会话缓存,提高性能
ssl_session_cache shared:SSL:1m;
# 设置 SSL 会话超时时间
ssl_session_timeout 5m;
# 自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
# 指定允许的 TLS 协议版本,TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差
ssl_protocols TLSv1.2 TLSv1.3;
# 优先使用服务端指定的加密套件
ssl_prefer_server_ciphers on;
# ======================= 证书配置结束 =======================
# 其它配置
root /var/www/html;
}
server {
listen 80;
server_name devsam.cc www.devsam.cc;
# 设置HTTP请求自动跳转到HTTPS
return 301 https://$host$request_uri;
}
上述配置参考了阿里云官方证书部署的部分文档,但有几点需要额外注意:
- 添加443的root目录
root /var/www/html;,否则静态文件不生效。当然这个目录可以指定为任意目录。 - 非SSL的80端口设置跳转。注意80端口可以服务多个网站,所以可以配置多个server块,这一点跟我们启动进程时端口被占用的逻辑不一样。
以上两点非常容易被忽略,每次都要搜索一番。
# 静态文件部署
我通常使用Debian发行版,这个系统的nginx默认ROOT目录是/var/www/html,将静态文件移动到这个目录下,nginx就可以正常管理了。
但是还可以指定nginx的ROOT目录,比如如下配置:
server {
...
root /var/www/html;
...
}
配置中root目录可以根据需要自行修改,尤其是多站管理时非常便利。