Basic NGINX Setup: Ubuntu 搭建功能完备且安全的网站服务指南

更新于 2026-01-27

JAKE

Nginx(发音为“Engine-X”)已迅速成为全球最流行的 Web 服务器之一。人们之所以青睐它,是因为其速度快、资源占用低,并能同时处理多种任务,例如展示网站内容或将 Web 请求转发到其他服务器。

使用 Nginx 有许多优点:它在提供静态网页方面表现出色,同时也擅长将 Web 请求代理到后端服务器。此外,你可以通过灵活配置,使其完全满足你的网站或应用程序的具体需求。

然而,与所有在线工具一样,安全性至关重要。尽管 Nginx 在初始安装时已经相对安全,但始终建议进一步加强防护措施。在本指南中,我们将向你展示如何在 Ubuntu 系统上搭建一个安全且功能完整的 Nginx 服务器,用于托管你的网站和应用程序。

前提条件

首先,你需要准备一台服务器用于部署 Nginx。具体选择取决于你的实际需求:对于轻量级或简单场景,虚拟私有服务器(VPS)通常已足够;但如果你预计会有较大的访问负载,或对性能有更高要求,则建议选择专用服务器(Dedicated Server)。无论哪种选择,都必须确保你拥有完整的 root 权限,以便顺利安装和管理 Nginx。

在操作系统方面,Nginx 兼容多种系统,包括 Ubuntu、CentOS、Debian、Fedora、RHEL(Red Hat Enterprise Linux)、FreeBSD 和 OpenBSD。本指南将采用 Ubuntu 作为操作系统。Ubuntu 为 Nginx 提供了一个稳定、安全且支持良好的运行平台。


在 Ubuntu 上安装 Nginx

得益于 Ubuntu 强大的包管理器,Nginx 的安装过程非常简单。以下是详细步骤:

步骤 1:更新软件包列表

确保你的系统拥有最新的可用软件包及其版本列表,这有助于获取最新的软件和安全补丁。

sudo apt update

步骤 2:安装 Nginx

现在,使用 apt 包管理器安装 Nginx:

sudo apt install nginx

执行此命令后,系统可能会提示你确认是否继续安装(因为会占用额外磁盘空间)。按 Y 键,然后按 Enter 继续。

步骤 3:启动并启用 Nginx

安装完成后,启动 Nginx 服务,并设置为开机自启:

sudo systemctl start nginx
sudo systemctl enable nginx

步骤 4:验证 Nginx 安装

要确认 Nginx 是否正确安装,可检查其运行状态:

sudo systemctl status nginx

如果一切正常,输出应显示 Nginx 服务处于 active (running) 状态。你也可以通过浏览器访问服务器的 IP 地址进行验证:

http://your_server_ip_address

如果看到 Nginx 默认欢迎页面,说明服务器已成功安装并可正常访问。

步骤 5:配置防火墙

默认情况下,Ubuntu 的 UFW 防火墙会阻止大多数入站连接。为允许 HTTP(端口 80)和 HTTPS(端口 443)流量,请执行以下命令:

sudo ufw allow 'Nginx Full'

该命令将同时放行普通(HTTP)和加密(HTTPS)流量。

恭喜!至此,Nginx 已成功安装并在你的 Ubuntu 服务器上运行。


在 Ubuntu 上配置 Nginx

Nginx 安装完成后,下一步是进行配置。虽然 Nginx 开箱即用,但通过微调其设置,可以显著提升性能与安全性。如果你还不熟悉 Nginx 的配置流程,本节将为你提供全面解析。

理解配置结构

