HTTP 如何升级成 HTTPS

有一个自己的项目需要上线,域名解析完成后,发现只能使用 http 协议,这在浏览器上会限制,提示用户不安全,所以需要把 HTTP 升级成 HTTPS 协议,但又不想花钱。

前提条件:

  • 已经配置好 Nginx 服务器

  • 域名已解析到您的服务器 IP

  • 已开放 80 和 443 端口(可在阿里云控制台的安全组设置中配置)

获取证书

我们先获取证书,我使用的是「Let's Encrypt」,这是一家为6亿多个网站提供免费 TLS 证书的非营利组织。

Let's Encrypt 提供免费的证书,有效期为 90 天,可以自动续期。

安装证书

我们需要先安装 Certbot 和 Nginx 插件:

复制代码
# 安装 EPEL 仓库sudo yum install epel-release -y# 安装 Certbot 和 Nginx 插件sudo yum install certbot python3-certbot-nginx -y

获取,然后安装证书

复制代码
sudo certbot --nginx -d your-domain.com
  • 在操作过程中,Certbot 会询问几个问题:

  • 输入您的邮箱地址(用于紧急续期通知和安全公告)

  • 同意服务条款

  • 是否愿意共享邮箱(可选)

  • 是否希望将所有 HTTP 流量重定向到 HTTPS(建议选择 2,完全重定向)

配置 Nginx

提供一个 AI 反馈的 Nginx 配置:​​​

