# nginx配置

配置文件[nginx.zip](http://10.8.0.4:4998/attachments/1)

## 引言

嗨，朋友们！今天我们要聊的主角，是 Web 服务器界的一颗璀璨明星 —— **Nginx**。如果你对这个名字不陌生，那肯定知道它有多厉害。全球超过三分之一的网站，包括 Netflix、Pinterest、Airbnb 这些流量巨兽，背后都有 Nginx 在默默支撑着。它就像一个轻量级的、高性能的“网站大管家”，既能当 Web 服务器，又能做反向代理，效率高到让你尖叫。

这次，我打算手把手教你如何在 **Ubuntu 22.04、24.04 乃至最新的 25.04** 系统上安装和配置 Nginx。别担心，这不仅仅是简单的安装步骤，我们会一起把防火墙设置、安全加固、性能优化，甚至一些常见问题的排查都搞定。跟着我，你会发现搭建一个高性能、安全的 Web 服务器，其实没那么难！

## <a class="reference-link" name="Nginx%EF%BC%9A%E4%BD%A0%E7%9A%84%E7%BD%91%E7%AB%99%E7%9A%84%E2%80%9C%E9%97%A8%E9%9D%A2%E2%80%9D%E5%92%8C%E2%80%9C%E5%A4%A7%E7%AE%A1%E5%AE%B6%E2%80%9D"></a>Nginx：你的网站的“门面”和“大管家”

在开始动手之前，我们先来快速看看通过这篇教程，你究竟能收获些什么“硬货”：

- **轻松安装与部署**：学会从 Ubuntu 官方软件源安装 Nginx，配置 `UFW` 防火墙规则，并验证安装是否成功。
- **服务管理得心应手**：掌握 `systemd` 命令，让你对 Nginx 服务的启停、重载、开机自启等操作了如指掌。
- **多站点托管秘籍**：通过配置 `Server Blocks`（Nginx 版的虚拟主机），在一台服务器上轻松托管多个域名。
- **安全防护升级**：应用一系列安全最佳实践，包括 `SSL/TLS` 证书（如 `Let's Encrypt`）、安全响应头、请求限速以及访问控制。
- **性能调优专家**：学会调整 `worker processes`、`connection limits`、缓存和 `Gzip` 压缩，让你的网站飞沙走石，速度爆表。
- **反向代理与负载均衡**：了解如何将 Nginx 设置为后端应用的 `Reverse Proxy`，甚至实现简单的负载均衡。
- **故障排除与日志分析**：学会查看 `access` 和 `error logs`，诊断常见问题，迅速定位并解决故障。
- **版本兼容性洞察**：理解 Ubuntu 22.04、24.04 和 25.04 在部署 Nginx 时的主要区别。
- **日常维护与监控**：建立备份机制，实施监控，并通过定期更新来保持服务器的健康状态。
- **生产环境准备**：最终目标是部署一个安全、优化且配置良好的 Nginx 服务器，能够从容应对生产环境的挑战！

是不是很期待？好啦，话不多说，我们这就开始吧！

## <a class="reference-link" name="%E9%83%A8%E7%BD%B2%E5%89%8D%E7%9A%84%E5%B0%8F%E5%87%86%E5%A4%87"></a>部署前的小准备

在正式开始 Nginx 的安装和配置之前，我们需要做一些基础准备工作，确保一切顺利进行。

你得准备好：

- **一台 Ubuntu 服务器**：可以是 Ubuntu 22.04 LTS、24.04 LTS 或者 25.04 的任意一台。如果你还没准备好，可以参考 DigitalOcean 的 [Ubuntu 服务器初始设置指南](https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu)。
- **一个非 root 用户**：并且这个用户拥有 `sudo` 权限。为了服务器的安全，我们通常不直接使用 `root` 用户进行日常操作。如果还没有，可以跟着 [如何在 Ubuntu 上创建具有 sudo 权限的用户](https://www.digitalocean.com/community/tutorials/how-to-create-a-new-sudo-enabled-user-on-ubuntu) 这篇教程来搞定。
- **一个域名（可选）**：如果你想配置 `Server Blocks` 或者 `SSL` 证书，那就需要一个域名。如果你用的是 DigitalOcean，可以看看 [DigitalOcean DNS 简介](https://www.digitalocean.com/community/tutorials/an-introduction-to-digitalocean-dns) 来了解如何设置。
- **基础的命令行操作知识**：知道怎么在终端里敲命令就行，不用特别精通。

都准备好了吗？那就用你的非 `root` 用户登录服务器，我们开始折腾！

### <a class="reference-link" name="Ubuntu%20%E7%89%88%E6%9C%AC%E5%85%BC%E5%AE%B9%E6%80%A7%E4%B8%80%E8%A7%88"></a>Ubuntu 版本兼容性一览

不同版本的 Ubuntu 会自带不同版本的 Nginx，虽然安装方法基本一致，但了解一下版本差异还是有好处的：

<div id="bkmrk-ubuntu-%E7%89%88%E6%9C%AC-nginx-%E7%89%88%E6%9C%AC-%E6%94%AF"><table><thead><tr><th>Ubuntu 版本</th><th>Nginx 版本</th><th>支持状态</th><th>备注</th></tr></thead><tbody><tr><td>Ubuntu 22.04 LTS</td><td>1.18.0+</td><td>完全支持</td><td>长期支持，直至 2027 年</td></tr><tr><td>Ubuntu 24.04 LTS</td><td>1.24.0+</td><td>完全支持</td><td>最新 LTS 版本，增强了安全性</td></tr><tr><td>Ubuntu 25.04</td><td>1.26.0+</td><td>完全支持</td><td>最新特性和性能改进，更适合尝鲜</td></tr></tbody></table>

</div>## <a class="reference-link" name="%E7%AC%AC%E4%B8%80%E6%AD%A5%EF%BC%9A%E5%AE%89%E8%A3%85%20Nginx%20%E2%80%94%E2%80%94%20%E8%BD%BB%E6%9D%BE%E6%90%9E%E5%AE%9A%EF%BC%81"></a>第一步：安装 Nginx —— 轻松搞定！

Nginx 在所有受支持的 Ubuntu 版本中都可以通过默认的软件源获取。我们将使用 `apt` 包管理系统来安装最新的稳定版本。

### <a class="reference-link" name="%E6%9B%B4%E6%96%B0%E4%BD%A0%E7%9A%84%E7%B3%BB%E7%BB%9F"></a>更新你的系统

在安装任何新软件之前，老规矩，先更新一下你的本地包索引和所有已安装的软件包，确保我们获取到的是最新、最稳定的版本：

```
sudo apt update
sudo apt upgrade -y

```

`apt update` 会刷新本地的包列表，而 `apt upgrade -y` 则会升级所有可升级的软件包，`-y` 参数是自动确认，省得你每次都按 `Y`。

### <a class="reference-link" name="%E5%AE%89%E8%A3%85%20Nginx"></a>安装 Nginx

现在，激动人心的时刻到了！用下面这行命令就能安装 Nginx：

```
sudo apt install nginx -y

```

如果系统提示你确认安装，直接敲 `Y` 回车就好。如果还问你是否要重启某些服务，也直接敲 `Enter` 接受默认设置即可。`apt` 会自动帮你安装 Nginx 及其所有必要的依赖项。

### <a class="reference-link" name="%E9%AA%8C%E8%AF%81%E5%AE%89%E8%A3%85%E6%98%AF%E5%90%A6%E6%88%90%E5%8A%9F"></a>验证安装是否成功

安装完成后，我们可以快速检查一下 Nginx 的版本，确保安装没问题：

```
nginx -v

```

你应该会看到类似这样的输出，这表示 Nginx 已经成功安装：

```
nginx version: nginx/1.24.0 (Ubuntu)

```

Copy

### <a class="reference-link" name="%E6%A3%80%E6%9F%A5%20Nginx%20%E6%9C%8D%E5%8A%A1%E7%8A%B6%E6%80%81"></a>检查 Nginx 服务状态

Nginx 安装完成后，Ubuntu 通常会自动启动它。为了确认 Nginx 服务已经在后台正常运行，我们可以使用 `systemd` 这个初始化系统来检查：

```
systemctl status nginx

```

如果一切正常，你会看到类似这样的输出，其中 `Active: active (running)` 最为关键，它表明 Nginx 正在愉快地运行着：

```
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2022-03-01 16:08:19 UTC; 3 days ago
     Docs: man:nginx(8)
 Main PID: 2369 (nginx)
    Tasks: 2 (limit: 1153)
   Memory: 3.5M
   CGroup: /system.slice/nginx.service
           ├─2369 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           └─2380 nginx: worker process

```

虽然 `systemctl` 已经告诉我们服务启动成功了，但最直接的验证方法是亲自从浏览器访问 Nginx 的默认页面。

如果你不确定服务器的公网 IP 地址，可以用 `icanhazip.com` 这个小工具快速获取：

```
curl -4 icanhazip.com

```

拿到你的服务器 IP 地址后，把它输入到你的浏览器地址栏：

```
http://你的服务器_IP

```

如果一切顺利，你将会看到 Nginx 的默认欢迎页面，通常长这样：

![Nginx default page](https://assets.digitalocean.com/articles/nginx_1604/default_page.png)

恭喜你！看到这个页面，就说明你的 Web 服务器已经成功启动并可以正常访问了。

## <a class="reference-link" name="%E7%AC%AC%E4%BA%8C%E6%AD%A5%EF%BC%9A%E9%98%B2%E7%81%AB%E5%A2%99%20UFW%20%E8%AE%BE%E7%BD%AE%20%E2%80%94%E2%80%94%20%E5%AE%89%E5%85%A8%E7%AC%AC%E4%B8%80%EF%BC%81"></a>第二步：防火墙 UFW 设置 —— 安全第一！

在让 Nginx 对外提供服务之前，**防火墙**是必须配置的“门卫”。想象一下，你的服务器就像一个家，防火墙就是大门。我们得告诉它，哪些人可以进来，哪些端口可以被访问。好在 Nginx 在安装时很贴心地在 `ufw` 中注册了自己，让我们的配置变得非常简单。

首先，我们来看看 `ufw` 知道哪些应用配置：

```
sudo ufw app list

```

你会看到类似这样的应用配置文件列表：

```
Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

```

这里有三个 Nginx 相关的配置文件：

- **Nginx Full**：这个配置文件会同时打开 80 端口（用于普通的未加密 HTTP 网页流量）和 443 端口（用于 `TLS/SSL` 加密的 HTTPS 流量）。
- **Nginx HTTP**：这个配置文件只打开 80 端口（用于普通的未加密 HTTP 网页流量）。
- **Nginx HTTPS**：这个配置文件只打开 443 端口（用于 `TLS/SSL` 加密的 HTTPS 流量）。
- **OpenSSH**: 这个是 SSH 服务，用来远程登录你的服务器。**友情提示：在配置防火墙时，一定要记得允许 `OpenSSH`，否则你可能会被自己锁在服务器外面！**

通常，我们建议你启用最严格的防火墙配置文件，只允许你实际需要的流量通过。现在，我们只需要允许 HTTP 流量（80 端口），所以选择 `Nginx HTTP` 就够了。

启用它：

```
sudo ufw allow 'Nginx HTTP'
# 别忘了，如果你之前没有允许过 OpenSSH，现在也把它加上！
sudo ufw allow 'OpenSSH'

```

你现在可以验证防火墙规则是否已生效：

```
sudo ufw status

```

输出会显示哪些 HTTP 流量被允许了：

```
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

```

看到 `Nginx HTTP` 和 `OpenSSH` 都显示为 `ALLOW` 了吗？这意味着你的网站对外开放了 HTTP 访问，同时你还能通过 SSH 登录管理服务器，安全又方便！

## <a class="reference-link" name="%E7%AC%AC%E4%B8%89%E6%AD%A5%EF%BC%9A%E6%A3%80%E6%9F%A5%E4%BD%A0%E7%9A%84%20Web%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%98%AF%E5%90%A6%E6%B4%BB%E8%B9%A6%E4%B9%B1%E8%B7%B3"></a>第三步：检查你的 Web 服务器是否活蹦乱跳

虽然我们已经在第二步中验证了 Nginx 服务是否运行，但再用最直接的方式确认一下，总没错！

Nginx 安装完成后，Ubuntu 就会自动启动它，所以理论上，你的 Web 服务器现在应该已经处于运行状态了。

我们已经用 `systemctl status nginx` 确认过了服务的后台状态。现在，让我们直接通过浏览器访问你的服务器 IP 地址，看看 Nginx 的欢迎页面能不能正常显示。

如果你不确定服务器的公共 IP 地址，可以像之前一样，使用 `curl -4 icanhazip.com` 命令来获取。

拿到 IP 后，在你的浏览器地址栏输入：

```
http://你的_服务器_IP

```

Copy

比如 `http://203.0.113.1`。

如果一切顺利，你将再次看到 Nginx 默认的“Welcome to Nginx!”页面。这就像是 Nginx 在跟你打招呼，告诉你：“我准备好为你服务了！”

看到这个页面就说明 Nginx 已经成功部署，并且可以正常地通过互联网访问，随时准备好承载你的网站内容了。

## <a class="reference-link" name="%E7%AC%AC%E5%9B%9B%E6%AD%A5%EF%BC%9A%E7%AE%A1%E7%90%86%20Nginx%20%E8%BF%9B%E7%A8%8B%20%E2%80%94%E2%80%94%20%E9%9A%8F%E5%BF%83%E6%89%80%E6%AC%B2"></a>第四步：管理 Nginx 进程 —— 随心所欲

现在你的 Web 服务器已经上线了，接下来学习一些基本的管理命令，让你能像驾驭一匹骏马一样，灵活控制 Nginx。这些命令主要通过 `systemctl` 来操作 `systemd` 服务管理系统。

**停止你的 Web 服务器：**

当你需要暂时关闭 Nginx 服务时，比如进行维护或者升级，可以使用这个命令：

```
sudo systemctl stop nginx

```

**启动已停止的 Web 服务器：**

当 Nginx 停止后，你需要重新启动它时：

```
sudo systemctl start nginx

```

**停止后再启动服务（重启）：**

这是一个常用的命令，当你修改了 Nginx 的配置后，通常需要重启服务来应用这些改动。它会先停止服务，再重新启动：

```
sudo systemctl restart nginx

```

**重新加载配置（不中断连接）：**

Nginx 最酷的功能之一是，当你只修改了配置文件（而不是 Nginx 本身的核心功能）时，它可以**无缝重新加载配置，而不会中断现有的用户连接**。这对于生产环境中的网站来说至关重要，用户根本感觉不到服务有任何中断！

```
sudo systemctl reload nginx

```

**禁止 Nginx 开机自启：**

默认情况下，Nginx 会被配置成在服务器启动时自动运行。如果你不希望它这样做，比如你只在特定时间运行服务，或者有其他启动顺序要求，可以禁用这个行为：

```
sudo systemctl disable nginx

```

**重新启用 Nginx 开机自启：**

如果你改变了主意，想让 Nginx 再次在开机时自动启动，可以重新启用服务：

```
sudo systemctl enable nginx

```

掌握了这些基本的管理命令，你就有了驾驭 Nginx 的能力。接下来，我们将学习如何配置 `Server Blocks`，让一台服务器承载多个网站！

## <a class="reference-link" name="%E7%AC%AC%E4%BA%94%E6%AD%A5%EF%BC%9A%E9%85%8D%E7%BD%AE%20Server%20Blocks%EF%BC%88%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA%EF%BC%89%E2%80%94%E2%80%94%20%E4%B8%80%E5%8F%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%8C%E5%A4%9A%E4%B8%AA%E7%BD%91%E7%AB%99%EF%BC%81"></a>第五步：配置 Server Blocks（虚拟主机）—— 一台服务器，多个网站！

想象一下，你的服务器就像一栋公寓楼，而 `Server Blocks`（在 Apache 中我们叫它虚拟主机 `virtual hosts`）就是这栋楼里的不同房间。每个房间都可以住进一个不同的“租客”（网站），拥有自己独立的配置和内容，但都共享同一栋楼的资源。

我们将以一个叫做 **`your_domain`** 的域名为例进行设置，但在实际操作中，你**务必将其替换为你自己的真实域名**。

在 Ubuntu 22.04 上，Nginx 默认会启用一个 `Server Block`，它的文档根目录在 `/var/www/html`。对于单个网站来说，这很方便。但如果你想托管多个网站，直接修改这个目录就会变得很混乱。所以，我们的策略是：保留 `/var/www/html` 作为默认的“备用”目录（当用户的请求不匹配任何其他网站时），然后为我们的 `your_domain` 网站在 `/var/www` 下创建一个新的、独立的目录结构。

### <a class="reference-link" name="1.%20%E5%88%9B%E5%BB%BA%E7%BD%91%E7%AB%99%E7%9B%AE%E5%BD%95"></a>1. 创建网站目录

首先，为你的域名创建一个目录结构，`html` 子目录是存放网站文件的标准位置。`-p` 参数会确保所有必要的父目录都被创建：

```
sudo mkdir -p /var/www/your_domain/html

```

### <a class="reference-link" name="2.%20%E5%88%86%E9%85%8D%E7%9B%AE%E5%BD%95%E6%89%80%E6%9C%89%E6%9D%83"></a>2. 分配目录所有权

接下来，我们需要将这个新目录的所有权分配给你的当前用户（`$USER` 环境变量代表你当前登录的用户名）。这样你就可以在不需要 `sudo` 的情况下，轻松地在其中创建、修改文件：

```
sudo chown -R $USER:$USER /var/www/your_domain/html

```

### <a class="reference-link" name="3.%20%E8%AE%BE%E7%BD%AE%E7%9B%AE%E5%BD%95%E6%9D%83%E9%99%90"></a>3. 设置目录权限

为了确保 Web 服务器能够读取文件，同时保证安全，我们需要设置合适的目录权限。`755` 权限意味着所有者拥有读、写、执行的完整权限，而用户组和其他人只有读和执行的权限。

```
sudo chmod -R 755 /var/www/your_domain

```

### <a class="reference-link" name="4.%20%E5%88%9B%E5%BB%BA%E7%A4%BA%E4%BE%8B%20<code>index.html</code>%20%E6%96%87%E4%BB%B6"></a>4. 创建示例 `index.html` 文件

现在，我们来为 `your_domain` 创建一个简单的 `index.html` 页面。你可以用 `nano` 或你喜欢的任何文本编辑器：

```
nano /var/www/your_domain/html/index.html

```

在文件中添加以下 `HTML` 内容。别忘了把 `your_domain` 替换成你的实际域名：

```

<html>
    <head>
        <title>欢迎来到 your_domain!</title>
    </head>
    <body>
        <h1>恭喜！ your_domain 的 Server Block 运行成功！</h1>
        <p>这是你的自定义网站页面。</p>
    </body>
</html>

```

保存并关闭文件。在 `nano` 中，按 `Ctrl+X`，然后按 `Y` 确认保存，最后按 `Enter`。

### <a class="reference-link" name="5.%20%E5%88%9B%E5%BB%BA%E6%96%B0%E7%9A%84%20<code>Server%20Block</code>%20%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6"></a>5. 创建新的 `Server Block` 配置文件

为了让 Nginx 知道如何处理 `your_domain` 的请求，我们需要创建一个专门的 `Server Block` 配置文件。我们不会直接修改默认配置，而是在 `/etc/nginx/sites-available/` 目录下创建新文件：

```
sudo nano /etc/nginx/sites-available/your_domain

```

粘贴以下配置代码块。这个配置与默认的类似，但我们更新了 `root` 目录和 `server_name`：

```
server {
        listen 80;
        listen [::]:80;

        root /var/www/your_domain/html;
        index index.html index.htm index.nginx-debian.html;

        server_name your_domain www.your_domain;

        location / {
                try_files $uri $uri/ =404;
        }
}

```

这里简单解释一下：

- `listen 80;`：Nginx 监听 80 端口，处理 HTTP 请求。`listen [::]:80;` 确保也监听 IPv6 地址。
- `root /var/www/your_domain/html;`：指定网站文件的根目录。
- `index index.html ...;`：定义当访问目录时，Nginx 尝试加载的文件名顺序。
- `server_name your_domain www.your_domain;`：指定这个 `Server Block` 会响应哪些域名请求。
- `location / {}`：定义了请求如何路由。`try_files $uri $uri/ =404;` 表示 Nginx 会尝试查找与 `URI` 匹配的文件，如果没有找到文件就查找目录，如果都找不到，则返回 404 错误。

### <a class="reference-link" name="6.%20%E5%90%AF%E7%94%A8%20<code>Server%20Block</code>"></a>6. 启用 `Server Block`

现在，我们的新 `Server Block` 配置文件还在 `sites-available` 目录里，Nginx 默认不会读取它。我们需要通过创建一个**符号链接（symlink）**，把它“链接”到 `sites-enabled` 目录，Nginx 在启动时会读取这个目录下的所有配置文件：

```
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

```

> **小贴士**：符号链接就像是文件系统里的“快捷方式”。这样做的好处是，你可以轻松地禁用一个 `Server Block`（只需删除 `sites-enabled` 里的链接），而不用删除原始的配置文件，以后想再启用时很方便。

现在，你的 Nginx 服务器上有了两个活跃的 `Server Block`：

- `your_domain`：响应 `your_domain` 和 `www.your_domain` 的请求。
- `default`：如果任何请求不匹配 `your_domain` 的 `Server Block`，它会由默认的 `Server Block` 来处理（通常是 `/var/www/html` 里的内容）。

### <a class="reference-link" name="7.%20%E8%B0%83%E6%95%B4%20<code>nginx.conf</code>%20%E6%96%87%E4%BB%B6"></a>7. 调整 `nginx.conf` 文件

为了避免潜在的 `hash bucket memory` 问题（当有大量 `server_name` 时可能出现），我们还需要稍微调整一下主配置文件 `/etc/nginx/nginx.conf`。

打开这个文件：

```
sudo nano /etc/nginx/nginx.conf

```

在 `http { ... }` 配置块内，找到 `server_names_hash_bucket_size` 这行。它可能被注释掉了（前面有一个 `#` 符号）。我们需要取消注释，并确保它的值是 `64`：

```
...
http {
    ...
    server_names_hash_bucket_size 64; # 移除前面的 # 号
    ...
}
...

```

> **小贴士**：在配置文件中，用 `#` 符号注释掉一行代码是禁用它的常见做法，同时也能作为文档说明。很多配置文件会预留一些注释掉的选项，方便用户根据需求启用或禁用。

保存并关闭文件。

### <a class="reference-link" name="8.%20%E6%B5%8B%E8%AF%95%E9%85%8D%E7%BD%AE%E5%B9%B6%E9%87%8D%E5%90%AF%20Nginx"></a>8. 测试配置并重启 Nginx

在重启 Nginx 之前，**强烈建议**你先测试一下配置文件的语法是否正确，避免因为手误导致服务启动失败：

```
sudo nginx -t

```

如果没有任何语法错误，你会看到 `syntax is ok` 和 `test is successful` 的提示。如果出现错误，请仔细检查你刚才修改的文件。

测试通过后，重启 Nginx 服务，让新的 `Server Block` 生效：

```
sudo systemctl restart nginx

```

现在，Nginx 应该已经开始为你的域名提供服务了。打开你的浏览器，访问 `http://your_domain`（再次强调，替换成你的实际域名），你应该会看到你刚才创建的那个“恭喜！”页面。

![Nginx first server block](https://assets.digitalocean.com/articles/how-to-install-nginx-u18.04/your-domain-server-block-nginx.PNG)

是不是很酷？你已经成功在一台服务器上部署了你的第一个自定义网站！

## <a class="reference-link" name="%E7%AC%AC%E5%85%AD%E6%AD%A5%EF%BC%9A%E5%AE%89%E5%85%A8%E5%8A%A0%E5%9B%BA%E4%B8%8E%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%20%E2%80%94%E2%80%94%20%E8%AE%A9%E4%BD%A0%E7%9A%84%E7%BD%91%E7%AB%99%E5%8F%88%E5%BF%AB%E5%8F%88%E5%AE%89%E5%85%A8%EF%BC%81"></a>第六步：安全加固与性能优化 —— 让你的网站又快又安全！

网站上线了，但我们不能止步于此。一个优秀的 Web 服务器不仅要能正常工作，更要又快又安全。这一步，我们将为 Nginx 进行一些生产环境级别的安全加固和性能优化。

### <a class="reference-link" name="%E5%9F%BA%E7%A1%80%E5%AE%89%E5%85%A8%E9%85%8D%E7%BD%AE"></a>基础安全配置

编辑 Nginx 的主配置文件：

```
sudo nano /etc/nginx/nginx.conf

```

在 `http { ... }` 配置块内，添加以下安全相关的指令。它们能有效提高服务器的安全性，抵御一些常见的攻击：

```
# 隐藏 Nginx 版本信息，避免暴露服务器软件版本给攻击者
server_tokens off;

# 添加安全响应头，防止常见的 Web 漏洞
# X-Frame-Options: 防止点击劫持 (Clickjacking) 攻击
add_header X-Frame-Options "SAMEORIGIN" always;
# X-XSS-Protection: 启用浏览器内置的 XSS 防护
add_header X-XSS-Protection "1; mode=block" always;
# X-Content-Type-Options: 防止 MIME 类型嗅探攻击
add_header X-Content-Type-Options "nosniff" always;
# Referrer-Policy: 控制浏览器发送 Referer 头的信息
add_header Referrer-Policy "no-referrer-when-downgrade" always;
# Content-Security-Policy: 内容安全策略，限制可加载的资源来源，大大减少 XSS 风险
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;

# 再次确认隐藏 Nginx 版本信息 (防止某些模块覆盖)
server_tokens off;

# 限制客户端请求体大小，防止恶意大文件上传导致服务器资源耗尽
client_max_body_size 10M; # 例如，限制为 10MB

# 超时设置，防止慢速攻击和资源占用
client_body_timeout 12s;    # 客户端发送请求体超时
client_header_timeout 12s;  # 客户端发送请求头超时
keepalive_timeout 15s;      # 长连接保持时间
send_timeout 10s;           # 服务器向客户端发送响应超时

```

### <a class="reference-link" name="%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E7%A7%98%E7%B1%8D"></a>性能优化秘籍

同样在 `/etc/nginx/nginx.conf` 文件中，添加以下性能优化配置。它们能帮助 Nginx 更高效地处理请求：

```
# Worker 进程数量 (根据你的 CPU 核心数进行调整)
# auto 表示 Nginx 会自动检测 CPU 核心数并设置相应数量的 worker 进程
worker_processes auto;

# Worker 连接设置
events {
    # 每个 worker 进程可以处理的最大并发连接数
    worker_connections 1024;
    # 使用高效的 I/O 多路复用机制，epoll 是 Linux 上的首选
    use epoll;
    # 允许 worker 进程一次性接受多个新连接
    multi_accept on;
}

# Gzip 压缩，显著减少传输数据量，加快页面加载速度
gzip on;
# 告诉代理服务器根据 Vary: Accept-Encoding 头来缓存压缩内容
gzip_vary on;
# 对所有代理请求的响应进行压缩
gzip_proxied any;
# 压缩级别，1（最低）到 9（最高），6 是一个很好的平衡点
gzip_comp_level 6;
# 定义哪些 MIME 类型的文件需要进行 Gzip 压缩
gzip_types
    text/plain
    text/css
    text/xml
    text/javascript
    application/json
    application/javascript
    application/xml+rss
    application/atom+xml
    image/svg+xml;

```

### <a class="reference-link" name="%E6%B5%8B%E8%AF%95%E5%B9%B6%E5%BA%94%E7%94%A8%E9%85%8D%E7%BD%AE"></a>测试并应用配置

修改完配置文件后，老规矩，先测试语法，再重载 Nginx。

**测试配置：**

```
sudo nginx -t

```

**如果测试通过，重载 Nginx：**

```
sudo systemctl reload nginx

```

### <a class="reference-link" name="SSL/TLS%20%E8%AF%81%E4%B9%A6%E5%87%86%E5%A4%87"></a>SSL/TLS 证书准备

为了让你的网站支持 `HTTPS`，并启用 `Nginx HTTPS` 防火墙规则，你需要安装 `SSL/TLS` 证书。`Let's Encrypt` 提供免费且自动化的证书。

**安装 Certbot 工具：**

`Certbot` 是一个可以自动为 Nginx 获取和配置 `Let's Encrypt` 证书的工具。

```
# 安装 Certbot 及其 Nginx 插件
sudo apt install certbot python3-certbot-nginx -y

# 检查 Certbot 是否正常工作
sudo certbot --version

```

看到 `Certbot` 的版本号，就说明工具安装成功了。下一步就是使用它来为你的域名生成和配置证书。

通过这些安全加固和性能优化，你的 Nginx 服务器现在不仅更安全，而且能提供更快的用户体验。棒极了！

## <a class="reference-link" name="%E7%AC%AC%E4%B8%83%E6%AD%A5%EF%BC%9ANginx%20%E9%82%A3%E4%BA%9B%E9%87%8D%E8%A6%81%E7%9A%84%E6%96%87%E4%BB%B6%E5%92%8C%E7%9B%AE%E5%BD%95"></a>第七步：Nginx 那些重要的文件和目录

既然你已经和 Nginx 混熟了，了解它的一些“内部构造”会让你在管理和排查问题时事半功倍。Nginx 在 Ubuntu 上有一些关键的目录和文件，就像是它的“说明书”和“日记本”。

### <a class="reference-link" name="%E5%86%85%E5%AE%B9%E6%96%87%E4%BB%B6"></a>内容文件

- `/var/www/html`：这是 Nginx 默认的 Web 根目录。你之前看到的那个“Welcome to Nginx!”页面就存放在这里。当然，我们自己创建的 `Server Block` 会有自己的 `root` 目录，比如 `/var/www/your_domain/html`。
- **你自己的网站目录**：例如 `/var/www/your_domain/html`，这里存放着你的网站的所有 `HTML`、`CSS`、`JavaScript` 和图片等文件。

### <a class="reference-link" name="%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%85%8D%E7%BD%AE"></a>服务器配置

- `/etc/nginx`：这是 Nginx 的主配置目录，所有的 Nginx 配置文件都住在这里。
- `/etc/nginx/nginx.conf`：Nginx 的**主配置文件**。你可以在这里修改 Nginx 的全局配置，比如 `worker_processes`、`gzip` 设置、`server_names_hash_bucket_size` 等。
- `/etc/nginx/sites-available/`：这个目录存放着所有**可用的 `Server Blocks` 配置文件**。你可以为每个网站创建一个独立的配置文件放在这里。Nginx 不会直接使用这些文件，除非它们被“链接”到 `sites-enabled` 目录。
- `/etc/nginx/sites-enabled/`：这个目录存放着所有**已启用的 `Server Blocks` 配置文件**。它们通常是通过符号链接指向 `sites-available` 目录下的文件。Nginx 在启动时会加载并执行这个目录中的所有配置。
- `/etc/nginx/snippets`：这个目录包含一些**配置片段**。如果你有一些重复出现的配置（比如 `SSL` 设置、安全响应头），可以把它们抽象成一个片段文件，然后在多个 `Server Blocks` 中引用，保持配置的整洁和可维护性。

### <a class="reference-link" name="%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%97%A5%E5%BF%97"></a>服务器日志

- `/var/log/nginx/access.log`：这是 Nginx 的**访问日志**。每一次用户对你网站的访问请求，无论成功与否，都会被记录在这个文件里。它包含了访问者的 IP、请求时间、请求方法、`URL`、状态码、响应大小等信息，是分析网站流量和用户行为的重要数据源。
- `/var/log/nginx/error.log`：这是 Nginx 的**错误日志**。任何 Nginx 自身运行时的错误、配置错误或者请求处理中的异常，都会被记录在这里。当你的网站出现问题时，查看这个日志文件是排查故障的第一步，它会告诉你发生了什么，在哪里发生了。

熟悉这些文件和目录，能让你在管理 Nginx 时更加得心应手，遇到问题也能快速找到线索，解决它们。

## <a class="reference-link" name="Nginx%20%E5%AE%89%E5%85%A8%E5%B0%8F%E8%B4%B4%E5%A3%AB%EF%BC%9A%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E4%B8%8E%E5%AE%9E%E8%B7%B5"></a>Nginx 安全小贴士：常见问题与实践

保障 Web 服务器的安全就像给你的网站穿上一层厚厚的盔甲。以下是一些 Nginx 安全加固的实践和常见问题，希望能帮到你：

### <a class="reference-link" name="Nginx%20%E5%AE%89%E5%85%A8%E5%AE%9E%E8%B7%B5%E6%B8%85%E5%8D%95"></a>Nginx 安全实践清单

<div id="bkmrk-%E5%AE%89%E5%85%A8%E5%AE%9E%E8%B7%B5-%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F-%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%2F%E9%85%8D%E7%BD%AE-%E4%BC%98%E5%85%88"><table><thead><tr><th>安全实践</th><th>实现方式</th><th>常用命令/配置</th><th>优先级</th></tr></thead><tbody><tr><td>**保持 Nginx 更新**</td><td>定期更新 Nginx 及系统软件包</td><td>`sudo apt update && sudo apt upgrade nginx`</td><td>高</td></tr><tr><td>**配置防火墙**</td><td>使用 `UFW` 限制只开放必要端口</td><td>`sudo ufw allow 'Nginx Full'`</td><td>高</td></tr><tr><td>**启用 SSL/TLS**</td><td>使用 `Let's Encrypt` 安装 `SSL` 证书</td><td>`sudo certbot --nginx -d your_domain.com`</td><td>高</td></tr><tr><td>**隐藏服务器信息**</td><td>阻止 Nginx 版本泄露</td><td>在 `/etc/nginx/nginx.conf` 中添加 `server_tokens off;`</td><td>中</td></tr><tr><td>**安全响应头**</td><td>添加安全响应头，防止常见攻击</td><td>在 `server block` 中添加（见下方示例）</td><td>中</td></tr><tr><td>**请求限速**</td><td>配置 `rate limiting`，抵御 `DDoS` 和暴力破解攻击</td><td>配置 `limit_req_zone` 和 `limit_req`</td><td>中</td></tr><tr><td>**强认证**</td><td>为管理界面使用强密码</td><td>实施 HTTP 基本认证或 `OAuth`</td><td>中</td></tr><tr><td>**定期备份**</td><td>备份 Nginx 配置和网站内容</td><td>`sudo cp -r /etc/nginx /backup/nginx-$(date +%Y%m%d)`</td><td>中</td></tr><tr><td>**访问控制**</td><td>限制对敏感目录的访问</td><td>使用 `deny all;` 或 IP 白名单</td><td>低</td></tr><tr><td>**日志监控**</td><td>监控访问和错误日志，发现可疑活动</td><td>`sudo tail -f /var/log/nginx/error.log`</td><td>低</td></tr></tbody></table>

</div>### <a class="reference-link" name="%E7%A4%BA%E4%BE%8B%EF%BC%9A%E5%AE%89%E5%85%A8%E5%93%8D%E5%BA%94%E5%A4%B4%E9%85%8D%E7%BD%AE"></a>示例：安全响应头配置

为了进一步增强安全性，你可以在 `Server Block` 中添加这些响应头，它们可以有效防止一些常见的 Web 漏洞：

```
server {
    ...
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;
    add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
    ...
}

```

### <a class="reference-link" name="%E7%A4%BA%E4%BE%8B%EF%BC%9A%E8%AF%B7%E6%B1%82%E9%99%90%E9%80%9F%E9%85%8D%E7%BD%AE"></a>示例：请求限速配置

请求限速是抵御 `DDoS` 攻击和暴力破解的有效手段。你可以在 `http` 块中定义一个限速区域，然后在 `Server Block` 或 `location` 块中应用它。

**第一步：在 `/etc/nginx/nginx.conf` 的 `http` 块中定义限速区域：**

```
http {
    ...
    # 定义一个名为 'one' 的限速区域，大小 10MB，每秒处理 1 个请求
    # $binary_remote_addr 用来识别客户端 IP 地址
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    ...
}

```

**第二步：在你的 `Server Block` 或 `location` 块中应用这个限速区域：**

```
server {
    ...
    # 对所有请求应用名为 'one' 的限速规则
    # burst=5 表示允许在短时间内突发 5 个请求，然后才开始限速
    # nodelay 表示不延迟处理突发请求，但超出突发限制的请求会被直接拒绝
    location / {
        limit_req zone=one burst=5 nodelay;
        try_files $uri $uri/ =404;
    }
    ...
}

```

## <a class="reference-link" name="%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%20Q&A"></a>常见问题 Q&amp;A

我们整理了一些 Nginx 相关的常见问题，并提供了简明扼要的答案，希望对你有帮助。

### <a class="reference-link" name="1.%20%E5%A6%82%E4%BD%95%E5%90%AF%E5%8A%A8%E3%80%81%E5%81%9C%E6%AD%A2%E5%92%8C%E7%AE%A1%E7%90%86%20Nginx%20%E6%9C%8D%E5%8A%A1%EF%BC%9F"></a>1. 如何启动、停止和管理 Nginx 服务？

管理 Nginx 服务主要依赖 `systemctl` 命令：

```
# 启动 Nginx
sudo systemctl start nginx

# 停止 Nginx
sudo systemctl stop nginx

# 重启 Nginx (先停止再启动)
sudo systemctl restart nginx

# 重新加载配置 (不停止服务，不中断连接)
sudo systemctl reload nginx

# 设置 Nginx 开机自启
sudo systemctl enable nginx

# 禁用 Nginx 开机自启
sudo systemctl disable nginx

```

### <a class="reference-link" name="2.%20%E6%80%8E%E4%B9%88%E6%A3%80%E6%9F%A5%20Nginx%20%E6%98%AF%E5%90%A6%E6%AD%A3%E5%9C%A8%E8%BF%90%E8%A1%8C%EF%BC%9F"></a>2. 怎么检查 Nginx 是否正在运行？

你可以通过多种方式确认 Nginx 的运行状态：

```
# 检查服务状态（最常用）
sudo systemctl status nginx

# 检查 Nginx 是否监听了端口（比如 80 或 443）
sudo netstat -tlnp | grep nginx

# 测试 Nginx 配置文件语法是否正确
sudo nginx -t

# 查看 Nginx 进程
ps aux | grep nginx

```

### <a class="reference-link" name="3.%20%E5%A6%82%E4%BD%95%E4%B8%BA%20Nginx%20%E9%85%8D%E7%BD%AE%20UFW%20%E9%98%B2%E7%81%AB%E5%A2%99%EF%BC%9F"></a>3. 如何为 Nginx 配置 UFW 防火墙？

`UFW` 为 Nginx 提供了三种预设的配置文件，你可以根据需求选择：

```
    # 只允许 HTTP 流量 (端口 80)
    sudo ufw allow 'Nginx HTTP'

    # 只允许 HTTPS 流量 (端口 443)
    sudo ufw allow 'Nginx HTTPS'

    # 同时允许 HTTP 和 HTTPS 流量
    sudo ufw allow 'Nginx Full'

    # 检查 UFW 防火墙状态
    sudo ufw status

```

### <a class="reference-link" name="4.%20Ubuntu%20%E4%B8%8A%20Nginx%20%E7%9A%84%E9%BB%98%E8%AE%A4%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E5%9C%A8%E5%93%AA%EF%BC%9F"></a>4. Ubuntu 上 Nginx 的默认配置文件在哪？

- **主配置文件**：`/etc/nginx/nginx.conf`
- **可用站点配置**：`/etc/nginx/sites-available/` (存放所有站点配置，待启用)
- **已启用站点配置**：`/etc/nginx/sites-enabled/` (通过符号链接指向 `sites-available` 中的配置)
- **默认站点配置**：`/etc/nginx/sites-available/default` (Nginx 默认的站点配置)

### <a class="reference-link" name="5.%20%E5%A6%82%E4%BD%95%E5%B0%86%20Nginx%20%E9%85%8D%E7%BD%AE%E4%B8%BA%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%EF%BC%9F"></a>5. 如何将 Nginx 配置为反向代理？

在 `/etc/nginx/sites-available/your-domain` 站点配置中，你可以这样设置一个反向代理，将请求转发到本地的 `3000` 端口的后端应用：

```
    server {
        listen 80;
        server_name your-domain.com;

        location / {
            # 将请求转发到 http://localhost:3000
            proxy_pass http://localhost:3000;
            # 传递客户端的原始 Host 头
            proxy_set_header Host $host;
            # 传递客户端的真实 IP 地址
            proxy_set_header X-Real-IP $remote_addr;
            # 传递客户端请求的代理路径
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            # 传递原始请求的协议 (HTTP 或 HTTPS)
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

```

### <a class="reference-link" name="6.%20Nginx%20%E6%8A%A5%E9%94%99%E4%BA%86%E6%80%8E%E4%B9%88%E5%8A%9E%EF%BC%9F"></a>6. Nginx 报错了怎么办？

遇到 Nginx 错误时，可以按以下步骤排查：

```
    # 测试配置文件语法，通常能发现大部分配置问题
    sudo nginx -t

    # 查看 Nginx 错误日志，这是排查问题最重要的信息来源
    sudo tail -f /var/log/nginx/error.log

    # 查看 Nginx 访问日志，了解请求是否到达 Nginx 以及响应状态
    sudo tail -f /var/log/nginx/access.log

    # 查看系统日志中 Nginx 服务的相关信息
    sudo journalctl -u nginx -f

    # 验证端口绑定情况，检查是否有其他服务占用了 80 或 443 端口
    sudo netstat -tlnp | grep :80

```

### <a class="reference-link" name="7.%20Ubuntu%2022.04%E3%80%8124.04%20%E5%92%8C%2025.04%20%E5%AF%B9%20Nginx%20%E6%9C%89%E5%95%A5%E5%8C%BA%E5%88%AB%EF%BC%9F"></a>7. Ubuntu 22.04、24.04 和 25.04 对 Nginx 有啥区别？

主要区别体现在 Nginx 版本、支持周期以及一些功能特性上：

<div id="bkmrk-%E7%89%B9%E6%80%A7-ubuntu-22.04-ubun"><table><thead><tr><th>特性</th><th>Ubuntu 22.04</th><th>Ubuntu 24.04</th><th>Ubuntu 25.04</th></tr></thead><tbody><tr><td>Nginx 版本</td><td>1.18.0+</td><td>1.24.0+</td><td>1.26.0+</td></tr><tr><td>支持周期</td><td>2027 年</td><td>2029 年</td><td>2026 年</td></tr><tr><td>安全更新</td><td>标准</td><td>增强</td><td>最新</td></tr><tr><td>性能</td><td>良好</td><td>更好</td><td>最佳</td></tr><tr><td>新功能与特性</td><td>基础</td><td>高级</td><td>最前沿</td></tr></tbody></table>

</div>通常来说，`LTS` 版本（如 22.04 和 24.04）提供更长的支持周期和稳定性，更适合生产环境；而非 `LTS` 版本（如 25.04）则能让你更快地体验到 Nginx 的最新功能和性能改进。

## <a class="reference-link" name="%E6%80%BB%E7%BB%93%E4%B8%8E%E5%B1%95%E6%9C%9B"></a>总结与展望

朋友们，到这里，你已经成功在 Ubuntu 22.04、24.04 或 25.04 系统上安装并配置了一个功能完善的 Nginx Web 服务器。我们从最开始的安装，到配置防火墙，再到 Nginx 服务的管理，甚至连搭建 `Server Blocks`、安全加固和性能优化都一一攻克了。现在，你的 Web 服务器已经准备好，可以托管你的网站、充当反向代理、实现负载均衡，甚至处理高并发的应用请求了。

理解不同 Ubuntu 版本与 Nginx 的兼容性，也能帮助你为自己的项目做出明智的部署决策。通过我们一起学习的安全措施和性能调优选项，你的 Nginx 服务器在生产环境中将保持稳定、安全和高效。

这只是 Nginx 强大功能的冰山一角，Web 世界还有很多有趣的等着你去探索！

### <a class="reference-link" name="%E4%B8%8B%E4%B8%80%E6%AD%A5%EF%BC%8C%E4%BD%A0%E5%8F%AF%E4%BB%A5%E7%BB%A7%E7%BB%AD%E6%8E%A2%E7%B4%A2%EF%BC%9A"></a>下一步，你可以继续探索：

- **LEMP 栈**：搭建完整的应用环境，学习如何在 Ubuntu 上安装 `Linux`、`Nginx`、`MySQL` 和 `PHP` (`LEMP` 栈)。你可以参考：[How To Install Linux, Nginx, MySQL, PHP (LEMP stack) on Ubuntu](https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-22-04)
- **SSL/TLS 设置**：使用 `Let's Encrypt` 为你的网站添加 `HTTPS` 加密，让网站更安全、更受信任：[How To Secure Nginx with Let’s Encrypt on Ubuntu](https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-22-04)
- **反向代理进阶**：深入了解如何将 Nginx 配置为应用程序的反向代理，为你的 `Node.js`、`Python` 或其他后端服务提供强大的前端支持：[Nginx as a reverse proxy for your applications](https://www.digitalocean.com/community/tutorials/how-to-configure-nginx-as-a-reverse-proxy-on-ubuntu-22-04)

不断学习，不断实践，你会在 DevOps 和 Web 开发的道路上越走越远，成为一名真正的“服务器魔法师”！

</body></html>