Ray-D-Song's Blog

nginx 配置 https

2024-09-03 5min

self-host 系列文章, 讲述如何自己搭建服务.

什么是 HTTPS

HTTPS 是 HTTP 的安全版本, 通过加密通信内容, 防止中间人攻击, 保证数据传输的安全性.

中间人攻击可以简单理解为, 有人篡改了服务端发送给你, 或者是你发送给服务端的数据.

HTTPS 约定了使用 443 端口, 通过 SSL/TLS 协议进行通信.

最常见的应用部署方法是使用 Nginx 作为反向代理服务器, 监听 443 端口, 将请求转发到服务所在的端口. 并且 Nginx 会负责 SSL/TLS 的加密解密工作.

生成证书

配置 HTTPS 首先需要生成证书, 证书由 CA 机构颁发, 用来证明你的网站是安全的.
https://www.cloudflare.com/application-services/products/ssl/

如果你的域名在 Cloudflare 上, 可以直接在 Cloudflare 上申请免费证书.

进入 Cloudflare 控制台, 选择左侧的Websites -> 选择你的域名
cloudflare

然后再选择左侧边栏的SSL/TLS -> Origin Server -> Create Certificate cloudflare

不需要修改任何选项, 直接点击Create创建即可.
Cloudflare 会生成证书和私钥, 证书用于证明你的网站是安全的, 私钥用于加密解密通信内容.
记得保存你的私钥, 离开创建页后就无法再看到了.

你也可以使用 Let’s Encrypt 获取免费证书.

假设你的证书和密钥如下:

-----BEGIN CERTIFICATE-----
your_certificate
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
your_private_key
-----END PRIVATE

将证书保存为 xxx.crt, 将私钥保存为 xxx.key.
记住你的证书和私钥的路径, 用于配置 Nginx.

配置 Nginx

安装好 Nginx 后, 打开 Nginx 配置文件, 一般在 /etc/nginx/nginx.conf 或者 /usr/local/nginx/conf/nginx.conf.
也可以用 nginx -t 命令查看 Nginx 配置文件的路径.

新版本的 Nginx 会将配置文件分为多个文件, 一般在 /etc/nginx/conf.d/ 目录下.
新建一个文件, 命名为 your_domain.com.conf.

对应的 nginx 配置如下:

server {
    listen 443 ssl;

    server_name your_domain.com;

    ssl_certificate /path/to/your_certificate.crt;
    ssl_certificate_key /path/to/your_private_key.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://localhost:8080; 
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

其中需要关注的高亮行:

如果你希望用户访问路径不是your_domain.com, 可以将 11 行的/替换为你想要的路径.

保存配置文件后, 重启 Nginx 服务.

sudo systemctl restart nginx

如果没有使用 systemd 管理 Nginx 服务, 可以使用以下命令重启 Nginx 服务.

sudo nginx -s reload

配置 DNS

在 Cloudflare 控制台中, 选择左侧的Websites -> 选择你的域名 -> DNS
点击Add record添加一条 A 记录, 将Type设置为A, Name设置为你的域名, IPv4 address设置为你的服务器 IP.
点击保存, 等待 DNS 生效. 然后访问你的域名, 大功告成.

配置 HTTP 跳转 HTTPS

如果你希望用户访问 HTTP 时自动跳转到 HTTPS, 可以在配置文件中添加以下配置.

server {
    listen 80;
    server_name your_domain.com; 
    return 301 https://$host$request_uri;
}

对于 Cloudflare 用户, 可以在 Cloudflare 控制台中配置SSL/TLS -> Edge Certificates -> Always Use HTTPS开启强制 HTTPS.