复制代码
server {    listen 443 ssl;    server_name example.com www.example.com;    ssl_certificate /path/to/your/certificate.crt;    ssl_certificate_key /path/to/your/private.key;    # 其他 SSL 配置    ssl_protocols TLSv1.2 TLSv1.3;    ssl_prefer_server_ciphers on;    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;    # 网站根目录等配置    root /var/www/html;    index index.html;    # 其他配置...}# HTTP 重定向到 HTTPSserver {    listen 80;    server_name example.com www.example.com;    return 301 https://$host$request_uri;}

另外提供一个 Apache 的配置​​​​​​​

复制代码
<VirtualHost *:443>    ServerName example.com    ServerAlias www.example.com    SSLEngine on    SSLCertificateFile /path/to/your/certificate.crt    SSLCertificateKeyFile /path/to/your/private.key    # 其他配置    DocumentRoot /var/www/html    # 其他设置...</VirtualHost># HTTP 重定向到 HTTPS<VirtualHost *:80>    ServerName example.com    ServerAlias www.example.com    Redirect permanent / <https://example.com/></VirtualHost>

检查 Nginx 配置

配置好以后,您可以检查 Nginx 的配置,

复制代码
sudo cat /etc/nginx/conf.d/your-config-file.conf

我服务器上 Nginx 的内容如下:​​​​​​​

复制代码
server {    listen       80;    listen       [::]:80;    server_name  your-domain.com;    # 添加网站根目录    root /usr/share/nginx/your-domain;    # 为 Let's Encrypt 验证添加特殊处理    location /.well-known/acme-challenge/ {            allow all;    }    # 其他请求继续重定向到 HTTPS    location / {            return 301 https://$server_name$request_uri;    }}# HTTPS serverserver {    listen       443 ssl http2;    listen       [::]:443 ssl http2;    server_name  your-domain.com;    client_max_body_size 50M;    # 下载优化    proxy_buffer_size 128k;                   # 代理响应的缓冲区大小    proxy_buffers 4 256k;                     # 缓冲区数量和大小    proxy_busy_buffers_size 256k;             # 繁忙时缓冲区大小    proxy_temp_file_write_size 256k;          # 临时文件写入大小    # 开启 gzip 压缩    gzip on;    gzip_min_length 1k;    gzip_comp_level 6;    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;    # 修改证书路径为 Let's Encrypt 的证书路径    ssl_certificate     /etc/letsencrypt/live/your-domain.com/fullchain.pem;    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;    ssl_session_cache shared:SSL:1m;    ssl_session_timeout  10m;    ssl_ciphers PROFILE=SYSTEM;    ssl_prefer_server_ciphers on;    # 添加反向代理配置    location / {        proxy_pass <http://localhost:3100>;        proxy_http_version 1.1;        proxy_set_header Upgrade $http_upgrade;        proxy_set_header Connection 'upgrade';        proxy_set_header Host $host;        proxy_cache_bypass $http_upgrade;    }    # Load configuration files for the default server block.    include /etc/nginx/default.d/*.conf;    error_page 404 /404.html;        location = /40x.html {    }    error_page 500 502 503 504 /50x.html;        location = /50x.html {    }}

自动续期脚本

如果到期怎么办?

我们可以设置自动续期的脚本:

确认当前状态​​​​​​​

复制代码
# 检查 Certbot 版本certbot --version# 查看当前证书信息sudo certbot certificates

测试续期功能

复制代码
# 执行干运行测试,不实际更新证书sudo certbot renew --dry-run

创建脚本

复制代码
sudo nano /usr/local/bin/renew-letsencrypt.sh

添加内容:​​​​​​​

复制代码
#!/bin/bash# 日志文件LOG_FILE="/var/log/letsencrypt-renewal.log"DATE=$(date "+%Y-%m-%d %H:%M:%S")# 记录开始信息echo "[$DATE] 开始证书续期检查..." >> $LOG_FILE# 执行续期操作并记录输出RENEWAL_OUTPUT=$(certbot renew --quiet 2>&1)RENEWAL_STATUS=$?# 检查续期状态if [ $RENEWAL_STATUS -eq 0 ]; then    echo "[$DATE] 证书检查/续期成功" >> $LOG_FILE    # 检查是否有证书被实际更新    if echo "$RENEWAL_OUTPUT" | grep -q "renewal"; then        echo "[$DATE] 检测到证书已更新,重新加载 Nginx" >> $LOG_FILE        systemctl reload nginx        NGINX_STATUS=$?        if [ $NGINX_STATUS -eq 0 ]; then            echo "[$DATE] Nginx 重新加载成功" >> $LOG_FILE        else            echo "[$DATE] 错误:Nginx 重新加载失败,返回码: $NGINX_STATUS" >> $LOG_FILE        fi    else        echo "[$DATE] 没有证书需要更新" >> $LOG_FILE    fielse    echo "[$DATE] 错误:证书续期失败,返回码: $RENEWAL_STATUS" >> $LOG_FILE    echo "[$DATE] 错误详情: $RENEWAL_OUTPUT" >> $LOG_FILEfiecho "[$DATE] 证书续期流程完成" >> $LOG_FILEecho "----------------------------------------" >> $LOG_FILE

设置执行权限

复制代码
sudo chmod +x /usr/local/bin/renew-letsencrypt.sh

创建任务

复制代码
sudo crontab -e

添加以下内容:​​​​​​​

复制代码
# 每天凌晨 2:15 和下午 2:15 运行证书续期15 2,14 * * * /usr/local/bin/renew-letsencrypt.sh

验证任务设置

复制代码
sudo crontab -l

设置每周运行一次​​​​​​​

复制代码
sudo chmod +x /usr/local/bin/renew-letsencrypt.shsudo crontab -e

每周检查一次​​​​​​​

复制代码
# 每周一上午9点检查证书状态0 9 * * 1 /usr/local/bin/renew-letsencrypt.sh

手动续签脚本​​​​​​​

复制代码
# 执行脚本sudo /usr/local/bin/renew-letsencrypt.sh# 检查文件输出sudo tail -f /var/log/letsencrypt-renewal.log

查看证书信息

复制代码
sudo certbot certificates

会显示出「已安装证书的域名、存储位置、到期日期、续期设置」证书有效期

比如:从 2025-04-21 到 2025-07-20(共 90 天,符合 Let's Encrypt 标准)。

Certbot 会在到期前 30 天(即 2025-06-20 左右)自动尝试续期(你之前的 -dry-run 测试已确认续期配置正常)。

无需手动操作,除非续期失败。

相关推荐
九卷技术录2 个月前
敏捷开发10:精益软件开发和看板kanban开发方法的区别是什么
scrum·敏捷开发·敏捷流程·研发管理
九卷2 个月前
软件产品开发中常见的10个问题及处理方法
项目管理·敏捷开发·研发管理
weixin_514949292 个月前
华为IPD变革20年历程
华为·企业管理·ipd·研发管理·产品管理·华为研发
泽众云测试3 个月前
ALM研发管理:全新甘特图,让项目管理更高效
项目管理·甘特图·研发管理
九卷5 个月前
敏捷开发:如何高效开每日站会(Daily Stand-up Meeting)
敏捷开发·敏捷·研发管理
九卷6 个月前
敏捷开发:用户故事估算方法介绍
敏捷开发·敏捷·研发流程·研发管理
九卷技术录6 个月前
敏捷开发01:敏捷简史和几种软件开发模型
敏捷开发·研发流程·研发管理
九卷技术录6 个月前
敏捷开发02:敏捷开发之Scrum开发框架介绍
scrum·敏捷开发·敏捷流程·研发管理
九卷6 个月前
敏捷开发:Sprint Planning 冲刺计划会议详细介绍和用户故事拆分、开发任务细分
敏捷开发·敏捷·研发管理