Nginx 已成为最受欢迎的 Web 服务器和反向代理解决方案之一,以其高性能、可扩展性和易用性而广受认可。根据W3Techs 2025 年的一项调查,Nginx 为全球超过 33% 的网站提供支持。这使得它成为现代服务器配置的重要工具。本指南将全面介绍 Nginx 及其主要功能,并涵盖在服务器上配置 Nginx 的基本步骤,以提高性能并确保安全高效的运行。无论您是初学者还是经验丰富的用户,本指南都将帮助您充分利用 Nginx 来满足您的 Web 服务器需求。
什么是 Nginx?
Web 服务器是互联网的重要组成部分,用于提供用户请求的网页。要将您的计算机变成 Web 服务器,您必须安装 Nginx、XAMPP、Apache、Tornado、Caddy 或 Microsoft Internet Information Services (IIS) 等软件。其中,Ngnix 和 Apache是世界上使用最广泛的两种 Web 服务器。在本指南中,我们将重点介绍 Nginx。
Nginx(发音为“Engine-X”)是一款开源 Web 服务器软件,通常用作反向代理或 HTTP 缓存。它旨在实现最佳性能和稳定性,并提供 HTTPS 服务器功能。此外,它还可以用作 IMAP、POP3 和 SMTP 等电子邮件协议的代理。
Nginx的历史和演变
Nginx由 Rambler 系统管理员Igor Sysoev于 2002 年开发,旨在解决高负载下 Nginx 的卡顿问题。该软件于 2004 年公开发布,并迅速得到广泛应用。2011 年,Igor 的公司参与了 Nginx 的发布,两年后,他们推出了 Nginx 的付费扩展版本,名为Nginx Plus。
Nginx 的架构
Nginx 的架构如下:
- 异步。所有请求都在不同的阶段进行处理,从而提高了处理速度。
- 模块化。这指的是 Nginx 的内部结构,由核心和多个模块组成。
核心负责创建 Web 服务器的基础、运行 Web 服务器以及执行反向代理功能。大多数协议和应用程序功能都是使用模块(而非核心)实现的。这些协议模块使 Nginx 能够使用 HTTPS、TLS/SSL、SMTP、POP3 和 IMAP。
- 面向事件。Nginx 使用多路复用和事件通知,将特定任务分配给各个进程。
- “主从”模型。
“主节点”通过创建、绑定和遍历套接字来读取和检查配置。它们负责启动、结束和维护多个已配置的工作进程。主节点可以在不中断服务的情况下更改工作进程。
连接由多个单线程进程“工作进程”处理。在每个工作进程中,Nginx 可以处理多个同时的连接和请求。
代理缓存是一种独特的操作,它包含一个缓存管理器和一个加载器。缓存加载器会检查磁盘上的缓存项,并将缓存元数据添加到引擎的内存数据库中。它会准备 Nginx 的副本,以便处理已以独特结构存储在磁盘上的文件。缓存管理器负责使缓存失效和过期。
Nginx的主要特性
Nginx 具有以下功能:
- 高速
在处理不需要持续更新的静态内容时,这一点尤为明显。当用户加载页面时,Nginx Web 服务器会缓存数据并返回结果。后续页面请求的响应速度将提升数倍。
- 负载平衡功能
Nginx 支持多种负载均衡算法,包括循环调度、最小连接数和 IP 哈希。这些算法将流量分配到多个服务器,从而确保高可用性并提高资源利用率。
- 性能和可扩展性
Nginx 处理 HTML、CSS 和图像等静态内容。其简洁的事件驱动架构使其能够以极低的内存占用管理数千个并发连接。这使得它即使在高流量下也能保持高度可扩展性和高性能。
- 灵活性
Nginx 软件易于设置和配置,可以满足您的特定基础设施要求。
- 低内存消耗
为了减少 RAM 消耗并最小化负载,Nginx 使用了一个称为“池”的专用内存段。此池是动态的,并根据传入请求的需要进行扩展。
- 反向代理功能
Nginx 充当反向代理,将客户端请求转发到内部服务器,并将响应发送给客户端。这提高了安全性,隐藏了内部服务器数据,并改善了流量处理。
- 多平台
Nginx 功能多样,可在各种操作系统 (OS) 上运行,包括 Linux 及其发行版(Ubuntu、Debian、CentOS、Red Hat Enterprise Linux [RHEL]、Fedora、openSUSE 等)、Unix (BSD)、macOS、Windows、Docker 和云平台(Amazon Web Services [AWS]、Microsoft Azure、Google Cloud Platform [GCP] 等)。
- 良好的支持
Nginx 拥有活跃的社区、强大的客户支持以及英语和俄语文档。
- 可用性
Nginx 是免费且开源的,允许开发人员根据自己的需求进行调整。
安装和配置Nginx
无论使用哪种操作系统 (OS),安装 Nginx 都非常简单。所有与配置和安装相关的信息都可以在 Nginx 官方文档中找到。本文不会重点介绍某个特定的操作系统,因为 Nginx 的配置在不同平台上几乎完全相同。文件格式保持不变,因此只需进行少量调整(主要是更新文件和目录的路径)即可轻松将配置迁移到其他操作系统。由于 Nginx 是许多 Linux 发行版的首选,我们将介绍如何在流行的 Linux 发行版上安装它。
安装 Nginx
如果您的系统上尚未安装 Nginx,您可以按照以下步骤轻松安装:
1. 在您的设备上打开命令提示符。要打开命令行,请按键盘快捷键“ Win + R ”(Windows)、“ Ctrl + Alt + T ”(Linux),或按下设备上的终端按钮(macOS)。
2.在出现的窗口中,输入“ cmd ”,然后单击“确定”。
3. 在出现的命令提示符中,键入以下命令:
apt-get install nginx -y
对于基于 deb 的发行版(Debian 和其他),输入:
sudo apt update && sudo apt install nginx
对于基于 rpm 的版本(CentOS 和其他版本),请输入:
sudo dnf update && sudo dnf install nginx
4. 重启 Nginx:
service nginx restart
运行 Nginx
要启动 Nginx,请运行以下命令:
1.安装后启动Nginx。
apt-g
2. 系统重启后自动启动 Nginx 如下:
sudo systemctl enable
3.使用以下命令检查服务状态:
sudo systemctl status nginx
4.如果Nginx启动成功,您将看到以下内容:
...
Loaded: loaded
Active: active (running)
...
5. 如果您在浏览器中输入服务器地址(本地安装时输入 http://localhost,远程安装时将 localhost 替换为 IP 地址或站点域名),您应该会看到 Nginx 欢迎页面:
6. 如果您在启动 Nginx 时遇到问题,则可能需要向防火墙添加规则。
7. 您可以在服务日志中查看有关 Nginx 运行的详细报告(稍后会详细介绍)、在终端中查看,或者使用以下命令查看:
sudo journalctl -u nginx
Docker 中的 Nginx
在容器内运行 Nginx 对于开发来说非常方便,因为它允许您调试具有不同设置和程序版本的无限站点副本。
要在新容器中运行 Nginx,请按照以下步骤操作:
1.如果您的网站将在容器中运行并且您已经安装了 Docker,则可以使用以下命令在新容器中启动 Nginx:
docker run -p 80:80 nginx
如果尚未安装,此命令还将自动从官方映像下载并安装 Nginx。
2.查看正在运行的容器列表:
docker ps
3. 此命令的输出中应出现以下行:
... nginx ... 0.0.0.0:80->80/tcp ...
这意味着 Nginx 已准备好接受到您服务器 IP 地址的传入 HTTP 连接。例如,如果 Docker 安装在本地,则当您在浏览器中访问 http://localhost 时,应该会出现 Nginx 欢迎页面:
这意味着您已成功启动 Nginx,并且默认配置已为我们处理了主要设置。
配置 Nginx
要设置 Nginx 并管理其配置,请按照以下步骤操作:
1.输入以下命令获取主配置文件:
/etc/nginx/nginx.conf
2. 将显示 Nginx 配置的总体结构。服务器块包含您网站的主要设置,位置块处理请求地址中的特定路径(URI)。
...
http {
...
server {
...
location ... {
...
}
}
}
指令可以位于块的内部或外部。这些行包含指令的名称、参数以及末尾的分号。
配置设置时,建议遵循“一个站点 – 一个配置文件”的规则。不建议将所有设置直接输入到 nginx.conf 文件中,原因如下:
- 如果包含多个站点和服务器块,则文件会变得太大且太复杂而难以读取。
- 不同块中的重复设置通常被提取到单独的文件中,并使用 include 指令包含在正确的位置。
- 将每个服务器块的设置存储在单独的配置中,您只需重命名或移动单个文件即可轻松连接和断开站点。
- 您始终可以看到众多文件中最后修改的是哪个文件。
- 将站点设置存储在单独的文件中可防止编辑时意外损坏整体配置。
下面是 Debian 中 nginx.conf 文件的完整配置,该配置在安装软件包时自动执行:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
}
http {
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
gzip on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
这也是CentOS中 nginx.conf 文件的完整配置,在安装包时自动执行:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
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;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
配置 nginx.conf 文件的唯一区别在于,与 Debian 不同,CentOS 在其主配置中包含一个默认站点服务器块。在 Debian 中,此块位于 /etc/nginx/sites-enabled/ 目录中的单独文件中,并使用 include 指令启用。
安装完成后,您将发现一个“默认”文件(链接 /etc/nginx/sites-available/default),它接受端口 80 上的传入连接。这是 HTTP 协议的默认端口。
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ =404;
}
}
接下来,使用nano编辑器在 /etc/nginx/conf.d/ 目录中创建 example.conf 文件,其中包含您的第一个站点的设置 – 或者用 Nginx 术语来说,是“虚拟服务器” – 运行以下命令:
sudo nano /etc/nginx/conf.d/example.conf
将以下行添加到文件:
server {
listen 8080;
root /var/www/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
您会注意到,由于默认服务器已经占用了端口 80,新的虚拟服务器会监听端口 8080。要保存设置,请重新启动 Nginx 配置。
sudo systemctl restart nginx
要检查结果,请在浏览器地址栏中输入 http://localhost:8080/ 。如果一切正确,应该会出现熟悉的欢迎页面。
接下来,为了让 Nginx 将传入连接重定向到 php-fpm 服务,您需要编辑 example.conf 并在服务器块中添加另一个位置块:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass 127.0.0.1:9000;
}
如果您的服务在不同的物理服务器上运行,请将所有 127.0.0.1 替换为适当的网络 IP 地址。
站点配置的完整版本现在应如下所示:
server {
listen 8080;
root /var/www/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass 127.0.0.1:9000;
}
}
要将更改应用到设置,请重新启动 Nginx:
sudo systemctl restart nginx
配置安全连接
如果您的服务器接受或传输敏感的用户数据(例如登录或付款信息),则应在 Nginx 中启用并安装 SSL 证书以建立安全连接。这可确保使用 HTTPS 安全数据传输协议传输数据,该协议默认在端口 443 上运行。
在 Nginx 中启用 SSL
要在 Nginx 中使用 SSL,您需要:
1.更改服务器块设置以允许监听端口 443。
listen 443 ssl;
2. 指定密钥文件和 SSL 证书的路径。
ssl_certificate example.ru.crt
ssl_certificate_key example.ru.key;
这使得 Nginx 能够安全地处理 HTTPS。
获取并安装 SSL 证书
您可以从商业提供商或受信任的证书颁发机构 (CA) 获取 SSL 证书,例如Let’s Encrypt,它们免费提供 SSL 证书。获取证书后,将其放置在适当的目录中,并在 Nginx 配置中指定该目录,以将其安装在服务器上。
要安装 SSL 证书,请按照以下步骤操作:
1. 获得证书后,添加 Let’s Encrypt 证书行:
ssl_certificate /etc/letsencrypt/live/example.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.ru/privkey.pem;
2. 使用私钥限制对文件的访问权限,然后应用以下工作站点配置:
server {
listen 8080;
root /var/www/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass 127.0.0.1:9000;
}
}
server {
listen 443 ssl;
server_name example.ru www.example.ru;
root /var/www/html;
index index.html index.htm;
charset UTF-8;
ssl_certificate /etc/letsencrypt/live/example.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.ru/privkey.pem;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass 127.0.0.1:9000;
}
}
certbot客户端可以自动更新 Let’s Encrypt SSL 证书。有关如何设置的文档可在官方网站上找到。
配置 HTTPS 以实现安全通信
为防止用户意外访问 HTTP 登录页面,请在安装 SSL 证书并配置安全 SSL 设置后,将 HTTP 流量重定向到 HTTPS。请按以下步骤操作:
1. 在监听端口 80 的服务器块中,将以下指令添加到站点配置文件中:
return 301 https://$host$request_uri;
2.重启Nginx并获取新版本的文件:
server {
listen 80;
server_name example.ru www.example.ru;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.ru www.example.ru;
root /var/www/html;
index index.html index.htm;
charset UTF-8;
ssl_certificate /etc/letsencrypt/live/example.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.ru/privkey.pem;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass 127.0.0.1:9000;
}
}
如果需要更改主 Nginx 配置文件,请制作备份:
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.orig
启用 HTTPS 协议后,请检查您的设置是否符合现代安全标准。您可以使用HTTP Observatory、Wormly等在线服务轻松完成此操作。
笔记:
- 本指南中使用的指令的完整列表可以在官方 Nginx 网站上找到。
您在主配置文件中使用这些指令设置的 Nginx 参数会被虚拟服务器文件继承,但您始终可以在虚拟服务器文件中覆盖它们。换句话说,除非在站点配置中明确指定,否则 Nginx 将应用 nginx.conf 文件中的所有参数。
- 您还可以在配置文件中使用内置变量。完整的内置变量列表请参阅Nginx 官方文档。
常见的 Nginx 错误及其解决方案
在服务器上设置 Nginx 时,用户可能会遇到问题和错误。虽然调试服务的最佳实践包括分析日志和检查服务状态,但了解常见错误及其解决方案至关重要。以下是 Nginx 中一些最常见的错误代码及其解决方法。
502错误的网关
当 Nginx 无法连接到上游服务器时,会发生此错误。要修复此错误,请检查上游服务器是否正在运行,并验证 Nginx 是否已正确配置。
503 服务不可用
当 Nginx 因过载或维护而无法连接后端服务器时,会出现“503 服务不可用”错误。请确保后端服务器正常运行且其资源得到充分利用。
504 网关超时
“ 504 网关超时” 表示 Nginx 等待上游服务器响应的时间过长。请检查 Nginx 配置中的超时设置,确保后端服务器在可接受的时间内响应。
403 禁止
“ 403 错误”通常表示 Nginx 由于文件权限不正确或配置限制而阻止访问。请验证网站根目录的权限设置是否正确,并检查 Nginx 配置中的所有安全设置。
413 请求实体太大
当客户端发送的请求超出允许的主体大小时,就会发生这种情况。要允许较大的请求,请增加 Nginx 配置中的 client_max_body_size 指令。
404 未找到
此错误表示未找到请求的资源。请检查 URL 中的错误,确保文件位于正确的位置,并验证 Nginx 配置中指定了正确的根目录。
您可以通过识别每个错误的根本原因并相应地调整 Nginx 或服务器设置来快速解决这些常见问题。
配置 Nginx 以获得最佳性能的 10 个最佳实践
本节介绍配置 Nginx 以获得最佳性能的最佳实践。遵循这些建议,您可以配置 Nginx 以高效处理更多流量、降低延迟,并确保即使在高负载下也能保持高性能。
- 明智地使用工作进程和连接。
为了保证高效的请求处理,请根据服务器资源和流量大小配置worker_processes和worker_connections,其中worker_processes一般设置为与CPU核心数匹配。
- 启用 Gzip 压缩。
使用 Gzip 压缩文本文件(HTML、CSS 和 JavaScript)以减少带宽使用和加载时间。
- 提供静态文件。
为了加速交付,请使用 Nginx 直接管理静态内容(图片、CSS 和 JavaScript)。使用 location 指令可以高效地提供静态文件并减少服务器负载。
- 优化缓冲区和缓存设置。
启用 Nginx 的 proxy_cache 和 fastcgi_cache 命令来缓存动态和静态内容,从而减少后端负载并缩短响应时间。设置缓存过期规则,尽可能保持缓存的更新和高效。
- 使用保持活动连接。
启用 keepalive_timeout 以维持客户端和服务器之间的持久连接。这有助于减少开销并提高多个请求的性能。
- 平衡负载。
使用 Nginx 的内置负载平衡功能在多个后端服务器之间分配流量,以提高可扩展性和可靠性。
- 启用 HTTP/2。
启用 HTTP/2 以提高性能,尤其是提供静态内容、减少延迟和允许请求多路复用。
- 最小化日志记录。
为了减少 I/O 开销,请设置适当的日志记录级别并避免过多的日志记录,尤其是在生产中。
- 定期监控 Nginx。
使用Nginx Amplify或Prometheus等监控工具来跟踪服务器性能、错误率和流量模式。定期监控可以提高服务器性能并识别瓶颈。
- 限制请求率。
使用速率限制来确保服务器资源在客户端之间公平分配并防止滥用。
遵循这些准则,您可以配置 Nginx 以有效处理更多流量、减少延迟并确保即使在高负载下也能保持高性能。
结论
在您的服务器上安装 Nginx 可提供强大的安全性和最佳性能。您可以通过遵循最佳实践(例如有效的负载平衡、适当的 SSL 配置以及高效的静态内容服务)来最大限度地提高速度和安全性。定期维护和更新可确保 Nginx 与新功能和安全修复兼容。HTTP/3 支持以及与云架构集成等未来趋势将扩展 Nginx 的功能,使其成为现代 Web 服务器管理的必备工具。