一、核心模块:ngx_http_rewrite_module
1. 基础场景:简单重定向
nginx
server {
listen 80;
server_name example.com;
# 永久重定向旧页面
rewrite ^/old-page$ /new-page permanent;
# 临时重定向带参数传递
rewrite ^/product/(\d+)$ /item?id=$1? redirect;
}
易错点 :permanent
(301)与redirect
(302)误用
解决方案:SEO优化用301,临时测试用302
2. 进阶场景:复杂规则集
nginx
location /blog/ {
# 条件判断:仅当User-Agent包含Mobile时重写
if ($http_user_agent ~* "Mobile") {
rewrite ^/blog/(.*)$ /mobile/blog/$1 break;
}
# 目录结构升级适配
rewrite ^/blog/(202[0-9])/(\w+)/?$ /archives/$1/$2/ last;
}
关键说明:
last
:停止当前轮次rewrite,重新发起location匹配break
:立即终止所有rewrite操作- 避免在
location / {}
层级过度使用if判断
二、性能优化模块:ngx_http_gzip_module
基础配置模板
nginx
http {
gzip on;
gzip_min_length 1k; # 小于1KB不压缩
gzip_comp_level 6; # 压缩级别(1-9)
gzip_types text/plain text/css application/json application/javascript;
gzip_vary on; # 添加Vary头
}
动态内容压缩案例
nginx
server {
listen 443 ssl;
server_name api.example.com;
# 启用对API响应的JSON压缩
gzip_types application/json;
location / {
proxy_pass http://backend;
# 确保后端不重复压缩
proxy_set_header Accept-Encoding "";
}
}
常见问题 :双重压缩导致资源浪费
排查方法 :通过curl -I -H "Accept-Encoding: gzip"
检查响应头
三、第三方模块:OpenResty Lua集成
1. 安装准备
bash
# 使用OpenResty官方源
wget -qO - https://openresty.org/package/pubkey.gpg | sudo apt-key add -
sudo apt-get install -y software-properties-common
sudo add-apt-repository -y "deb http://openresty.org/package/ubuntu $(lsb_release -sc) main"
sudo apt-get update
sudo apt-get install openresty
2. 访问控制案例
nginx
location /secure/ {
access_by_lua_block {
local token = ngx.var.arg_token
if not token or token ~= "SECRET_2023" then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
}
proxy_pass http://private-backend;
}
3. 动态内容生成
nginx
location /hello {
content_by_lua_block {
local name = ngx.var.arg_name or "Anonymous"
ngx.say("Hello, ", name)
ngx.eof()
}
}
调试技巧:
- 查看错误日志
tail -f /usr/local/openresty/nginx/logs/error.log
- 使用
ngx.log(ngx.ERR, "Debug:", variable)
输出调试信息
四、WebSocket代理配置
完整配置示例
nginx
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name ws.example.com;
location /chat/ {
proxy_pass http://websocket_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
# 超时设置(秒)
proxy_read_timeout 3600;
proxy_send_timeout 3600;
}
}
关键参数说明:
Upgrade
和Connection
头必须显式设置- 长连接需适当调整超时时间
SSL配置要点:
nginx
listen 443 ssl;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
五、综合场景:电商系统配置
nginx
http {
# 全局压缩配置
gzip on;
gzip_types text/css application/javascript;
# 负载均衡
upstream backend {
least_conn;
server 10.0.1.101:8000 weight=3;
server 10.0.1.102:8000;
keepalive 32;
}
server {
listen 80;
server_name shop.example.com;
# 静态资源CDN加速
location ~* \.(jpg|png|gif)$ {
expires 30d;
add_header Cache-Control "public";
proxy_pass https://cdn.example.com;
}
# API接口
location /api/ {
limit_req zone=api_rate burst=5;
proxy_pass http://backend;
# 连接超时保护
proxy_connect_timeout 3s;
proxy_next_upstream error timeout;
}
# 管理后台IP白名单
location /admin/ {
allow 192.168.1.0/24;
deny all;
access_by_lua_file /etc/nginx/lua/auth_admin.lua;
proxy_pass http://backend;
}
}
}
六、配置验证与调试技巧
-
配置语法检查
nginx -t -c /etc/nginx/nginx.conf
-
请求追踪方法
bashcurl -v http://example.com/resource tcpdump -i eth0 port 80 -w nginx_debug.pcap
-
日志分析要点
nginx# 自定义日志格式 log_format debug_log '$remote_addr - $request_time - $upstream_response_time'; access_log /var/log/nginx/debug.log debug_log;
-
性能监控指标
bash# 实时状态 nginx -V 2>&1 | grep -o with-http_stub_status_module location /nginx_status { stub_status; allow 127.0.0.1; deny all; }
七、常见故障排查表
现象 | 可能原因 | 解决方案 |
---|---|---|
502 Bad Gateway | 后端服务未启动/防火墙阻止 | 检查后端服务状态和连接性 |
重定向循环 | rewrite规则逻辑错误 | 使用curl -L 跟踪跳转链 |
Gzip未生效 | 未配置正确的MIME类型 | 检查gzip_types 包含目标类型 |
WebSocket连接中断 | 代理超时设置过短 | 调整proxy_read_timeout 值 |
Lua脚本执行失败 | 文件权限问题 | chmod +x 并检查加载路径 |
通过以上多维度配置示例,可满足从简单网站到复杂分布式系统的部署需求。建议遵循以下原则:
- 新服务采用分阶段部署策略
- 所有修改前备份配置文件
- 使用
include
指令模块化配置 - 定期进行配置审计和安全检查