Ubuntu 安装 Nginx 完整指南 – wiki基地


Ubuntu 系统下 Nginx 完整安装与配置指南

Nginx(发音为 “engine-x”)是一款高性能的开源 Web 服务器、反向代理服务器以及电子邮件代理服务器。它以其卓越的并发处理能力、低内存消耗和出色的稳定性而闻名,被广泛应用于构建高流量的网站和应用程序。无论您是搭建个人博客、公司网站,还是部署复杂的微服务架构,Nginx 都能胜任。

本文将为您提供一个在 Ubuntu 操作系统上安装和配置 Nginx 的完整指南。我们将从最基本的安装步骤开始,逐步深入到核心配置、常用模块设置以及服务管理等方面,确保您能够掌握 Nginx 的基本使用。

目录

  1. 引言:为什么选择 Nginx?
  2. 环境准备:开始安装前的准备工作
    • Ubuntu 系统要求
    • 获取 Root 或 Sudo 权限
    • 网络连接
  3. Nginx 安装方法
    • 使用 Ubuntu 官方仓库 (推荐)
    • 从 Nginx 官方仓库安装 (获取最新版本)
    • 从源代码编译安装 (高级)
  4. 详细安装步骤:使用 Ubuntu 官方仓库 (最常用方法)
    • 更新软件包列表
    • 安装 Nginx
    • 验证安装
  5. 配置防火墙 (UFW):允许 Nginx 流量通过
    • 检查 UFW 状态
    • 允许 Nginx 流量
    • 验证防火墙规则
  6. Nginx 服务管理
    • 启动、停止、重启和重新加载
    • 检查服务状态
    • 设置开机自启
  7. Nginx 核心配置文件结构与理解
    • 主配置文件 (nginx.conf)
    • 虚拟主机配置 (sites-availablesites-enabled)
    • 其他重要目录
  8. 基本配置:搭建第一个网站 (Server Block)
    • 创建网站根目录
    • 创建示例 HTML 文件
    • 创建新的 Server Block 配置文件
    • 配置 Server Block (your_site_name.conf)
    • 激活 Server Block (创建软链接)
    • 测试 Nginx 配置语法
    • 重新加载或重启 Nginx
    • 通过浏览器访问网站
    • 删除默认 Server Block (可选但推荐)
  9. 深入配置:常用功能介绍
    • 日志配置 (访问日志与错误日志)
    • 静态文件服务与缓存
    • 反向代理配置
    • SSL/TLS 配置 (HTTPS) – 简单介绍 Certbot
    • Gzip 压缩配置
  10. Nginx 性能调优基础 (简述)
    • Worker Processes 和 Worker Connections
    • 连接 Keep-Alive
  11. 常见问题与故障排除
    • Nginx 服务无法启动
    • 配置语法错误
    • 端口被占用
    • 防火墙问题
    • 网站访问权限问题
    • 找不到文件 (404 Error)
  12. 更新 Nginx
  13. 卸载 Nginx
    • 仅移除软件包
    • 移除软件包及配置文件
    • 移除不再需要的依赖
  14. 总结与展望

1. 引言:为什么选择 Nginx?

在众多的 Web 服务器软件中,Nginx 凭借其独特的设计理念和卓越的性能脱颖而出。与 Apache 等传统基于进程/线程模型的服务器不同,Nginx 采用了基于事件驱动的异步非阻塞模型。这意味着 Nginx 可以用较少的进程处理大量的并发连接,从而显著提高了服务器的资源利用率和响应速度。

选择 Nginx 的主要理由包括:

  • 高性能和高并发处理能力: 非常适合高流量网站。
  • 低内存消耗: 在处理大量连接时,内存占用远低于许多其他服务器。
  • 稳定性高: 事件驱动模型使得 Nginx 不容易受到单个连接问题的影响而崩溃。
  • 功能丰富: 支持反向代理、负载均衡、静态文件服务、HTTP 缓存、FastCGI/uWSGI/SCGI 代理等多种功能。
  • 模块化设计: 易于扩展和定制。
  • 良好的社区支持: 开源项目,有活跃的社区提供支持和文档。

