Skip to main content

DevSam

单机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目录可以根据需要自行修改,尤其是多站管理时非常便利。