在 Ubuntu 上安装 Nginx:从入门到精通,打造高性能安全网站

本教程将带你一步步在 Ubuntu 22.04、24.04 和 25.04 上安装、配置 Nginx。从防火墙设置到安全加固,再到性能优化,助你轻松搭建高性能、安全的 Web 服务器!

阅读时长: 20 分钟
共 9598字
作者: eimoon.com

引言

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

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

Nginx:你的网站的“门面”和“大管家”

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

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

是不是很期待?好啦,话不多说,我们这就开始吧!

部署前的小准备

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

你得准备好:

  • 一台 Ubuntu 服务器:可以是 Ubuntu 22.04 LTS、24.04 LTS 或者 25.04 的任意一台。如果你还没准备好,可以参考 DigitalOcean 的 Ubuntu 服务器初始设置指南
  • 一个非 root 用户:并且这个用户拥有 sudo 权限。为了服务器的安全,我们通常不直接使用 root 用户进行日常操作。如果还没有,可以跟着 如何在 Ubuntu 上创建具有 sudo 权限的用户 这篇教程来搞定。
  • 一个域名(可选):如果你想配置 Server Blocks 或者 SSL 证书,那就需要一个域名。如果你用的是 DigitalOcean,可以看看 DigitalOcean DNS 简介 来了解如何设置。
  • 基础的命令行操作知识:知道怎么在终端里敲命令就行,不用特别精通。

都准备好了吗?那就用你的非 root 用户登录服务器,我们开始折腾!

Ubuntu 版本兼容性一览

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

Ubuntu 版本 Nginx 版本 支持状态 备注
Ubuntu 22.04 LTS 1.18.0+ 完全支持 长期支持,直至 2027 年
Ubuntu 24.04 LTS 1.24.0+ 完全支持 最新 LTS 版本,增强了安全性
Ubuntu 25.04 1.26.0+ 完全支持 最新特性和性能改进,更适合尝鲜

第一步:安装 Nginx —— 轻松搞定!

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

更新你的系统

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

sudo apt update
sudo apt upgrade -y

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

安装 Nginx

现在,激动人心的时刻到了!用下面这行命令就能安装 Nginx:

sudo apt install nginx -y

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

验证安装是否成功

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

nginx -v

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

nginx version: nginx/1.24.0 (Ubuntu)

检查 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

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

第二步:防火墙 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 HTTPOpenSSH 都显示为 ALLOW 了吗?这意味着你的网站对外开放了 HTTP 访问,同时你还能通过 SSH 登录管理服务器,安全又方便!

第三步:检查你的 Web 服务器是否活蹦乱跳

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

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

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

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

拿到 IP 后,在你的浏览器地址栏输入:

http://你的_服务器_IP

比如 http://203.0.113.1

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

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

第四步:管理 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,让一台服务器承载多个网站!

第五步:配置 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 下创建一个新的、独立的目录结构。

1. 创建网站目录

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

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

2. 分配目录所有权

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

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

3. 设置目录权限

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

sudo chmod -R 755 /var/www/your_domain

4. 创建示例 index.html 文件

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

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

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

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

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

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 错误。

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_domainwww.your_domain 的请求。
  • default:如果任何请求不匹配 your_domainServer Block,它会由默认的 Server Block 来处理(通常是 /var/www/html 里的内容)。

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; # 移除前面的 # 号
    ...
}
...

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

保存并关闭文件。

8. 测试配置并重启 Nginx

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

sudo nginx -t

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

测试通过后,重启 Nginx 服务,让新的 Server Block 生效:

sudo systemctl restart nginx

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

Nginx first server block

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

第六步:安全加固与性能优化 —— 让你的网站又快又安全!

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

基础安全配置

编辑 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;           # 服务器向客户端发送响应超时

性能优化秘籍

同样在 /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;

测试并应用配置

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

测试配置:

sudo nginx -t

如果测试通过,重载 Nginx:

sudo systemctl reload nginx

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 服务器现在不仅更安全,而且能提供更快的用户体验。棒极了!

第七步:Nginx 那些重要的文件和目录

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

内容文件

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

服务器配置

  • /etc/nginx:这是 Nginx 的主配置目录,所有的 Nginx 配置文件都住在这里。
  • /etc/nginx/nginx.conf:Nginx 的主配置文件。你可以在这里修改 Nginx 的全局配置,比如 worker_processesgzip 设置、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 中引用,保持配置的整洁和可维护性。

服务器日志

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

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

Nginx 安全小贴士:常见问题与实践

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

Nginx 安全实践清单

安全实践 实现方式 常用命令/配置 优先级
保持 Nginx 更新 定期更新 Nginx 及系统软件包 sudo apt update && sudo apt upgrade nginx
配置防火墙 使用 UFW 限制只开放必要端口 sudo ufw allow 'Nginx Full'
启用 SSL/TLS 使用 Let's Encrypt 安装 SSL 证书 sudo certbot --nginx -d your_domain.com
隐藏服务器信息 阻止 Nginx 版本泄露 /etc/nginx/nginx.conf 中添加 server_tokens off;
安全响应头 添加安全响应头,防止常见攻击 server block 中添加(见下方示例)
请求限速 配置 rate limiting,抵御 DDoS 和暴力破解攻击 配置 limit_req_zonelimit_req
强认证 为管理界面使用强密码 实施 HTTP 基本认证或 OAuth
定期备份 备份 Nginx 配置和网站内容 sudo cp -r /etc/nginx /backup/nginx-$(date +%Y%m%d)
访问控制 限制对敏感目录的访问 使用 deny all; 或 IP 白名单
日志监控 监控访问和错误日志,发现可疑活动 sudo tail -f /var/log/nginx/error.log

示例:安全响应头配置

为了进一步增强安全性,你可以在 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;
    ...
}

示例:请求限速配置

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

第一步:在 /etc/nginx/nginx.confhttp 块中定义限速区域:

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

第二步:在你的 Server Blocklocation 块中应用这个限速区域:

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

常见问题 Q&A

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

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

2. 怎么检查 Nginx 是否正在运行?

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

# 检查服务状态(最常用)
sudo systemctl status nginx

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

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

# 查看 Nginx 进程
ps aux | grep nginx

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

4. Ubuntu 上 Nginx 的默认配置文件在哪?

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

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;
    }
}

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

7. Ubuntu 22.04、24.04 和 25.04 对 Nginx 有啥区别?

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

特性 Ubuntu 22.04 Ubuntu 24.04 Ubuntu 25.04
Nginx 版本 1.18.0+ 1.24.0+ 1.26.0+
支持周期 2027 年 2029 年 2026 年
安全更新 标准 增强 最新
性能 良好 更好 最佳
新功能与特性 基础 高级 最前沿

通常来说,LTS 版本(如 22.04 和 24.04)提供更长的支持周期和稳定性,更适合生产环境;而非 LTS 版本(如 25.04)则能让你更快地体验到 Nginx 的最新功能和性能改进。

总结与展望

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

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

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

下一步,你可以继续探索:

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

关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计