CentOS 安装 Nginx:从基础到优化
引言
Nginx(发音为 “engine-x”)是一款高性能的 HTTP 和反向代理服务器,同时也可以作为邮件代理服务器和通用 TCP/UDP 代理服务器。它以其卓越的并发处理能力、低内存消耗和高稳定性而闻名,在全球范围内的Web服务器市场占据主导地位。
本文将详细介绍如何在 CentOS 系统上从零开始安装 Nginx,包括基础安装步骤、常用配置以及一系列性能优化策略,帮助您构建一个高效、稳定的 Web 服务环境。
第一部分:基础安装
在 CentOS 系统上安装 Nginx 相对直接。我们将通过 yum 包管理器来完成安装。
1.1 更新系统软件包
在安装任何新软件之前,始终建议更新系统以确保所有现有软件包都是最新的,这有助于避免潜在的依赖问题。
bash
sudo yum update -y
1.2 安装 EPEL 仓库
Nginx 在 CentOS 的默认仓库中可能不是最新版本,甚至可能不包含。EPEL (Extra Packages for Enterprise Linux) 仓库提供了许多额外的、高质量的软件包,其中就包括 Nginx。
bash
sudo yum install epel-release -y
1.3 安装 Nginx
现在,您可以从 EPEL 仓库安装 Nginx。
bash
sudo yum install nginx -y
1.4 启动并启用 Nginx 服务
安装完成后,Nginx 服务不会自动启动。您需要手动启动它,并设置开机自启,以确保服务器重启后 Nginx 也能正常运行。
bash
sudo systemctl start nginx
sudo systemctl enable nginx
1.5 检查 Nginx 状态
验证 Nginx 服务是否已经成功启动并正在运行。
bash
sudo systemctl status nginx
如果服务正常运行,您应该会看到类似 Active: active (running) 的状态信息。
1.6 配置防火墙
CentOS 默认启用了 firewalld 防火墙。为了让外部用户能够访问 Nginx 提供的 Web 服务,您需要开放 HTTP (80 端口) 和 HTTPS (443 端口)。
bash
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
这些命令将永久性地允许 HTTP 和 HTTPS 流量通过防火墙,并立即重新加载防火墙规则使其生效。
1.7 验证安装
打开您的 Web 浏览器,在地址栏中输入您的 CentOS 服务器的 IP 地址或域名。如果一切顺利,您应该能看到 Nginx 的默认欢迎页面(通常显示 “Welcome to Nginx!”)。
第二部分:基础配置
Nginx 的强大之处在于其灵活的配置。本节将介绍 Nginx 的配置文件结构,并演示如何创建一个简单的 Web 页面。
2.1 Nginx 配置文件结构概述
Nginx 的主配置文件位于 /etc/nginx/nginx.conf。这个文件包含了全局设置和 http 块,http 块中又可以包含一个或多个 server 块(类似于 Apache 的虚拟主机)。
为了更好地组织配置,Nginx 通常会通过 include /etc/nginx/conf.d/*.conf; 指令来加载 /etc/nginx/conf.d/ 目录下所有以 .conf 结尾的配置文件。我们强烈建议在这个目录中为每个网站或应用创建独立的配置文件,而不是直接修改 nginx.conf。
2.2 创建一个简单的网站
Nginx 在 CentOS 上的默认 Web 根目录通常是 /usr/share/nginx/html。让我们在此目录下创建一个简单的 index.html 文件。
bash
sudo bash -c 'echo "<h1>Welcome to Nginx on CentOS!</h1><p>This is a test page.</p>" > /usr/share/nginx/html/index.html'
2.3 测试配置并重载 Nginx
在修改 Nginx 配置(包括添加新的 conf.d 文件)后,务必先测试配置文件的语法是否正确,然后重载 Nginx 服务,以使更改生效。
bash
sudo nginx -t
sudo systemctl reload nginx
如果配置测试成功,您会看到 syntax is ok 和 test is successful 的消息。之后,重新访问您的服务器 IP 或域名,您将看到刚才创建的 “Welcome to Nginx on CentOS!” 页面。
第三部分:性能优化
Nginx 默认配置已经非常高效,但通过精细调整其配置,可以进一步提升性能、减少资源消耗并提高在高并发情况下的处理能力。本节将介绍一些常见的 Nginx 优化策略。
重要提示: 在进行任何配置修改之前,务必备份原始配置文件。
bash
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
以下是一个包含常见优化项的 /etc/nginx/nginx.conf 示例。请根据您的服务器硬件(CPU 核心数、内存)和实际业务需求进行调整。
“`nginx
======================== 全局配置 ========================
运行 Nginx 进程的用户
user nginx;
工作进程数。auto 会自动检测 CPU 核心数并设置。
每个工作进程都是单线程的,设置为 CPU 核心数可以充分利用多核优势。
worker_processes auto;
错误日志路径和级别。warn 是一个比较合适的级别。
error_log /var/log/nginx/error.log warn;
Nginx 主进程的 PID 文件路径
pid /var/run/nginx.pid;
======================== 事件模块配置 ========================
events {
# 每个工作进程的最大连接数。根据服务器内存和文件描述符限制调整。
# 太高可能导致文件描述符耗尽,太低则限制并发能力。
worker_connections 65535;
# Linux 系统推荐使用 epoll 事件模型,它提供了高效的 I/O 多路复用机制。
use epoll;
# 允许 Nginx 工作进程一次性接受所有新连接,而不是一个接一个。
multi_accept on;
}
======================== HTTP 服务器配置 ========================
http {
# 引入 MIME 类型映射文件
include /etc/nginx/mime.types;
# 默认 MIME 类型,当无法识别文件类型时使用
default_type application/octet-stream;
# 日志配置
# 定义日志格式
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;
# 对于高流量的静态文件服务,可以考虑关闭访问日志或使用缓冲日志以减少磁盘 I/O。
# 例如:access_log off;
# 或:access_log /var/log/nginx/access.log main buffer=16k flush=5s;
# sendfile 优化
# 启用 sendfile 可以让 Nginx 直接在内核中进行文件传输,减少数据拷贝,提高静态文件服务效率。
sendfile on;
# 配合 sendfile,在发送响应头和文件内容时,尝试一次性发送更多数据,减少网络包数量。
tcp_nopush on;
# 禁用 Nagle 算法,实时发送数据,减少延迟,适用于交互式应用。
tcp_nodelay on;
# Keep-Alive 连接
# 客户端连接的保持时间。适当延长可减少 TCP 连接的建立和关闭开销。
keepalive_timeout 65;
# 单个 keep-alive 连接上允许的最大请求数。
keepalive_requests 1000;
# 客户端请求体和头部缓冲区大小
client_body_buffer_size 128k; # 客户端请求体缓冲区大小
client_header_buffer_size 1k; # 客户端请求头缓冲区大小
large_client_header_buffers 4 8k; # 大型客户端请求头缓冲区数量和大小
# Gzip 压缩
gzip on; # 启用 Gzip 压缩,可显著减少传输数据大小,加快页面加载速度。
gzip_vary on; # 告诉代理服务器根据 Accept-Encoding 头缓存不同版本的资源。
gzip_proxied any; # 对所有代理请求启用 Gzip 压缩。
gzip_comp_level 6; # 压缩级别 (1-9),6 是平衡性能和压缩比的推荐值。
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 image/svg+xml;
# 客户端超时
client_max_body_size 100m; # 限制客户端上传的最大文件大小,防止恶意攻击。
client_body_timeout 12s; # 客户端发送请求体超时时间。
client_header_timeout 12s; # 客户端发送请求头超时时间。
send_timeout 10s; # Nginx 向客户端发送响应的超时时间。
# 静态文件缓存(浏览器缓存)
# 可以在 server 或 location 块中设置,例如:
# location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml|svg)$ {
# expires 30d; # 静态文件在浏览器缓存 30 天。
# log_not_found off; # 对于静态文件,可以关闭未找到日志。
# }
# 引入 /etc/nginx/conf.d/ 目录下的所有 .conf 配置文件。
include /etc/nginx/conf.d/*.conf;
}
“`
3.2 优化项详解
worker_processes auto;: Nginx 采用 Master-Worker 进程模型。worker_processes设置工作进程的数量,auto会根据 CPU 核心数自动调整,充分利用多核处理器性能。worker_connections 65535;: 提高每个工作进程能够处理的最大并发连接数。这个值需要根据服务器的内存和系统文件描述符限制进行调整。use epoll;: 在 Linux 系统上,epoll是最高效的事件处理模型,能够处理大量并发连接,提高 I/O 效率。sendfile on;: 启用sendfile可以让 Nginx 直接在内核中进行文件传输,避免了数据在用户空间和内核空间之间的多次拷贝,显著提高了静态文件服务的性能。tcp_nopush on;: 配合sendfile使用,Nginx 会在发送响应头和文件内容时,尝试一次性发送更多数据,减少网络包的数量,提高传输效率。tcp_nodelay on;: 禁用 Nagle 算法,使得数据包可以立即发送,减少延迟。这对于需要低延迟的交互式应用特别有用。keepalive_timeout 65;: 保持客户端连接的超时时间。适当延长keepalive_timeout可以减少 TCP 连接的建立和关闭开销,在高并发场景下提升性能。gzip on;: 启用 Gzip 压缩可以显著减少传输数据的大小,尤其对于文本文件(HTML, CSS, JavaScript, JSON 等)效果明显,从而加快页面加载速度并节省带宽。gzip_comp_level 6;: 压缩级别,1 是最低(速度最快),9 是最高(压缩比最大)。6 是一个很好的平衡点。gzip_types: 指定需要压缩的文件类型。
client_max_body_size 100m;: 限制客户端请求体的大小,防止恶意上传大文件或缓冲区溢出攻击。expires 30d;: 在location块中为静态文件(如图片、CSS、JS)设置expires头,可以利用浏览器缓存,减少重复请求,加快用户对页面的后续访问速度。access_log off;或access_log /var/log/nginx/access.log main buffer=16k flush=5s;: 对于访问量极大的静态文件服务,频繁写入访问日志会产生大量的磁盘 I/O。可以选择关闭日志或使用缓冲日志来减少 I/O 压力。
3.3 应用优化配置
- 使用
sudo vi /etc/nginx/nginx.conf或您喜欢的编辑器打开 Nginx 主配置文件。 - 将上述优化配置粘贴到文件中,替换或修改相应的指令。
- 保存文件并退出编辑器。
- 测试 Nginx 配置语法:
bash
sudo nginx -t - 如果测试成功,重载 Nginx 服务以应用更改:
bash
sudo systemctl reload nginx
总结
通过遵循本文的步骤,您已经在 CentOS 系统上成功安装了 Nginx,并对其进行了基础配置和一系列关键的性能优化。从处理高并发连接到减少传输延迟和带宽消耗,这些优化措施将帮助您的 Nginx 服务器提供更稳定、更快速的 Web 服务。
请记住,Nginx 的优化是一个持续的过程。您应该根据服务器的实际负载、访问模式和业务需求,持续监控 Nginx 的性能指标,并适时调整配置,以达到最佳的运行状态。