Nginx 与其他服务器软件类似,依赖配置文件来定义其行为。理解这些文件的层级结构和用途,是有效管理服务器的关键。所有配置文件均位于 /etc/nginx 目录下:

  • /etc/nginx/nginx.conf

    • 用途:这是 Nginx 的主配置文件,包含影响全局行为的指令,适用于服务器上托管的所有站点。
    • 结构:文件内包含多个上下文(context),如 httpserverlocation。其中 http 控制通用 Web 服务器设置,而 serverlocation 通常用于特定站点或 URL 路径。
    • 可定制性:虽然可以在此文件中直接修改,但建议将站点专属配置放在独立的 server block 文件中(见下文),以保持主配置文件简洁易读。
  • /etc/nginx/sites-available

    • 用途:此目录用于存放每个网站或 Web 应用的独立配置文件。这些文件代表潜在可托管的站点,但尚未被 Nginx 实际启用。
    • 命名规范:通常建议以域名命名配置文件(如 example.com),便于管理多个站点。
    • 灵活性:通过分离各站点配置,管理员可为不同站点应用不同的规则、优化策略和安全设置,实现精细化控制。
  • /etc/nginx/sites-enabled

    • 用途:该目录包含指向 sites-available 中已启用站点配置的符号链接(symbolic links)。只有在此目录中的站点才会被 Nginx 实际提供服务。
    • 符号链接机制:当你准备“上线”某个站点时,只需创建从 sites-availablesites-enabled 的符号链接。这样可轻松启用或停用站点,而无需删除配置文件——只需添加或移除符号链接即可。
    • 重要提示:切勿直接编辑 sites-enabled 中的文件。由于它们是符号链接,修改会反映到 sites-available 的原始文件中。请始终在 sites-available 中编辑原始文件,然后测试并重载 Nginx 以应用更改。

设置基本 Server Block(虚拟主机)

Nginx 的 server block 功能相当于 Apache 的虚拟主机(Virtual Host),允许你在单个 Nginx 实例上托管多个网站。通过为不同站点组织独立配置,server block 提供了精准的 Web 托管控制能力。以下是设置基本 server block 的步骤:

步骤 1:创建配置文件

首先,为你的网站创建一个配置文件:

sudo nano /etc/nginx/sites-available/mywebsite

nano 是一个终端文本编辑器。如不熟悉操作,可使用 CTRL + O 保存,CTRL + X 退出。

步骤 2:编写 Server Block 配置

在该文件中,输入以下配置:

server {
    listen 80;
    server_name mywebsite.com www.mywebsite.com;
    root /var/www/mywebsite;
    index index.html;
    location / {
        try_files $uri $uri/ =404;
    }
}
  • listen 80;:指示 Nginx 监听 80 端口(HTTP 默认端口)的入站连接。
  • server_name:指定此 server block 对应的域名。Nginx 将对 mywebsite.comwww.mywebsite.com 的请求使用此配置。
  • root:指定网站文件在服务器上的存放目录。本例中为 /var/www/mywebsite
  • index:定义当客户端请求目录时默认返回的文件。例如,访问 http://mywebsite.com/ 时,Nginx 会尝试返回 /var/www/mywebsite/index.html
  • location:用于对特定路径的请求应用更具体的规则。try_files $uri $uri/ =404; 表示 Nginx 会先尝试将请求路径作为文件提供,再作为目录提供,若两者均不存在,则返回 404 错误。

步骤 3:激活 Server Block

配置文件创建后并不会自动生效。需通过创建符号链接将其激活:

sudo ln -s /etc/nginx/sites-available/mywebsite /etc/nginx/sites-enabled/

此操作相当于“发布”配置,使其可处理实际流量。

步骤 4:测试配置

在应用更改前,务必检查配置是否有语法错误:

sudo nginx -t

Nginx 会解析所有配置并返回反馈。若显示成功信息,说明配置无误。

步骤 5:重载 Nginx

Nginx 配置更改不会立即生效,需手动重载:

sudo systemctl reload nginx

该命令会平滑重载 Nginx,在不中断现有连接的情况下应用新配置。

步骤 6(可选):托管更多网站

想添加更多站点?流程完全一致。理论上,你可以在服务器性能允许范围内托管几乎无限数量的虚拟主机。对每个新站点:

  1. sites-available 中创建唯一配置文件;
  2. sites-enabled 中创建符号链接;
  3. 测试并重载 Nginx。

通过重复上述步骤,你可以轻松扩展 Nginx 以服务多个网站。


使用 Let's Encrypt 启用 SSL/TLS 加密