Nginx 不仅可以用作独立的 Web 服务器直接提供静态内容,更常被用作后端应用服务器(如 Node.js, Python/Django/Flask, Java/Spring 等)的反向代理,处理静态文件、SSL 终止、请求过滤和负载均衡等任务,将动态请求转发给后端的应用服务器处理。

2. 环境准备:开始安装前的准备工作

在开始安装 Nginx 之前,请确保您的 Ubuntu 系统满足以下条件:

  • Ubuntu 系统要求: 本指南适用于 Ubuntu Desktop 或 Server 版本,从 18.04 LTS (Bionic Beaver) 及更高版本(如 20.04 LTS Focal Fossa, 22.04 LTS Jammy Jellyfish 等)均适用。确保系统已安装并可以正常启动。
  • 获取 Root 或 Sudo 权限: 您需要一个具有 sudo 权限的用户账户,或者直接使用 root 用户进行操作。在大多数情况下,使用具有 sudo 权限的非 root 用户是更安全的做法。本指南中的所有需要管理员权限的命令都将以 sudo 开头。
  • 网络连接: 安装过程需要从互联网下载软件包,因此请确保您的 Ubuntu 服务器或虚拟机具有稳定的网络连接。

在终端中执行命令是安装和配置 Nginx 的主要方式。您可以通过 SSH 连接到远程服务器,或者在 Ubuntu Desktop 上打开终端应用程序。

3. Nginx 安装方法

Nginx 可以在 Ubuntu 上通过几种不同的方式安装:

  1. 使用 Ubuntu 官方仓库 (推荐): 这是最简单、最方便的方法。Ubuntu 的官方软件包仓库中包含了稳定版本的 Nginx。通过 apt 包管理器安装非常快捷,且后续更新维护方便。通常,官方仓库提供的版本已经足够满足大多数需求,且与系统其他组件兼容性好。
  2. 从 Nginx 官方仓库安装: 如果您需要安装最新版本的 Nginx,或者特定的 Nginx Plus(商业版本)功能,可以添加 Nginx 官方维护的 APT 仓库。这样可以通过 apt 安装比 Ubuntu 官方仓库中更新的版本。
  3. 从源代码编译安装 (高级): 这种方法提供了最大的灵活性,您可以选择性地编译所需的模块,或者安装最新的开发版本。但过程相对复杂,需要手动解决依赖关系,不推荐初学者使用。

本文将重点介绍和推荐使用 Ubuntu 官方仓库安装的方法,因为它最常用且易于操作。对于希望安装最新版本的用户,可以考虑官方仓库方法,但基本步骤与官方仓库类似,只是在添加仓库时有所不同。

4. 详细安装步骤:使用 Ubuntu 官方仓库

这是安装 Nginx 最常见和推荐的方式。通过 Ubuntu 自带的 apt 包管理器进行。

步骤 1:更新软件包列表

在安装任何新软件之前,始终建议先更新系统的软件包列表。这确保您能够安装到可用仓库中的最新版本的软件包信息。

打开终端并执行以下命令:

bash
sudo apt update

这个命令会连接到 Ubuntu 的软件仓库,下载所有可用软件包的最新信息,包括版本号、依赖关系等。

步骤 2:安装 Nginx

更新完软件包列表后,就可以使用 apt 命令安装 Nginx 了。

bash
sudo apt install nginx

系统会提示您确认安装,包括需要下载和安装的软件包及其占用的磁盘空间。输入 Y 并按 Enter 键继续。

apt 会自动下载 Nginx 软件包及其所有必需的依赖项,并将它们安装到系统中。这个过程可能需要几分钟,具体取决于您的网络速度。

步骤 3:验证安装

安装完成后,Nginx 服务应该会自动启动。您可以通过 systemctl 命令来检查 Nginx 服务的运行状态。systemctl 是管理 systemd 系统和服务的工具。

bash
systemctl status nginx

如果 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 Tue 2023-10-26 10:30:00 UTC; 5min ago
Docs: man:nginx(8)
Main PID: 12345 (nginx)
Tasks: 2 (limit: 4674)
Memory: 6.5M
CPU: 0.040s
CGroup: /system.slice/nginx.service
├─12345 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
└─12346 nginx: worker process

