引言
嗨,朋友们!今天我们要聊的主角,是 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 processes、connection limits、缓存和Gzip压缩,让你的网站飞沙走石,速度爆表。 - 反向代理与负载均衡:了解如何将 Nginx 设置为后端应用的
Reverse Proxy,甚至实现简单的负载均衡。 - 故障排除与日志分析:学会查看
access和error 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 的默认欢迎页面,通常长这样:

恭喜你!看到这个页面,就说明你的 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 HTTP 和 OpenSSH 都显示为 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_domain和www.your_domain的请求。default:如果任何请求不匹配your_domain的Server 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 ok 和 test is successful 的提示。如果出现错误,请仔细检查你刚才修改的文件。
测试通过后,重启 Nginx 服务,让新的 Server Block 生效:
sudo systemctl restart nginx
现在,Nginx 应该已经开始为你的域名提供服务了。打开你的浏览器,访问 http://your_domain(再次强调,替换成你的实际域名),你应该会看到你刚才创建的那个“恭喜!”页面。
是不是很酷?你已经成功在一台服务器上部署了你的第一个自定义网站!
第六步:安全加固与性能优化 —— 让你的网站又快又安全!
网站上线了,但我们不能止步于此。一个优秀的 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,这里存放着你的网站的所有HTML、CSS、JavaScript和图片等文件。
服务器配置
/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中引用,保持配置的整洁和可维护性。
服务器日志
/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_zone 和 limit_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 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;
}
...
}
常见问题 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 世界还有很多有趣的等着你去探索!
下一步,你可以继续探索:
- LEMP 栈:搭建完整的应用环境,学习如何在 Ubuntu 上安装
Linux、Nginx、MySQL和PHP(LEMP栈)。你可以参考:How To Install Linux, Nginx, MySQL, PHP (LEMP stack) on Ubuntu - SSL/TLS 设置:使用
Let's Encrypt为你的网站添加HTTPS加密,让网站更安全、更受信任:How To Secure Nginx with Let’s Encrypt on Ubuntu - 反向代理进阶:深入了解如何将 Nginx 配置为应用程序的反向代理,为你的
Node.js、Python或其他后端服务提供强大的前端支持:Nginx as a reverse proxy for your applications
不断学习,不断实践,你会在 DevOps 和 Web 开发的道路上越走越远,成为一名真正的“服务器魔法师”!
关于
关注我获取更多资讯