Nginx 是一款高性能的 HTTP 服务器和反向代理服务器,以其高并发、低内存占用和丰富的功能模块著称。从个人博客到大型互联网架构,Nginx 几乎无处不在。本文将深入讲解 Nginx 的核心配置,包括反向代理、负载均衡、HTTPS 配置以及性能与安全优化,所有配置示例均可直接用于生产环境。
一、Nginx 配置文件结构
Nginx 的配置采用模块化、层次化的结构,理解其组织方式是写好配置的前提。主配置文件通常位于 /etc/nginx/nginx.conf。
nginx# 全局块:影响 Nginx 整体运行
user www-data;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
# events 块:影响网络连接
events {
worker_connections 10240;
use epoll;
multi_accept on;
}
# http 块:配置 HTTP 服务器
http {
# 导入 mime 类型
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
# 导入子配置(每个站点一个文件)
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
最佳实践:不要把所有配置都堆在 nginx.conf 里。把全局配置放在主文件,每个站点单独放在
conf.d/目录下,通过 include 引入,便于管理和维护。
二、静态网站配置
最基础的应用是用 Nginx 托管静态网站。下面是一个完整的静态站点配置:
nginx# /etc/nginx/conf.d/1630.top.conf
server {
listen 80;
listen [::]:80;
server_name 1630.top www.1630.top;
root /var/www/1630.top/dist;
index index.html;
# 访问日志
access_log /var/log/nginx/1630.top.access.log;
error_log /var/log/nginx/1630.top.error.log;
# 主 location
location / {
try_files $uri $uri/ /index.html;
}
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
# gzip 压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json
application/javascript text/xml application/xml
application/xml+rss text/javascript image/svg+xml;
# 安全头
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header Referrer-Policy "strict-origin-when-cross-origin";
# 自定义 404 页面
error_page 404 /404.html;
}
三、反向代理配置
反向代理是 Nginx 最常用的功能之一。它接收客户端请求,转发给后端服务,再把响应返回给客户端。这样可以隐藏后端服务、实现负载均衡、统一处理 SSL 等。
nginxserver {
listen 80;
server_name api.1630.top;
# 客户端上传文件大小限制
client_max_body_size 50m;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
# 传递真实客户端信息
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_set_header X-Forwarded-Proto $scheme;
# WebSocket 支持
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 超时设置
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# 不同路径代理到不同服务
location /api/ {
proxy_pass http://127.0.0.1:8080/;
}
location /static/ {
alias /var/www/static/;
expires 7d;
}
}
四、负载均衡
当单台服务器无法承受流量时,需要多台服务器分担请求。Nginx 的 upstream 模块提供了强大的负载均衡能力。
4.1 负载均衡策略
| 策略 | 说明 |
|---|---|
| 轮询(默认) | 按顺序逐一分配请求 |
| weight | 按权重分配,权重越高分配越多 |
| ip_hash | 按客户端 IP 哈希,同一 IP 固定访问同一台 |
| least_conn | 分配给连接数最少的服务器 |
| fair(第三方) | 按响应时间分配,响应快的多分配 |
4.2 完整负载均衡配置
nginxhttp {
# 定义后端服务器组
upstream backend {
# ip_hash; # 取消注释启用 IP 哈希
# least_conn; # 取消注释启用最少连接
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 weight=1;
# 备用服务器,主服务器都挂了才启用
server 192.168.1.13:8080 backup;
# 健康检查参数
# max_fails: 失败次数 fail_timeout: 失败时间窗口
# server 192.168.1.14:8080 max_fails=3 fail_timeout=30s;
# 长连接配置(减少握手开销)
keepalive 32;
}
server {
listen 80;
server_name app.1630.top;
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
五、HTTPS 配置
HTTPS 已是现代网站的标配。借助 Let's Encrypt 可以免费获取 SSL 证书。下面是完整的 HTTPS 配置,包含 HTTP 自动跳转。
5.1 使用 Let's Encrypt 申请证书
bash# 安装 certbot
sudo apt install -y certbot python3-certbot-nginx
# 申请证书并自动配置 Nginx
sudo certbot --nginx -d 1630.top -d www.1630.top
# 测试自动续期(证书有效期 90 天)
sudo certbot renew --dry-run
# 手动续期
sudo certbot renew
5.2 完整 HTTPS 配置
nginx# HTTP 跳转到 HTTPS
server {
listen 80;
server_name 1630.top www.1630.top;
# 永久重定向到 HTTPS
return 301 https://$host$request_uri;
}
# HTTPS 主配置
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name 1630.top www.1630.top;
# 证书路径
ssl_certificate /etc/letsencrypt/live/1630.top/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/1630.top/privkey.pem;
# SSL 优化配置
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# 只使用安全的协议和加密套件
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;
# HSTS:强制浏览器使用 HTTPS
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
root /var/www/1630.top/dist;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
# OCSP 装订,加速证书验证
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
}
六、性能调优
合理的性能调优可以让 Nginx 承受更高的并发,响应更快。
nginx# /etc/nginx/nginx.conf 全局优化
worker_processes auto; # 与 CPU 核心数一致
worker_rlimit_nofile 65535; # 最大文件描述符
events {
worker_connections 10240;
use epoll;
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 1000;
# 缓冲区优化
client_body_buffer_size 10K;
client_header_buffer_size 1K;
client_max_body_size 10m;
large_client_header_buffers 2 1K;
# FastCGI 缓冲(配合 PHP 等使用)
fastcgi_buffers 16 16K;
fastcgi_buffer_size 32K;
}
同时需要调整系统内核参数,编辑 /etc/sysctl.conf:
bash# /etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535
fs.file-max = 1000000
# 使配置生效
sudo sysctl -p
七、安全加固
7.1 隐藏版本号
nginxhttp {
server_tokens off; # 隐藏 Nginx 版本号
}
7.2 限制访问与防 CC
nginx# 限制单个 IP 的连接数和请求速率
limit_conn_zone $binary_remote_addr zone=conn:10m;
limit_req_zone $binary_remote_addr zone=req:10m rate=10r/s;
server {
# 每个 IP 最多 10 个并发连接
limit_conn conn 10;
# 每秒 10 个请求,突发 20 个
limit_req zone=req burst=20 nodelay;
# 禁止访问敏感文件
location ~ /\.(git|env|ht) {
deny all;
}
# 限制只允许特定 IP 访问后台
location /admin/ {
allow 192.168.1.0/24;
allow 10.0.0.0/8;
deny all;
proxy_pass http://127.0.0.1:8080;
}
}
八、常用运维命令
bash# 测试配置语法是否正确
sudo nginx -t
# 重新加载配置(不中断服务)
sudo nginx -s reload
# 启动 / 停止 / 重启
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
# 查看状态
sudo systemctl status nginx
# 查看编译参数(了解已安装的模块)
nginx -V
# 平滑升级 Nginx
sudo nginx -s quit && sudo systemctl start nginx
九、完整生产配置示例
下面整合上述内容,给出一个可直接用于生产环境的完整配置:
nginx# /etc/nginx/conf.d/1630.top.conf
# HTTP 跳转 HTTPS
server {
listen 80;
server_name 1630.top www.1630.top;
return 301 https://$host$request_uri;
}
# HTTPS 主站
server {
listen 443 ssl http2;
server_name 1630.top www.1630.top;
ssl_certificate /etc/letsencrypt/live/1630.top/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/1630.top/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
root /var/www/1630.top/dist;
index index.html;
server_tokens off;
gzip on;
gzip_types text/css application/javascript application/json image/svg+xml;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Strict-Transport-Security "max-age=63072000" always;
location / {
try_files $uri $uri/ /index.html;
}
location ~* \.(js|css|png|jpg|jpeg|gif|svg|woff2?)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
location /api/ {
proxy_pass http://127.0.0.1:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
总结
本文系统讲解了 Nginx 的配置文件结构、静态网站托管、反向代理、负载均衡、HTTPS 配置以及性能与安全优化。Nginx 的强大之处在于其模块化和灵活性,几乎能满足所有 Web 服务场景的需求。掌握这些核心配置后,你就能搭建出高性能、高可用、安全的 Web 服务架构。
在实际运维中,建议养成几个好习惯:每次修改配置后先用 nginx -t 测试语法,再 reload 生效;善用 include 拆分配置文件;定期检查访问日志发现异常流量;及时更新 Nginx 版本修复安全漏洞。希望本文能帮助你在 Nginx 的使用上更进一步。