… (其他日志信息)
“`

输出中的 Active: active (running) 表明 Nginx 服务正在正常运行。enabled 表示它已被配置为在系统启动时自动启动。

您还可以通过 Web 浏览器来验证 Nginx 是否在工作。如果您在服务器上直接操作,或者可以通过服务器的 IP 地址访问(并且防火墙允许),打开浏览器并输入服务器的 IP 地址:

http://您的服务器IP地址/

如果一切正常,您应该会看到 Nginx 的欢迎页面,上面写着 “Welcome to nginx!”。这意味着 Nginx 已经成功安装并可以通过默认配置提供服务。

如果您是在本地虚拟机上安装,并且没有配置静态 IP,您可以使用 ip addr show 命令查找您的服务器 IP 地址。

bash
ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

eth0 替换为您实际的网络接口名称(可能是 ens33, enp0s3 等)。

至此,Nginx 已经成功安装在您的 Ubuntu 系统上。

5. 配置防火墙 (UFW):允许 Nginx 流量通过

在 Ubuntu 系统上,通常会使用 UFW (Uncomplicated Firewall) 作为防火墙管理工具。安装 Nginx 后,您需要配置防火墙以允许外部流量访问 Nginx 监听的端口(默认为 HTTP 的 80 端口和 HTTPS 的 443 端口)。

Nginx 在安装时会向 UFW 注册自己的应用程序配置文件,这使得配置防火墙变得非常简单。

步骤 1:检查 UFW 状态

首先,检查您的 UFW 防火墙是否处于活动状态。

bash
sudo ufw status

如果 UFW 没有启用,您会看到类似 Status: inactive 的输出。在这种情况下,您需要先启用它(请谨慎操作,确保您不会断开当前的 SSH 连接):

bash
sudo ufw enable
sudo ufw status

启用 UFW 后,它可能会阻止所有传入连接。您需要明确允许 SSH 连接(如果您是通过 SSH 连接的),通常端口是 22。

bash
sudo ufw allow ssh

步骤 2:允许 Nginx 流量

Nginx 的 UFW 应用程序配置文件提供了几种模式:

  • Nginx HTTP: 仅允许 HTTP 流量 (端口 80)。
  • Nginx HTTPS: 仅允许 HTTPS 流量 (端口 443)。
  • Nginx Full: 同时允许 HTTP (端口 80) 和 HTTPS (端口 443) 流量。

根据您的需求选择相应的模式。如果您计划同时使用 HTTP 和 HTTPS,或者将来可能使用 HTTPS,建议选择 Nginx Full

“`bash
sudo ufw allow ‘Nginx Full’

或者如果您只需要 HTTP:

sudo ufw allow ‘Nginx HTTP’

或者如果您只需要 HTTPS:

sudo ufw allow ‘Nginx HTTPS’

“`

步骤 3:验证防火墙规则

再次检查 UFW 状态,确认规则已成功添加。

bash
sudo ufw status

您应该看到类似以下的输出(规则顺序可能不同):

“`
Status: active