目前我们的网站通过 HTTP(端口 80)提供未加密内容。虽然这适用于开发和测试环境,但对于正式上线的网站而言并不符合安全标准。HTTP 传输的数据可能被窃听或篡改。因此,必须使用 HTTPS——HTTP 的安全版本,通过 SSL/TLS 实现数据加密传输。

虽然你可以购买第三方 SSL 证书,但 Let's Encrypt 是一个免费且安全的替代方案,适用于大多数网站。Let's Encrypt 是一个提供域名验证型 SSL 证书的免费项目,其优势包括:

  • 免费:完全零成本。
  • 自动化:简化证书申请与续期流程。
  • 安全可靠:提供强安全性,且被主流浏览器广泛信任。
  • 透明公开:所有证书均公开记录。
  • 开源开放:欢迎社区贡献。

步骤 1:安装 Certbot

Certbot 可自动完成 Let's Encrypt 证书的申请、续期及 Web 服务器配置。

添加仓库并安装 Certbot:

sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt update
sudo apt install certbot python3-certbot-nginx

步骤 2:生成并安装 SSL 证书

Certbot 不仅会获取证书,还会自动修改 Nginx 配置,添加监听 443 端口的 HTTPS server block:

sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

注意:请将 yourdomain.com 替换为你的实际域名。执行后,Nginx 即可通过 HTTPS 提供服务。

步骤 3:配置自动续期

Let's Encrypt 证书有效期为 90 天,但建议每 60 天续期一次。Certbot 的 renew 命令会自动检查证书有效期并执行续期。

为确保证书及时更新,可配置定时任务(cron job):

sudo crontab -e

在文件末尾添加以下行,以每天凌晨 2 点检查续期:

0 2 * * * /usr/bin/certbot renew --quiet

该定时任务每日运行,若发现证书即将过期,Certbot 会自动续期,并触发 Nginx 重载以加载新证书。


加固 Nginx 安全配置

你的网站现已上线、运行,并启用了加密。但安全永无止境。以下是一些高级设置,可进一步增强 Nginx 的安全性。

禁用服务器令牌(Server Tokens)

默认情况下,Nginx 会在错误页面和响应头的 Server 字段中显示其版本号。这可能带来安全风险,因为攻击者可利用特定版本的已知漏洞。

编辑主配置文件:

sudo nano /etc/nginx/nginx.conf

http 块中添加或修改以下行:

server_tokens off;

保存并关闭文件,然后重载 Nginx:

sudo systemctl reload nginx

配置强 SSL 策略

强 SSL 策略确保服务器仅使用最安全、现代的加密协议和密码套件。在 nginx.conf 中添加或修改以下行(保留这些即可):

ssl_protocols TLSv1.2 TLSv1.3;

保存、退出并重载 Nginx。

启用 HTTP 严格传输安全(HSTS)

HSTS(HTTP Strict Transport Security)是一种安全机制,强制浏览器仅通过 HTTPS 与服务器通信,永不回退到不安全的 HTTP。这能有效防范中间人攻击(MITM)和 Cookie 劫持。

在你的 server block 中添加:

add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";

保存、退出并重载 Nginx。

为特定目录启用密码认证

为保护网站敏感区域(如管理后台),可使用 Nginx 内置功能要求用户名和密码。首先,使用 OpenSSL 创建密码文件:

sudo sh -c "echo -n 'username:' >> /etc/nginx/.htpasswd"

注意:将 username 替换为你想要的用户名。

然后使用 OpenSSL 生成密码并追加到文件:

sudo sh -c "openssl passwd -apr1 >> /etc/nginx/.htpasswd"

系统会提示你输入并确认密码。

在 Nginx 配置中,于你想保护的 location 块内添加:

auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.htpasswd;

保存配置,退出并重载 Nginx:

sudo systemctl reload nginx

Nginx 限速(Rate Limiting)

限速是一种服务器保护机制,类似于保安控制进入大楼的人数。它限制用户在设定时间内的请求次数,防止单个用户或恶意机器人通过大量请求压垮服务器。这有助于抵御 DDoS 攻击,确保真实用户能正常访问。

