URL 重定向、压缩Lua 模块(OpenResty)、WebSocket 支持

一、核心模块: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;
    }
}

关键参数说明

  • UpgradeConnection头必须显式设置
  • 长连接需适当调整超时时间
    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;
        }
    }
}

六、配置验证与调试技巧

  1. 配置语法检查
    nginx -t -c /etc/nginx/nginx.conf

  2. 请求追踪方法

    bash 复制代码
    curl -v http://example.com/resource
    tcpdump -i eth0 port 80 -w nginx_debug.pcap
  3. 日志分析要点

    nginx 复制代码
    # 自定义日志格式
    log_format debug_log '$remote_addr - $request_time - $upstream_response_time';
    access_log /var/log/nginx/debug.log debug_log;
  4. 性能监控指标

    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并检查加载路径

通过以上多维度配置示例,可满足从简单网站到复杂分布式系统的部署需求。建议遵循以下原则:

  1. 新服务采用分阶段部署策略
  2. 所有修改前备份配置文件
  3. 使用include指令模块化配置
  4. 定期进行配置审计和安全检查
相关推荐
八股文领域大手子9 小时前
优化IDEA2024.3大型项目启动慢
运维·nginx·spring·docker·容器
阵雨会停.14 小时前
Linux 使用Nginx搭建简易网站模块
运维·nginx
小厂永远得不到的男人15 小时前
一个自学菜鸟的Nginx打怪之路:原来反向代理这么香!
nginx
小厂永远得不到的男人15 小时前
深入剖析Nginx反向代理:从理论到实战的架构进化之路
nginx
ak啊1 天前
Nginx 性能优化指南
nginx
betazhou2 天前
基于Windows通过nginx代理访问Oracle数据库
数据库·nginx·oracle·代理
zkmall2 天前
ZKmall开源商城静态资源管理:Nginx 配置与优化
运维·nginx·开源
泉城老铁3 天前
nginx配置负载均衡一文解决
nginx
zuozewei3 天前
干货 | 高性能 Nginx 优化配置总结
运维·nginx
YY_Ylx_XX3 天前
Nginx用途以及好处:
运维·nginx