Nginx 完全指南:安装、配置与优化
Nginx (发音为 “engine-x”) 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。它以其卓越的性能、稳定性、丰富的功能集、简单的配置以及低资源消耗而闻名。无论是作为 Web 服务器、反向代理、负载均衡器还是 HTTP 缓存,Nginx 都是现代 Web 架构中不可或缺的组件。
本指南将带您深入了解 Nginx 的安装、基本配置,并提供一些优化建议,帮助您充分发挥 Nginx 的潜力。
第一部分:Nginx 的安装
Nginx 可以在多种操作系统上安装,包括 Linux (Debian/Ubuntu, CentOS/RHEL)、macOS 和 Windows。推荐在 Linux 环境下部署 Nginx,以获得最佳性能和稳定性。
1. Linux (Debian/Ubuntu)
对于 Debian 或 Ubuntu 系统,安装 Nginx 非常简单:
“`bash
更新软件包列表
sudo apt update
安装 Nginx
sudo apt install nginx
检查 Nginx 服务状态
sudo systemctl status nginx
“`
安装完成后,Nginx 服务通常会自动启动。您可以通过浏览器访问 http://localhost 或服务器的 IP 地址,应该能看到 Nginx 的欢迎页面。
2. Linux (CentOS/RHEL)
对于 CentOS 或 RHEL 系统,您需要先启用 EPEL 仓库:
“`bash
安装 EPEL 仓库
sudo yum install epel-release -y
安装 Nginx
sudo yum install nginx -y
启动 Nginx 服务
sudo systemctl start nginx
设置 Nginx 开机自启
sudo systemctl enable nginx
检查 Nginx 服务状态
sudo systemctl status nginx
如果启用了防火墙,需要放行 HTTP/HTTPS 端口
sudo firewall-cmd –permanent –add-service=http
sudo firewall-cmd –permanent –add-service=https
sudo firewall-cmd –reload
“`
3. 从源码编译安装 (适用于所有 Linux)
如果您需要最新的 Nginx 版本或特定的模块,可以从源码编译安装。这需要一些额外的依赖。
“`bash
安装编译依赖 (以 Debian/Ubuntu 为例)
sudo apt update
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
下载 Nginx 源码 (访问 Nginx 官网获取最新稳定版链接)
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
配置编译选项 (可以根据需要添加更多模块,如 –with-http_stub_status_module)
./configure –prefix=/usr/local/nginx –with-http_ssl_module –with-http_gzip_static_module
编译并安装
make
sudo make install
创建软链接到 /usr/local/bin (可选,方便直接运行 nginx 命令)
sudo ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx
手动启动 Nginx
sudo /usr/local/nginx/sbin/nginx
关闭 Nginx
sudo /usr/local/nginx/sbin/nginx -s stop
重载配置
sudo /usr/local/nginx/sbin/nginx -s reload
“`
提示: 源码安装后,您需要手动创建 Systemd 服务文件 (/etc/systemd/system/nginx.service) 来管理 Nginx 服务。
第二部分:Nginx 的配置
Nginx 的主要配置文件是 /etc/nginx/nginx.conf (对于包管理器安装) 或 /usr/local/nginx/conf/nginx.conf (对于源码安装)。这个文件通常会包含一个 include 指令,用于加载 /etc/nginx/conf.d/*.conf 或 /etc/nginx/sites-enabled/* 目录下的其他配置文件,以便更好地组织配置。
1. 主要配置结构
Nginx 配置主要由几个块组成:
“`nginx
全局块:配置影响 Nginx 服务器整体运行的参数,如 worker 进程数、错误日志等
user nginx; # Nginx 运行的用户
worker_processes auto; # worker 进程数量,推荐设置为 CPU 核心数或 auto
error_log /var/log/nginx/error.log warn; # 错误日志路径和级别
pid /var/run/nginx.pid; # Nginx master 进程的 PID 文件
events {
# events 块:配置 Nginx 进程与连接相关的设置,如最大连接数、事件模型等
worker_connections 1024; # 每个 worker 进程允许的最大并发连接数
# use epoll; # 在 Linux 系统上推荐使用 epoll 事件模型
}
http {
# http 块:HTTP 服务器的核心配置,包括 MIME 类型、日志、gzip 压缩、虚拟主机等
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; # 访问日志路径和格式
sendfile on; # 启用 sendfile 零拷贝,提高文件传输效率
#tcp_nopush on; # 与 sendfile 配合使用,在一个包中发送响应头和第一个数据块
keepalive_timeout 65; # 保持连接的超时时间
gzip on; # 启用 gzip 压缩
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# server 块:定义一个虚拟主机,处理特定域名或端口的请求
server {
listen 80; # 监听 80 端口
server_name example.com www.example.com; # 绑定的域名
# location 块:定义如何处理匹配特定 URI 模式的请求
location / {
root /usr/share/nginx/html; # 静态文件根目录
index index.html index.htm; # 默认索引文件
}
error_page 500 502 503 504 /50x.html; # 错误页面配置
location = /50x.html {
root /usr/share/nginx/html;
}
# 反向代理示例
# location /api/ {
# proxy_pass http://backend_server:8080/;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# }
}
# 另一个 server 块,可以用于配置 HTTPS 或其他域名
# server {
# listen 443 ssl;
# server_name secure.example.com;
# ssl_certificate /etc/nginx/ssl/server.crt;
# ssl_certificate_key /etc/nginx/ssl/server.key;
# # ... 其他 SSL 配置
# }
}
“`
2. 常用配置场景
a. 静态文件服务器
这是 Nginx 最基本的用途。只需配置 root 和 index 指令:
“`nginx
server {
listen 80;
server_name your_domain.com;
location / {
root /var/www/html/your_site; # 网站文件存放路径
index index.html index.htm;
try_files $uri $uri/ =404; # 尝试查找文件或目录,如果找不到则返回 404
}
}
“`
b. 反向代理
将请求转发到后端应用服务器,实现负载均衡、隐藏后端服务等。
“`nginx
upstream backend_pool {
server backend1.example.com:8080;
server backend2.example.com:8080;
# 可以添加权重、备用服务器等
# server backend3.example.com:8080 weight=5;
# server backup.example.com:8080 backup;
}
server {
listen 80;
server_name your_app.com;
location / {
proxy_pass http://backend_pool; # 将请求转发到 upstream 定义的后端池
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; # 转发客户端 IP 列表
proxy_set_header X-Forwarded-Proto $scheme; # 转发客户端使用的协议 (http/https)
}
# 对于 WebSocket 代理,需要特殊配置
location /ws {
proxy_pass http://backend_pool;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
“`
c. SSL/TLS 配置 (HTTPS)
为网站启用 HTTPS 是现代 Web 的最佳实践。这需要您有 SSL 证书和私钥 (可以从 Let’s Encrypt 免费获取)。
“`nginx
server {
listen 80;
server_name your_domain.com;
return 301 https://$host$request_uri; # 将所有 HTTP 请求重定向到 HTTPS
}
server {
listen 443 ssl http2; # 监听 443 端口,启用 SSL 和 HTTP/2
server_name your_domain.com;
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem; # 您的 SSL 证书
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem; # 您的 SSL 私钥
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"; # 推荐的加密套件
ssl_prefer_server_ciphers on;
# HSTS (HTTP Strict Transport Security)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
location / {
root /var/www/html/your_site;
index index.html;
try_files $uri $uri/ =404;
}
}
“`
3. 测试和重载配置
在修改 Nginx 配置文件后,务必测试配置文件的语法,然后重载 Nginx 服务。
“`bash
测试配置语法
sudo nginx -t
如果语法无误,重载 Nginx 服务
sudo systemctl reload nginx # 或 sudo service nginx reload
“`
第三部分:Nginx 的优化
Nginx 的默认配置已经很高效,但通过一些调整,可以进一步提升其性能、安全性和稳定性。
1. 性能优化
worker_processes: 设置为auto或 CPU 核心数,可以充分利用多核处理器。
nginx
worker_processes auto;worker_connections: 增加每个 worker 进程的最大并发连接数。根据服务器内存和打开文件限制进行调整。
nginx
events {
worker_connections 4096; # 例如
}sendfile on;: 启用零拷贝技术,减少 CPU 开销。tcp_nopush on;: 配合sendfile使用,在发送响应头和第一个数据块时,尽可能在一个 TCP 包中完成。tcp_nodelay on;: 在keepalive连接上禁用 Nagle 算法,减少小数据包延迟。keepalive_timeout: 适当延长keepalive_timeout可以减少 TCP 连接建立的开销,但过长会占用资源。通常 15-30 秒是合理的。gzip on;: 启用 gzip 压缩,减少传输数据量,但会增加 CPU 负载。gzip_types: 仅压缩文本类型文件。gzip_comp_level: 压缩级别 (1-9),6 是一个很好的平衡点。
- 缓存静态文件: 利用
expires或add_header Cache-Control设置浏览器缓存。
nginx
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d; # 缓存 30 天
log_not_found off; # 不记录找不到的日志
} - 开启 HTTP/2: 启用 HTTP/2 协议可以提高加载速度,特别是在 HTTPS 环境下。
nginx
listen 443 ssl http2; - 使用
try_files替代if (-f $request_filename):try_files更高效。
2. 安全优化
- 隐藏 Nginx 版本信息: 避免攻击者了解您的 Nginx 版本。
nginx
http {
server_tokens off; # 全局设置
} - 最小权限运行: Nginx 应该以非 root 用户运行 worker 进程。
nginx
user nginx; # 在全局块中设置 - 限制请求方法: 如果不需要,限制只允许
GET,HEAD,POST。
nginx
location / {
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 405;
}
# ...
} - 拒绝恶意 User-Agent: 阻止一些已知的爬虫或扫描工具。
nginx
if ($http_user_agent ~* (badbot1|badbot2)) {
return 403;
} - 防止目录遍历: 确保
autoindex off;禁用目录列表。 - 限制 IP 访问: 针对特定路径或整个网站限制访问。
nginx
location /admin {
allow 192.168.1.0/24; # 允许特定 IP 段访问
deny all; # 拒绝其他所有
} - 强大的 SSL/TLS 配置: 使用最新的协议 (TLSv1.2, TLSv1.3) 和强加密套件。
- HSTS (HTTP Strict Transport Security): 强制浏览器始终通过 HTTPS 访问网站。
3. 稳定性与日志管理
- 日志轮转: 配置
logrotate来管理 Nginx 的访问日志和错误日志,防止日志文件过大。- 通常包管理器安装的 Nginx 会自动配置。
-
限制并发连接数和请求速率: 防止 DDoS 攻击或滥用。
“`nginx
# 在 http 块中定义
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_req_zone $binary_remote_addr zone=req:10m rate=1r/s; # 每秒1个请求server {
# …
location / {
limit_conn addr 10; # 每个 IP 最多 10 个并发连接
limit_req zone=req burst=5 nodelay; # 每个 IP 每秒最多 1 个请求,允许突发 5 个
# …
}
}
``stub_status` 模块来获取基本状态信息。
* **错误页面**: 配置友好的自定义错误页面。
* **监控**: 结合 Prometheus, Grafana 等工具监控 Nginx 的运行状态和性能指标。Nginx 提供了
总结
Nginx 是一个功能强大且灵活的服务器,通过正确的安装、精心的配置和持续的优化,可以显著提升 Web 服务的性能、安全性和稳定性。本指南涵盖了 Nginx 的核心概念和实践,希望能够帮助您更好地驾驭这个强大的工具。随着您的需求增长,您还可以探索 Nginx 更多的功能,如流媒体代理、地理位置模块等,以构建更强大的 Web 基础设施。