# 使用 Nginx 部署

URL: https://caijiao.org/express/chapter10/2-nginx
Source: docs/express/chapter10/2-nginx.md
Description: 本章节将介绍如何使用 Nginx 来部署 Express 应用，配置反向代理，优化性能，并保证应用在生产环境中的稳定运行。通过 Nginx 的负载均衡和反向代理功能，能够有效提升 Express 应用的可靠性和扩展性。

在生产环境中，Nginx 是一个流行的反向代理服务器，它不仅能够作为 Web 服务器提供静态文件服务，还能将请求转发到后端的 Express 应用中。通过使用 Nginx 部署 Express 应用，可以提高应用的性能、可靠性，并提供更多的功能，如负载均衡、缓存、SSL 等。接下来，我们将学习如何通过 Nginx 部署 Express 应用。

## 1. 安装 Nginx

首先，确保你的服务器上已经安装了 Nginx。如果你使用的是 Ubuntu 或 Debian 系统，可以通过以下命令安装 Nginx：

```bash
sudo apt update
sudo apt install nginx
````

对于 CentOS 系统：

```bash
sudo yum install nginx
```

安装完成后，启动 Nginx：

```bash
sudo systemctl start nginx
```

确保 Nginx 在系统启动时自动启动：

```bash
sudo systemctl enable nginx
```

你可以通过在浏览器访问服务器的 IP 地址（如 `http://your-server-ip`）来验证 Nginx 是否安装成功。如果安装成功，你将看到 Nginx 的欢迎页面。

## 2. 配置 Nginx 反向代理

在生产环境中，Nginx 通常作为反向代理，接收客户端的请求并将其转发给后端的 Express 应用。假设你的 Express 应用已经运行在 `localhost` 的 3000 端口上，接下来配置 Nginx 将请求转发给该端口。

### 2.1 配置 Nginx 站点配置文件

首先，打开 Nginx 的站点配置文件进行修改：

```bash
sudo nano /etc/nginx/sites-available/default
```

在该文件中，你需要配置反向代理，将请求转发到你的 Express 应用。修改或添加如下内容：

```nginx
server {
    listen 80;  # 监听 HTTP 请求
    server_name your-domain.com;  # 配置你的域名或 IP 地址

    # 根目录
    root /var/www/html;
    index index.html index.htm;

    location / {
        proxy_pass http://localhost:3000;  # 将请求转发到 Express 应用所在的端口
        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;
    }

    # 错误页面配置
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}
```

### 2.2 说明

* `listen 80;`：Nginx 监听 80 端口，接收来自客户端的 HTTP 请求。
* `server_name your-domain.com;`：你可以将 `your-domain.com` 替换为你的实际域名或者服务器的 IP 地址。
* `proxy_pass http://localhost:3000;`：将请求转发到运行在本地 3000 端口的 Express 应用。假设 Express 应用正在该端口上监听。
* `proxy_set_header`：这些配置确保客户端的请求头信息能够正确传递到后端的 Express 应用。

### 2.3 测试 Nginx 配置

保存并关闭配置文件后，检查 Nginx 配置是否正确：

```bash
sudo nginx -t
```

如果没有错误消息，重载 Nginx 配置使改动生效：

```bash
sudo systemctl reload nginx
```

## 3. 启动 Express 应用

在后台运行 Express 应用，确保它在 3000 端口上监听请求。你可以使用 `pm2` 来守护和管理 Express 应用，确保其在生产环境中稳定运行。

```bash
pm2 start app.js --name "express-app"
```

## 4. 配置 HTTPS（可选）

为了提高安全性，你可以为 Nginx 配置 SSL，启用 HTTPS 加密。我们可以使用 Let's Encrypt 免费的 SSL 证书来完成这一过程。

### 4.1 安装 Certbot

Certbot 是一个自动化的工具，可以帮助你轻松获取和配置 Let's Encrypt SSL 证书。首先，安装 Certbot：

对于 Ubuntu 系统：

```bash
sudo apt install certbot python3-certbot-nginx
```

对于 CentOS 系统：

```bash
sudo yum install certbot python3-certbot-nginx
```

### 4.2 获取 SSL 证书

使用 Certbot 自动获取 SSL 证书，并配置 Nginx：

```bash
sudo certbot --nginx
```

该命令会自动帮助你获取 SSL 证书并修改 Nginx 配置，使其支持 HTTPS。你只需要按照提示输入你的电子邮件和域名。

### 4.3 测试 HTTPS 配置

获取 SSL 证书后，Nginx 将自动配置为监听 443 端口并支持 HTTPS。你可以通过浏览器访问 `https://your-domain.com` 来检查 HTTPS 是否配置成功。

## 5. 配置日志

Nginx 会记录访问日志和错误日志，默认情况下，它们存储在 `/var/log/nginx/access.log` 和 `/var/log/nginx/error.log` 文件中。你可以通过以下命令查看日志：

```bash
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
```

通过查看日志，开发者可以追踪应用的访问情况，及时发现潜在问题。

## 6. 启动 Nginx 自启动

为了确保 Nginx 在系统重启后自动启动，你可以启用 Nginx 自启动：

```bash
sudo systemctl enable nginx
```

## 7. 总结

在本章节中，我们学习了如何使用 Nginx 部署 Express 应用：

1. **安装和配置 Nginx**：通过 Nginx 作为反向代理，将请求转发到 Express 应用。
2. **配置反向代理**：使用 `proxy_pass` 配置将请求转发到运行在本地端口的 Express 应用。
3. **配置 HTTPS（可选）**：通过 Certbot 为 Nginx 配置 SSL 证书，实现 HTTPS 加密通信。
4. **日志管理**：使用 Nginx 访问日志和错误日志监控应用的运行状态。

通过使用 Nginx 部署 Express 应用，可以有效提升应用的性能、可靠性，并提供更多的功能，如负载均衡、SSL 加密等。在生产环境中，Nginx 是一个必不可少的 Web 服务器和反向代理工具。
