Ubuntu 系统下 Nginx 完整安装与配置指南
Nginx(发音为 “engine-x”)是一款高性能的开源 Web 服务器、反向代理服务器以及电子邮件代理服务器。它以其卓越的并发处理能力、低内存消耗和出色的稳定性而闻名,被广泛应用于构建高流量的网站和应用程序。无论您是搭建个人博客、公司网站,还是部署复杂的微服务架构,Nginx 都能胜任。
本文将为您提供一个在 Ubuntu 操作系统上安装和配置 Nginx 的完整指南。我们将从最基本的安装步骤开始,逐步深入到核心配置、常用模块设置以及服务管理等方面,确保您能够掌握 Nginx 的基本使用。
目录
- 引言:为什么选择 Nginx?
- 环境准备:开始安装前的准备工作
- Ubuntu 系统要求
- 获取 Root 或 Sudo 权限
- 网络连接
- Nginx 安装方法
- 使用 Ubuntu 官方仓库 (推荐)
- 从 Nginx 官方仓库安装 (获取最新版本)
- 从源代码编译安装 (高级)
- 详细安装步骤:使用 Ubuntu 官方仓库 (最常用方法)
- 更新软件包列表
- 安装 Nginx
- 验证安装
- 配置防火墙 (UFW):允许 Nginx 流量通过
- 检查 UFW 状态
- 允许 Nginx 流量
- 验证防火墙规则
- Nginx 服务管理
- 启动、停止、重启和重新加载
- 检查服务状态
- 设置开机自启
- Nginx 核心配置文件结构与理解
- 主配置文件 (
nginx.conf
) - 虚拟主机配置 (
sites-available
和sites-enabled
) - 其他重要目录
- 主配置文件 (
- 基本配置:搭建第一个网站 (Server Block)
- 创建网站根目录
- 创建示例 HTML 文件
- 创建新的 Server Block 配置文件
- 配置 Server Block (
your_site_name.conf
) - 激活 Server Block (创建软链接)
- 测试 Nginx 配置语法
- 重新加载或重启 Nginx
- 通过浏览器访问网站
- 删除默认 Server Block (可选但推荐)
- 深入配置:常用功能介绍
- 日志配置 (访问日志与错误日志)
- 静态文件服务与缓存
- 反向代理配置
- SSL/TLS 配置 (HTTPS) – 简单介绍 Certbot
- Gzip 压缩配置
- Nginx 性能调优基础 (简述)
- Worker Processes 和 Worker Connections
- 连接 Keep-Alive
- 常见问题与故障排除
- Nginx 服务无法启动
- 配置语法错误
- 端口被占用
- 防火墙问题
- 网站访问权限问题
- 找不到文件 (404 Error)
- 更新 Nginx
- 卸载 Nginx
- 仅移除软件包
- 移除软件包及配置文件
- 移除不再需要的依赖
- 总结与展望
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 上通过几种不同的方式安装:
- 使用 Ubuntu 官方仓库 (推荐): 这是最简单、最方便的方法。Ubuntu 的官方软件包仓库中包含了稳定版本的 Nginx。通过
apt
包管理器安装非常快捷,且后续更新维护方便。通常,官方仓库提供的版本已经足够满足大多数需求,且与系统其他组件兼容性好。 - 从 Nginx 官方仓库安装: 如果您需要安装最新版本的 Nginx,或者特定的 Nginx Plus(商业版本)功能,可以添加 Nginx 官方维护的 APT 仓库。这样可以通过
apt
安装比 Ubuntu 官方仓库中更新的版本。 - 从源代码编译安装 (高级): 这种方法提供了最大的灵活性,您可以选择性地编译所需的模块,或者安装最新的开发版本。但过程相对复杂,需要手动解决依赖关系,不推荐初学者使用。
本文将重点介绍和推荐使用 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
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.com
或 www.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 的监听端口。
- 检查是否有其他程序正在使用 Nginx 需要监听的端口(通常是 80 和 443)。可以使用
- 防火墙问题:
- 确认防火墙 (UFW) 是否允许 Nginx 流量通过:
sudo ufw status
。确保Nginx Full
或Nginx HTTP
/Nginx HTTPS
规则已添加并设置为ALLOW
。 - 如果您使用的是云服务器,检查云服务提供商的安全组或网络 ACL 配置,确保对应的端口是开放的。
- 确认防火墙 (UFW) 是否允许 Nginx 流量通过:
- 网站访问权限问题 (403 Forbidden):
- 检查 Nginx worker 进程 (
www-data
用户) 是否对网站根目录及其文件有读取权限。使用ls -l /var/www/your_site_name
和sudo -u www-data cat /var/www/your_site_name/html/index.html
等命令测试。如果权限不足,使用sudo chown -R www-data:www-data /path/to/your/website
或sudo chmod -R 755 /path/to/your/website
调整权限。
- 检查 Nginx worker 进程 (
- 找不到文件 (404 Not Found):
- 检查 Server Block 配置中的
root
指令是否正确指向了网站文件的实际路径。 - 检查请求的 URI 是否与
location
块中的规则匹配,以及try_files
指令是否正确配置。 - 确认请求的文件确实存在于指定的
root
目录下。
- 检查 Server Block 配置中的
- Server Block 不生效:
- 确认您在
sites-available
中创建了配置文件。 - 确认您在
sites-enabled
中创建了指向sites-available
配置文件的软链接:ls -l /etc/nginx/sites-enabled/
。 - 确认您已经重新加载或重启了 Nginx 服务 (
sudo systemctl reload nginx
或restart
)。 - 检查您的
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 remove
或 apt 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,构建高性能、可靠的网络服务。
希望这篇详细的指南对您有所帮助!