# Nginx 与 HTTPS 配置

URL: https://caijiao.org/koa/deploy/nginx
Source: docs/koa/deploy/nginx.md
Description: 本文介绍了如何使用 Nginx 配置 HTTPS，确保网站的数据传输加密与安全。

在现代的 Web 应用中，使用 HTTPS 协议来加密数据传输是非常重要的。通过 Nginx 配置 HTTPS，你可以确保用户和服务器之间的通信是安全的。本文将介绍如何通过 Nginx 配置 HTTPS。

## 1. 安装 Nginx

首先，确保你已经安装了 Nginx。如果你还没有安装 Nginx，可以使用以下命令进行安装：

### 1.1 在 Ubuntu 上安装 Nginx

```bash
sudo apt update
sudo apt install nginx
````

### 1.2 在 CentOS 上安装 Nginx

```bash
sudo yum install epel-release
sudo yum install nginx
```

安装完成后，可以使用以下命令启动 Nginx：

```bash
sudo systemctl start nginx
```

## 2. 获取 SSL 证书

要配置 HTTPS，你需要一个有效的 SSL/TLS 证书。你可以选择购买证书，也可以使用免费的 Let's Encrypt 证书。

### 2.1 使用 Let's Encrypt 获取免费证书

Let's Encrypt 提供免费的 SSL 证书。你可以通过 Certbot 工具来自动化证书的获取与更新。

#### 安装 Certbot

```bash
sudo apt install certbot python3-certbot-nginx
```

#### 获取证书

```bash
sudo certbot --nginx -d yourdomain.com
```

此命令会自动获取 SSL 证书并配置 Nginx 以支持 HTTPS。如果你没有域名或没有正确配置 DNS，Certbot 将无法生成证书。

### 2.2 使用自签名证书（仅限开发使用）

如果你只是在开发环境中进行 HTTPS 测试，可以使用自签名证书。你可以通过以下命令生成自签名证书：

```bash
openssl genpkey -algorithm RSA -out /etc/ssl/private/nginx.key
openssl req -new -key /etc/ssl/private/nginx.key -out /etc/ssl/certs/nginx.csr
openssl x509 -req -days 365 -in /etc/ssl/certs/nginx.csr -signkey /etc/ssl/private/nginx.key -out /etc/ssl/certs/nginx.crt
```

## 3. 配置 Nginx 支持 HTTPS

配置 Nginx 以使用 SSL/TLS 加密协议。编辑 Nginx 配置文件，通常位于 `/etc/nginx/sites-available/` 或 `/etc/nginx/conf.d/` 目录下。

### 3.1 编辑 Nginx 配置文件

假设你的站点配置文件为 `/etc/nginx/sites-available/default`，打开并编辑该文件：

```bash
sudo nano /etc/nginx/sites-available/default
```

在 server 块中添加 HTTPS 配置：

```nginx
server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;

    # 强制 HTTP 到 HTTPS 的重定向
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name yourdomain.com www.yourdomain.com;

    # SSL 配置
    ssl_certificate /etc/ssl/certs/nginx.crt;  # 证书文件路径
    ssl_certificate_key /etc/ssl/private/nginx.key;  # 私钥文件路径
    ssl_protocols TLSv1.2 TLSv1.3;  # 启用的加密协议
    ssl_ciphers HIGH:!aNULL:!MD5;  # 强化加密套件
    ssl_prefer_server_ciphers on;  # 优先使用服务器的加密套件

    location / {
        # 站点根目录配置
        root /var/www/html;
        index index.html index.htm;
    }
}
```

### 3.2 重新加载 Nginx 配置

在编辑完配置文件后，重新加载 Nginx 以使配置生效：

```bash
sudo systemctl reload nginx
```

## 4. 配置 HTTPS 强制重定向

为了确保所有的 HTTP 请求都使用 HTTPS 协议，你可以在 Nginx 配置中添加重定向规则，将 HTTP 请求自动重定向到 HTTPS。

在配置文件中的 `server` 块中，添加以下内容：

```nginx
server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    return 301 https://$host$request_uri;
}
```

这将强制所有 HTTP 请求重定向到 HTTPS。

## 5. 配置自动更新证书

Let's Encrypt 提供的证书有效期为 90 天，因此你需要定期更新证书。可以设置一个定时任务来自动更新证书。

### 5.1 设置自动更新

打开 crontab 编辑器：

```bash
sudo crontab -e
```

添加以下定时任务，每天凌晨 2 点执行证书更新操作：

```bash
0 2 * * * certbot renew --quiet && systemctl reload nginx
```

## 6. 测试 HTTPS 配置

完成配置后，你可以通过浏览器访问 `https://yourdomain.com` 来检查 HTTPS 是否配置成功。你还可以使用 SSL Labs 提供的工具来测试 SSL 配置的安全性：[SSL Labs Test](https://www.ssllabs.com/ssltest/)

## 7. 总结

通过 Nginx 配置 HTTPS 可以大大增强网站的安全性。你可以使用 Let's Encrypt 免费获得证书，并通过 PM2 管理应用。在生产环境中部署 HTTPS 是保护用户数据、提升用户信任和 SEO 排名的关键步骤。配置完成后，确保定期更新证书并测试 HTTPS 配置的安全性。