编辑主配置文件:

sudo nano /etc/nginx/nginx.conf

http 块中定义限速规则,例如:

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;

说明:

  • $binary_remote_addr:表示用户 IP 地址。
  • zone=mylimit:10m:分配名为 “mylimit” 的 10MB 共享内存,可存储约 16 万个 IP 地址的信息。
  • rate=10r/s:限制每个 IP 每秒最多 10 个请求。

然后,在 sites-available 中的站点配置文件里,将限速应用到 serverlocation 块:

limit_req zone=mylimit burst=20 nodelay;

保存、退出并重载 Nginx。

为 Nginx 配置 Fail2Ban

Fail2Ban 是一款实时监控服务器日志的安全工具。当检测到可疑行为(如多次登录失败或疑似攻击模式),它会立即“封禁”相关 IP 地址,暂时阻止其访问。这既能防止未授权访问,也能抵御流量洪泛攻击。

安装 Fail2Ban:

sudo apt install fail2ban

复制默认配置:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

编辑 jail.local 文件,添加针对 Nginx 的规则。具体配置可参考社区提供的成熟方案。

保存、退出并重启 Fail2Ban:

sudo systemctl restart fail2ban

设置开机自启:

sudo systemctl enable fail2ban

Nginx 性能优化

在 Web 内容交付中,每一毫秒都至关重要。页面加载缓慢会劝退用户、提高跳出率,并损害网站声誉。当今用户期望网站快速、流畅地加载。优化性能不仅提升用户体验,也有助于搜索引擎排名。以下是提升 Nginx 性能的关键技巧。

启用 Gzip 压缩

Gzip 是一种广泛使用的 Web 内容压缩技术,其优势包括:

  • 减少数据传输量:压缩后传输的数据更少,加快速度并节省带宽(尤其在按流量计费时可降低成本)。
  • 加速页面加载:压缩文件体积更小,客户端下载更快,用户体验更流畅。

编辑主配置文件:

sudo nano /etc/nginx/nginx.conf

http 块中添加以下 Gzip 配置:

gzip on;                          # 启用 gzip 压缩
gzip_disable "msie6";             # 禁用 IE6 的 gzip(因其存在兼容问题)
gzip_vary on;                     # 允许代理缓存 gzip 和非 gzip 版本
gzip_proxied any;                 # 即使是代理请求也压缩
gzip_comp_level 6;                # 压缩级别(1 最低,9 最高)
gzip_buffers 16 8k;               # 为压缩分配的内存缓冲区
gzip_http_version 1.1;            # 仅对 HTTP/1.1 及以上版本请求压缩
gzip_types
    text/plain
    text/css
    application/json
    application/javascript
    text/xml
    application/xml
    application/xml+rss
    text/javascript;              # 指定需压缩的 MIME 类型

保存配置并重载 Nginx:

sudo systemctl reload nginx

静态文件缓存

网页通常包含图片、CSS、JS 等静态资源。若这些资源被浏览器缓存,后续访问可直接从本地加载,无需重新下载。这既加快了页面加载速度,又减轻了服务器负担。

编辑你的站点配置:

sudo nano /etc/nginx/sites-available/mywebsite

在专门处理静态资源的 location 块中添加:

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;                          # 指示浏览器缓存这些文件 30 天
    add_header Cache-Control "public, no-transform";  # 补充缓存控制头
}

保存修改并重载 Nginx:

sudo systemctl reload nginx

保持安全与更新:总结

你已学习了大量关于 Nginx 安装与调优的知识。但请记住,部署完成并非终点。如同任何工具,Nginx 也需要定期维护。我们不仅讲解了如何让 Nginx 运行起来,更重要的是如何使其安全可靠。在当今网络环境中,安全是网站的基本要求。遵循本指南的步骤,你已为网站及其访客提供了坚实保障。

同时,软件持续演进,新功能和安全补丁不断发布。因此,请定期访问 Nginx 官方网站,了解最新动态。

总而言之:保持服务器安全,紧跟更新节奏。你的网站和用户都会感谢你。