To Action From
— —— —-
22/tcp ALLOW Anywhere
Nginx Full ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)
“`

现在,您的服务器防火墙已经配置为允许外部访问 Nginx 的 HTTP 和 HTTPS 端口。

6. Nginx 服务管理

安装 Nginx 后,您需要了解如何使用 systemctl 命令来管理 Nginx 服务,包括启动、停止、重启和重新加载配置等操作。

  • 启动 Nginx 服务: 如果 Nginx 没有运行,可以使用此命令启动。

    bash
    sudo systemctl start nginx

  • 停止 Nginx 服务: 这会完全关闭 Nginx 进程。

    bash
    sudo systemctl stop nginx

  • 重启 Nginx 服务: 这会停止然后重新启动 Nginx 进程。当您修改了 Nginx 的主配置文件(如 nginx.conf)或更改了 worker 进程数等全局设置时,通常需要重启。

    bash
    sudo systemctl restart nginx

  • 重新加载 Nginx 配置: 这是修改 Server Block 或其他大部分配置后最常用的命令。Nginx 会加载新的配置,但不会停止主进程,worker 进程会平滑地用新配置重启,不会中断当前连接。

    bash
    sudo systemctl reload nginx

    注意: 在重新加载之前,强烈建议先测试配置语法是否正确 (sudo nginx -t),避免因配置错误导致 Nginx 无法启动或加载。

  • 检查 Nginx 服务状态: 用于查看 Nginx 是否正在运行,以及最近的活动日志。

    bash
    systemctl status nginx

  • 设置开机自启: 默认情况下,通过 apt 安装的 Nginx 会被配置为开机自启。您可以使用以下命令启用或禁用:

    “`bash

    启用开机自启

    sudo systemctl enable nginx

    禁用开机自启

    sudo systemctl disable nginx
    “`

这些 systemctl 命令是管理 Nginx 服务的基本工具,务必熟练掌握。

7. Nginx 核心配置文件结构与理解

理解 Nginx 的配置文件结构是成功配置 Nginx 的关键。Nginx 的主要配置文件位于 /etc/nginx/ 目录下。

核心文件和目录:

  • /etc/nginx/nginx.conf: 这是 Nginx 的主配置文件。它包含全局设置,例如 worker 进程数、错误日志路径等。通常,您不需要频繁修改这个文件,因为它会通过 include 指令引用其他配置。
  • /etc/nginx/sites-available/: 这个目录用于存放所有可用的虚拟主机 (Server Block) 配置文件。您可以创建多个 .conf 文件,每个文件定义一个网站或应用程序的配置。存放在此目录下的配置文件不会自动生效。
  • /etc/nginx/sites-enabled/: 这个目录存放的是当前正在使用的虚拟主机配置文件。实际上,这里的文件通常是 /etc/nginx/sites-available/ 目录中文件的软链接 (symbolic link)。Nginx 在启动或重新加载时,只会加载 sites-enabled 目录中的配置文件。
  • /etc/nginx/snippets/: 这个目录用于存放可重用的配置片段,例如 SSL 设置、FastCGI 参数等,可以在多个 Server Block 中通过 include 指令引用,避免重复。
  • /var/www/: 这是存放网站静态文件的默认根目录。通常每个网站会在这个目录下创建一个子目录(例如 /var/www/your_domain)来存放其网页文件。
  • /var/log/nginx/: Nginx 的访问日志 (access.log) 和错误日志 (error.log) 默认存放在这个目录下。

主配置文件 nginx.conf 的基本结构:

打开 nginx.conf 文件 (sudo nano /etc/nginx/nginx.conf),您会看到类似以下的基本结构(注释可能很多,我只保留关键部分):

“`nginx

全局块

user www-data; # Nginx 工作进程的用户和用户组
worker_processes auto; # Nginx worker 进程数,auto 会根据 CPU 核数自动设置
error_log /var/log/nginx/error.log warn; # 错误日志路径和级别
pid /var/run/nginx.pid; # 主进程 PID 文件路径

events {
# 事件块
worker_connections 768; # 每个 worker 进程最大并发连接数
# multi_accept on; # worker 进程是否一次性接受所有新连接
}

