Nginx Web Server 是什么?安装、配置和最佳实践完整指南
Nginx(发音为”engine-x”)已成为互联网上部署最广泛的网络服务器之一——这是有原因的。从为高流量电子商务平台提供支持到充当复杂微服务架构的反向代理,Nginx 在轻量级、高效的软件包中提供了卓越的性能、可扩展性和安全性。
在本综合指南中,我们将详细介绍 Nginx 是什么、其架构如何工作、它与 Apache 的比较,以及如何在您自己的服务器上运行它——包括安全和性能最佳实践。
什么是 Nginx?
Nginx 是一个免费的开源网络服务器软件,通过互联网向用户提供网页和应用程序内容。Nginx 最初由 Igor Sysoev 在 2004 年发布,用于解决”C10K 问题”(处理 10,000 个并发连接),此后已发展成为全功能平台,被全球数百万个网站使用。
Nginx 与传统网络服务器的区别在于其事件驱动、异步、非阻塞架构。Nginx 不是为每个传入请求生成新的线程或进程(如较旧的服务器所做的那样),而是使用少量工作进程以最小的内存和 CPU 开销处理数千个并发连接。
无论您是在共享网络托管上运行简单的静态网站,还是在专用服务器上管理高可用性应用程序堆栈,Nginx 都是理想的选择。
Nginx 的主要功能
⚡ 高性能
Nginx 在提供静态内容(HTML 文件、CSS 样式表、JavaScript 包、图像和视频)时效率极高,资源消耗非常低。即使在重负载下,它也能保持快速的响应时间。
⚖️ 负载均衡
Nginx 可以使用多种算法(轮询、最少连接、IP 哈希)将传入流量分配到多个后端服务器,优化资源利用率并消除单点故障。
🔁 反向代理
作为反向代理,Nginx 位于后端应用程序服务器的前面,转发客户端请求,同时保护这些服务器免受直接互联网暴露。这增加了关键的安全和控制层。
🔒 SSL/TLS 终止
Nginx 本机处理 SSL/TLS 加密,将加密的计算开销从应用程序服务器卸载。将 Nginx 与受信任的SSL 证书配对可确保所有传输中的数据都被加密,并且您的网站获得用户和搜索引擎期望的信任信号。
🌐 广泛的应用程序兼容性
Nginx 与现代编程语言和框架无缝集成,包括 PHP(通过 PHP-FPM)、Python(Django、Flask)、Ruby on Rails、Node.js 和 Go。
🗜️ Gzip 压缩和缓存
对 Gzip 压缩和响应缓存的内置支持大大降低了带宽使用并加快了向最终用户的内容交付。
Nginx 如何工作?理解架构
要理解为什么 Nginx 性能如此出色,有助于了解其内部模型。
事件驱动、非阻塞 I/O
传统网络服务器(如较旧版本的 Apache)使用每连接进程或每连接线程模型。每个新请求都会生成一个新进程或线程,这会消耗内存和 CPU。在高并发下,这种方法的扩展性不好。
Nginx 采用了根本不同的方法:
- 单个主进程读取配置并管理工作进程。
- 多个工作进程(通常每个 CPU 核心一个)各自使用非阻塞 I/O 和事件循环处理数千个连接。
- 当工作进程在等待缓慢操作(如磁盘读取或上游响应)时,它不会闲置——它会处理队列中的其他事件。
这种架构允许单个 Nginx 实例处理数万个并发连接,同时消耗的内存仅为基于线程的服务器所需的一小部分。
请求处理流程
Client Request
↓
Nginx (Master Process)
↓
Worker Process (Event Loop)
↓
Static File? → Serve directly from disk
↓
Dynamic Content? → Forward to upstream (PHP-FPM, Node.js, etc.)
↓
Response returned to clientNginx 的常见用例
| 用例 | 描述 |
|---|---|
| 网络服务器 | 以高速和可靠性提供静态和动态网站 |
| 反向代理 | 将请求路由到后端应用程序服务器,提高安全性和性能 |
| 负载均衡器 | 在服务器池之间分配流量以实现高可用性 |
| API 网关 | 管理、路由和限制 API 流量到微服务 |
| 媒体流 | 高效地流式传输视频和音频内容 |
| SSL 终止 | 在将请求传递到后端服务器之前处理 HTTPS 加密 |
Nginx 与 Apache:您应该选择哪一个?
Nginx 和 Apache 都是生产级网络服务器,但它们适合不同的场景。以下是直接比较:
| 功能 | Nginx | Apache |
|---|---|---|
| 架构 | 事件驱动、异步 | 进程/线程驱动 |
| 静态内容 | 极快 | 中等 |
| 动态内容 | 通过外部处理器(PHP-FPM) | 通过模块本机(mod_php) |
| 并发 | 优秀(数千个连接) | 良好,但资源更重 |
| 配置 | 集中式、清晰的语法 | 分布式(.htaccess 支持) |
| 模块生态系统 | 不断增长、编译进去 | 广泛、动态可加载 |
| 内存使用 | 低 | 在负载下更高 |
| 最适合 | 高流量网站、代理、API | 共享托管、遗留应用 |
底线:对于高流量网站、反向代理设置和现代应用程序堆栈,Nginx 通常是更优的选择。Apache 在依赖 .htaccess 文件或特定 Apache 模块的环境中仍然很受欢迎。
如果您想要 Nginx 的强大功能和用户友好的管理界面,请考虑带有 cPanel 的 VPS 或探索 AlexHost 托管解决方案提供的完整VPS 控制面板范围。
如何在 Linux 上安装和配置 Nginx
让我们逐步介绍 Linux 服务器上 Nginx 的完整实际设置。
先决条件
- 运行 Ubuntu、Debian、CentOS 或 RHEL 的 Linux 服务器
- Root 或 sudo 访问权限
- 已注册的域名(您可以通过 AlexHost 注册域名)
步骤 1:安装 Nginx
在 Ubuntu / Debian 上:
sudo apt update
sudo apt install nginx -y在 CentOS / RHEL 上:
sudo yum install epel-release -y
sudo yum install nginx -y步骤 2:启动并启用 Nginx
启动服务并将其配置为在系统启动时自动启动:
sudo systemctl start nginx
sudo systemctl enable nginx验证它正在运行:
sudo systemctl status nginx您应该在输出中看到 active (running)。您也可以在浏览器中打开服务器的 IP 地址——您将看到默认的 Nginx 欢迎页面。
步骤 3:配置防火墙
允许 HTTP 和 HTTPS 流量通过防火墙:
UFW(Ubuntu/Debian):
sudo ufw allow 'Nginx Full'
sudo ufw reloadFirewalld(CentOS/RHEL):
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload步骤 4:了解 Nginx 配置结构
Nginx 的配置组织如下:
/etc/nginx/
├── nginx.conf ← Main configuration file
├── sites-available/ ← Virtual host config files (inactive)
│ └── example.com
├── sites-enabled/ ← Symlinks to active virtual hosts
│ └── example.com → ../sites-available/example.com
├── conf.d/ ← Additional configuration snippets
└── snippets/ ← Reusable config fragments主 nginx.conf 文件定义全局设置(工作进程、日志记录、MIME 类型),而各个服务器块(Nginx 的虚拟主机等效项)定义如何处理每个域或应用程序。
步骤 5:为您的域创建服务器块
为您的网站创建新的配置文件:
sudo nano /etc/nginx/sites-available/example.com粘贴以下配置(将 example.com 替换为您的实际域):
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.htm index.php;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
location / {
try_files $uri $uri/ =404;
}
}通过创建符号链接启用该网站:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/测试配置是否有语法错误:
sudo nginx -t重新加载 Nginx 以应用更改:
sudo systemctl reload nginx步骤 6:创建网络根目录
sudo mkdir -p /var/www/example.com/html
sudo chown -R $USER:$USER /var/www/example.com/html
echo "<h1>Welcome to example.com</h1>" > /var/www/example.com/html/index.html步骤 7:使用 SSL/TLS 启用 HTTPS
通过 HTTPS 提供您的网站对于安全性、SEO 和用户信任是不可协商的。添加免费 SSL 的最简单方法是通过 Certbot(Let’s Encrypt):
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d example.com -d www.example.comCertbot 将自动修改您的 Nginx 服务器块以处理 HTTPS 并设置自动证书续期。
对于生产环境和电子商务网站,请考虑使用高级SSL 证书以获得扩展验证和保修范围。
常见场景的 Nginx 配置
反向代理配置
将请求转发到在端口 3000 上运行的 Node.js 应用程序:
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_bypass $http_upgrade;
}
}负载均衡配置
在三个后端服务器之间分配流量:
upstream backend_pool {
least_conn; # Use least-connections algorithm
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_pool;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}PHP-FPM 集成
提供 PHP 应用程序(例如 WordPress):
server {
listen 80;
server_name example.com;
root /var/www/example.com/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
location ~ /.ht {
deny all;
}
}Nginx 的安全最佳实践
保护您的 Nginx 安装与正确配置一样重要。遵循以下加固步骤:
1. 隐藏 Nginx 版本信息
暴露您的服务器版本可帮助攻击者针对已知漏洞。禁用它:
# In the http block of nginx.conf
server_tokens off;2. 使用强密码套件启用 SSL/TLS
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;3. 添加安全标头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;4. 限制请求大小和速率
防止 DDoS 攻击和滥用:
# Limit body size (e.g., for file uploads)
client_max_body_size 10M;
# Rate limiting zone
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
# Apply rate limiting to a location
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
}5. 使用 IP 白名单限制访问
location /admin/ {
allow 203.0.113.0/24; # Your office IP range
deny all;
}6. 禁用不必要的 HTTP 方法
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 444;
}性能优化最佳实践
启用 Gzip 压缩
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;配置浏览器缓存
location ~* .(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}启用 HTTP/2
HTTP/2 通过多路复用和标头压缩显著改进页面加载性能:
listen 443 ssl http2;调整工作进程
# In nginx.conf
worker_processes auto; # Match number of CPU cores
worker_connections 1024; # Max connections per worker
use epoll; # Efficient event model on Linux
multi_accept on; # Accept multiple connections at once监控 Nginx
使用这些工具和技术密切关注您的 Nginx 服务器的健康状况:
启用 Nginx 状态模块
location /nginx_status {
stub_status on;
allow 127.0.0.1;
deny all;
}在本地访问它:
curl http://127.0.0.1/nginx_status有用的日志分析命令
# View real-time access logs
sudo tail -f /var/log/nginx/access.log
# Find the top 10 most requested URLs
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# Find the top 10 IP addresses by request count
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10为 Nginx 选择合适的托管
Nginx 在具有专用资源和完全 root 访问权限以调整配置时性能最佳。以下是将您的托管环境与您的需求相匹配的快速指南:
通过 AlexHost 的VPS 托管计划,您可以获得完全的 root 访问权