http {
# HTTP 块 – 配置 HTTP 服务器相关的设置
include /etc/nginx/mime.types; # 包含 MIME 类型映射
default_type application/octet-stream; # 默认 MIME 类型

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for"'; # 日志格式定义

access_log /var/log/nginx/access.log main; # 访问日志路径和格式

sendfile on; # 开启高效文件传输模式
#tcp_nopush on; # 在 sendfile 开启时,数据包会积累一定大小后发送

keepalive_timeout 65; # keep-alive 超时时间

# gzip on; # 开启 Gzip 压缩 (通常在 http 块或 server 块中配置)

# include /etc/nginx/conf.d/*.conf; # 包含 conf.d 目录下的额外配置
include /etc/nginx/sites-enabled/*; # 包含 sites-enabled 目录下的 Server Block 配置

}

可选的 mail 块,用于配置邮件代理

mail {

}

“`

其中,http 块包含了最重要的 Web 服务器配置。注意最后的 include /etc/nginx/sites-enabled/*; 行,这告诉 Nginx 去加载 sites-enabled 目录下所有的配置文件,这正是实现虚拟主机功能的方式。

8. 基本配置:搭建第一个网站 (Server Block)

现在,让我们创建一个简单的 Server Block 配置,让 Nginx 为一个自定义域名(或IP)提供服务。我们将创建一个新的配置文件在 sites-available 目录下,然后将其链接到 sites-enabled 目录。

步骤 1:创建网站根目录

首先,为您的网站创建一个专门的目录,通常放在 /var/www/ 下。使用您的域名(例如 example.com)或项目名称作为目录名是一个好的习惯。

bash
sudo mkdir -p /var/www/example.com/html

这里的 -p 参数会递归创建父目录。我们将网站文件放在 html 子目录中。

步骤 2:创建示例 HTML 文件

在这个新的网站根目录中创建一个简单的 index.html 文件作为测试页面。

bash
sudo nano /var/www/example.com/html/index.html

在编辑器中输入以下内容:

“`html




Welcome to Example.com!


Success! Nginx is serving this page for example.com

This is a test page hosted on your Ubuntu server.


“`

保存并关闭文件 (按下 Ctrl+X, 然后 Y, 最后 Enter)。

步骤 3:确保 Nginx 具有文件读取权限

默认情况下,Nginx worker 进程运行在 www-data 用户下。确保这个用户对您的网站目录及其文件有读取权限。由于我们创建的目录和文件使用了 sudo,它们可能归 root 用户所有。简单的做法是更改目录及其内容的归属者为 www-data 用户和组。

bash
sudo chown -R www-data:www-data /var/www/example.com/html

-R 参数表示递归更改子目录和文件的归属者。

步骤 4:创建新的 Server Block 配置文件

现在,为您的网站创建一个新的 Server Block 配置文件。惯例是使用您的域名作为文件名。

bash
sudo nano /etc/nginx/sites-available/example.com.conf

步骤 5:配置 Server Block (example.com.conf)

在打开的编辑器中,粘贴以下基本配置:

“`nginx
server {
listen 80; # 监听 IPv4 的 80 端口 (HTTP)
listen [::]:80; # 监听 IPv6 的 80 端口 (HTTP)

root /var/www/example.com/html; # 网站根目录
index index.html index.htm index.nginx-debian.html; # 默认索引文件列表

server_name example.com www.example.com; # 网站域名,可以列出多个,用空格分隔

location / {
    # Any files in the root directory will be served.
    # Try_files checks if the file exists, then directory, then falls back to 404.
    try_files $uri $uri/ =404;
}

# 可选:配置错误页面
# error_page 404 /404.html;
# location = /404.html {
#     internal;
# }

# 可选:配置日志路径 (如果未在 http 块中全局设置)
# access_log /var/log/nginx/example.com_access.log;
# error_log /var/log/nginx/example.com_error.log;

}
“`

解释一下配置中的关键指令:

  • listen 80;listen [::]:80;: 这告诉 Nginx 监听所有网络接口的 IPv4 (80) 和 IPv6 (80) 端口,处理 HTTP 请求。
  • root /var/www/example.com/html;: 指定了网站文件的存放路径,Nginx 会从这个目录中查找请求的文件。
  • index index.html ...;: 定义了当请求的是一个目录(如 http://example.com/)时,Nginx 会尝试查找的文件顺序。它会先找 index.html,如果找不到就找 index.htm,以此类推。
  • server_name example.com www.example.com;: 定义了这个 Server Block 响应的域名。当 Nginx 接收到请求时,会根据请求头中的 Host 字段匹配 server_name 来确定由哪个 Server Block 处理请求。您可以列出多个域名,用空格分隔。
  • location / { ... };: 这是一个 location 块,用于处理匹配特定路径的请求。/ 匹配所有请求。try_files 指令是常用的配置,它会按顺序检查 $uri (请求的URI,如 /about/) 对应的文件或目录是否存在,如果都找不到,则返回 404 错误。

保存并关闭文件。

步骤 6:激活 Server Block (创建软链接)

正如前面所说,sites-available 目录中的配置文件不会自动加载。您需要通过在 sites-enabled 目录中创建一个软链接来激活它。

bash
sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/

这个命令创建了一个名为 example.com.conf 的软链接在 sites-enabled 目录下,它指向 sites-available 目录中的同名文件。

步骤 7:测试 Nginx 配置语法

在重新加载或重启 Nginx 之前,务必测试新的配置语法是否正确。错误的配置可能导致 Nginx 无法启动或加载。

bash
sudo nginx -t

如果配置语法正确,您会看到类似以下的两行输出:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

如果出现任何错误或警告,请仔细阅读输出信息,它会指示错误所在的文件和行号,根据提示修正您的配置文件。

步骤 8:重新加载或重启 Nginx

配置语法测试成功后,就可以让 Nginx 加载新的配置了。因为我们只修改了 Server Block,使用 reload 是最佳选择,因为它不会中断现有连接。

bash
sudo systemctl reload nginx

如果 reload 命令执行没有错误,说明新的 Server Block 已经生效。

步骤 9:通过浏览器访问网站

现在,打开您的 Web 浏览器,输入您在 server_name 中配置的域名 (http://example.com/http://www.example.com/)。如果您是在测试环境并且没有实际域名,或者域名还没有解析到您的服务器 IP,您可以使用服务器的 IP 地址访问。但是请注意,使用 IP 地址访问时,Nginx 会fallback到默认的 Server Block(通常是 /etc/nginx/sites-enabled/default),而不是您刚刚创建的 example.com Server Block,除非您删除了默认 Server Block 或者您的 example.com Server Block是唯一的监听 80 端口的 Server Block。

如果您配置了域名并且已经将域名的 DNS A 记录指向了您的服务器 IP 地址,通过域名访问将直接命中 example.com 的 Server Block,您应该会看到您创建的 index.html 页面内容:”Success! Nginx is serving this page for example.com”。

如果您使用 IP 地址访问,并且看到了 “Welcome to nginx!” 页面,这意味着您命中了默认的 Server Block。要通过 IP 地址测试您新的 Server Block,您可以:
a) 删除默认 Server Block (见下一步骤)。
b) 修改本地计算机的 hosts 文件,将 example.comwww.example.com 指向您的服务器 IP 地址(仅适用于测试目的)。

步骤 10:删除默认 Server Block (可选但推荐)

Ubuntu 上安装的 Nginx 默认会启用一个名为 default 的 Server Block,它通常位于 /etc/nginx/sites-available/default 并通过软链接激活在 sites-enabled/default。这个默认配置会响应任何没有匹配到特定 server_name 的 HTTP 请求,包括直接使用 IP 地址的访问。

为了避免混淆,或者如果您不希望默认页面对外暴露,您可以删除或取消激活这个默认的 Server Block。

取消激活默认 Server Block (移除软链接):

bash
sudo unlink /etc/nginx/sites-enabled/default

然后重新加载 Nginx 配置使改动生效:

bash
sudo systemctl reload nginx

现在,当访问服务器 IP 地址时,如果没有任何其他 Server Block 匹配,Nginx 可能会返回一个 404 错误页面,或者如果您有其他 Server Block 监听 80 端口但没有指定 server_name,它可能会成为新的默认 Server Block。最安全的方式是为所有预期的域名配置 Server Block,并删除不需要的默认配置。

9. 深入配置:常用功能介绍

Nginx 的功能远不止提供静态文件服务。以下是一些常用功能的简介及其配置方向:

  • 日志配置: Nginx 会生成访问日志 (access log) 和错误日志 (error log)。默认路径在 /var/log/nginx/。您可以在 http 块中全局配置日志格式 (log_format) 和路径 (access_log, error_log),也可以在 server 块或 location 块中为特定网站或路径单独设置。

    “`nginx

    在 server 块中为特定网站设置日志

    server {

    access_log /var/log/nginx/your_site_access.log main;
    error_log /var/log/nginx/your_site_error.log warn;

    }
    “`

  • 静态文件服务与缓存: Nginx 提供静态文件服务非常高效。您可以通过 root 指令指定静态文件目录,并通过 location 块进一步细化配置。例如,可以为静态文件设置缓存头,提高客户端加载速度。

    nginx
    location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
    expires 30d; # 浏览器缓存静态文件 30 天
    access_log off; # 静态文件不记录访问日志,减少磁盘 I/O
    log_not_found off; # 找不到静态文件时不记录错误日志
    }

    这个 location 块使用了正则表达式匹配多种静态文件扩展名,并设置了 expires 头。

  • 反向代理配置: 将请求转发到后端的应用服务器是 Nginx 最常见的用途之一。例如,将所有请求转发到运行在本地 8000 端口的 Node.js 或 Python 应用。

    “`nginx
    server {
    listen 80;
    server_name your_app_domain.com;

    location / {
        proxy_pass http://localhost:8000; # 将请求转发到本地 8000 端口
        proxy_set_header Host $host; # 保留原始 Host 头
        proxy_set_header X-Real-IP $remote_addr; # 添加真实客户端 IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 添加 X-Forwarded-For 头
        proxy_set_header X-Forwarded-Proto $scheme; # 添加协议头
    }
    

    }
    ``
    这里的
    proxy_pass是核心指令。proxy_set_header` 用于在转发请求时修改或添加请求头,这对于后端应用获取客户端真实 IP、原始请求域名和协议等信息非常重要。

  • SSL/TLS 配置 (HTTPS): 为网站启用 HTTPS 需要 SSL 证书和相应的配置。最简单的方式是使用 Certbot 工具,它可以与 Nginx 集成,自动获取 Let’s Encrypt 提供的免费证书并配置 Nginx。

    “`bash

    安装 Certbot 和 Nginx 插件

    sudo apt install certbot python3-certbot-nginx

    自动获取证书并配置 Nginx (根据提示输入域名等信息)

    sudo certbot –nginx -d your_domain.com -d www.your_domain.com
    “`
    Certbot 会自动修改您的 Nginx Server Block 配置,添加监听 443 端口、指定证书路径以及强制将 HTTP 重定向到 HTTPS 的设置。这是一个非常方便的自动化工具。

  • Gzip 压缩配置: 开启 Gzip 压缩可以减小传输的数据量,提高网页加载速度。通常在 http 块或 server 块中开启。

    nginx
    gzip on; # 开启 gzip 压缩
    gzip_vary on; # 在响应头中添加 Vary: Accept-Encoding
    gzip_proxied any; # 允许代理请求的响应进行压缩
    gzip_comp_level 6; # 压缩级别 (1-9,6 是一个不错的平衡点)
    gzip_buffers 16 8k; # 缓冲设置
    gzip_http_version 1.1; # 启用 gzip 压缩所需的最小 HTTP 协议版本
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 需要压缩的 MIME 类型

10. Nginx 性能调优基础 (简述)

虽然 Nginx 开箱即用性能就很优秀,但针对特定负载进行一些基础调优可以进一步提升效率。这些配置通常在 nginx.conf 的全局块或 events 块中。

  • Worker Processes 和 Worker Connections:

    • worker_processes auto;: 设置 Nginx 启动多少个 worker 进程。auto 是推荐设置,它会根据 CPU 核数自动确定最佳数量。
    • worker_connections 768; (或更高): 设置每个 worker 进程可以同时处理的最大连接数。理论上,总的最大连接数是 worker_processes * worker_connections。根据服务器的内存和连接特性调整此值。例如,如果您的服务器内存充足且并发连接数很高,可以适当增加。
  • 连接 Keep-Alive:

    • keepalive_timeout 65;: 设置 keep-alive 连接的超时时间。客户端在此时间内可以复用同一个连接发送多个请求,减少连接建立的开销。适当增加超时时间(例如 65 秒)对于频繁请求资源的客户端(如加载多个图片的网页)是有益的。

更高级的性能调优涉及缓存、负载均衡算法、SSL 会话缓存等,需要根据具体的应用场景进行。

11. 常见问题与故障排除

在安装和配置 Nginx 过程中,可能会遇到一些问题。以下是一些常见的问题及其排查思路:

  • Nginx 服务无法启动或运行异常:
    • 检查服务状态:systemctl status nginx 查看是否有错误信息。
    • 查看错误日志:sudo tail /var/log/nginx/error.log 查看最近的错误日志,通常能找到具体原因,如配置错误、端口被占用、权限问题等。
  • 配置语法错误:
    • 运行配置测试:sudo nginx -t。仔细阅读输出,它会指出错误的文件和行号。根据提示修正配置。
  • 端口被占用:
    • 检查是否有其他程序正在使用 Nginx 需要监听的端口(通常是 80 和 443)。可以使用 sudo ss -tulnp | grep 80 (检查监听 80 端口的进程)。如果发现有其他进程占用了端口,您需要停止该进程或修改 Nginx 的监听端口。
  • 防火墙问题:
    • 确认防火墙 (UFW) 是否允许 Nginx 流量通过:sudo ufw status。确保 Nginx FullNginx HTTP/Nginx HTTPS 规则已添加并设置为 ALLOW
    • 如果您使用的是云服务器,检查云服务提供商的安全组或网络 ACL 配置,确保对应的端口是开放的。
  • 网站访问权限问题 (403 Forbidden):
    • 检查 Nginx worker 进程 (www-data 用户) 是否对网站根目录及其文件有读取权限。使用 ls -l /var/www/your_site_namesudo -u www-data cat /var/www/your_site_name/html/index.html 等命令测试。如果权限不足,使用 sudo chown -R www-data:www-data /path/to/your/websitesudo chmod -R 755 /path/to/your/website 调整权限。
  • 找不到文件 (404 Not Found):
    • 检查 Server Block 配置中的 root 指令是否正确指向了网站文件的实际路径。
    • 检查请求的 URI 是否与 location 块中的规则匹配,以及 try_files 指令是否正确配置。
    • 确认请求的文件确实存在于指定的 root 目录下。
  • Server Block 不生效:
    • 确认您在 sites-available 中创建了配置文件。
    • 确认您在 sites-enabled 中创建了指向 sites-available 配置文件的软链接:ls -l /etc/nginx/sites-enabled/
    • 确认您已经重新加载或重启了 Nginx 服务 (sudo systemctl reload nginxrestart)。
    • 检查您的 server_name 配置是否与您在浏览器中访问的域名一致。
    • 检查是否有其他 Server Block 的 server_name 与当前请求更匹配,或者是否存在没有 server_name 但监听相同端口的 Server Block 成了默认处理者。

12. 更新 Nginx

通过 apt 安装的 Nginx 可以通过标准的软件包更新流程进行更新。

“`bash

更新软件包列表

sudo apt update

升级所有可升级的软件包,包括 Nginx

sudo apt upgrade
“`

如果您只想单独升级 Nginx,可以使用:

bash
sudo apt install --only-upgrade nginx

更新后,通常 Nginx 服务会自动重启以加载新版本。如果需要,可以手动重启或重新加载。

13. 卸载 Nginx

如果您需要从系统中移除 Nginx,可以使用 apt removeapt purge 命令。

  • 仅移除 Nginx 软件包 (保留配置文件):

    bash
    sudo apt remove nginx

    这个命令会卸载 Nginx 程序本身,但会保留 /etc/nginx/ 目录下的配置文件,以便将来重新安装时可以使用。

  • 移除 Nginx 软件包及所有配置文件:

    bash
    sudo apt purge nginx

    这个命令会彻底移除 Nginx 及其相关的配置文件。

  • 移除不再需要的依赖:

    在移除 Nginx 后,可能有一些它依赖但现在已经不需要的其他软件包。可以使用 autoremove 命令清理这些不再使用的依赖。

    bash
    sudo apt autoremove

14. 总结与展望

恭喜您!通过本文,您已经成功地在 Ubuntu 系统上安装了 Nginx,了解了其基本的服务管理命令,并掌握了如何配置第一个网站 Server Block。您还对 Nginx 的配置文件结构、日志、静态文件服务、反向代理、SSL 和性能调优有了初步认识。

Nginx 是一个功能强大且灵活的工具,本文只是冰山一角。要充分发挥 Nginx 的潜力,您可以继续深入学习:

  • 更复杂的 Server Block 配置: 学习更详细的 location 块匹配规则、重写 URL (rewrite)、设置自定义错误页面等。
  • 反向代理高级配置: 学习负载均衡(如 upstream 块)、缓存 (proxy_cache)、连接池等。
  • 安全性增强: 学习如何阻止恶意请求、限制连接速率、配置 HTTP 基本认证等。
  • 更多模块的使用: Nginx 支持众多模块,如 FastCGI(与 PHP 配合)、uWSGI(与 Python 配合)、GeoIP、WebSockets 等。
  • 性能监控和调优: 学习如何使用 Nginx 的 Stub Status 模块监控状态,以及更深入的性能优化技术。

官方 Nginx 文档 (nginx.org/en/docs/) 是一个非常宝贵的资源,提供了最权威和详细的信息。通过不断实践和学习,您将能够驾驭 Nginx,构建高性能、可靠的网络服务。

希望这篇详细的指南对您有所帮助!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部