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 小时前
nginx 负载均衡配置(加解决重复登录问题)
运维·nginx·负载均衡
hnlucky10 小时前
《Nginx + 双Tomcat实战:域名解析、静态服务与反向代理、负载均衡全指南》
java·linux·服务器·前端·nginx·tomcat·web
步、步、为营11 小时前
.net服务器Kestrel配置Nginx作为反向代理
服务器·nginx·.net
晨岳15 小时前
CentOS 安装 JDK+ NGINX+ Tomcat + Redis + MySQL搭建项目环境
java·redis·mysql·nginx·centos·tomcat
执笔诉情殇〆15 小时前
前后端分离(java) 和 Nginx在服务器上的完整部署方案(redis、minio)
java·服务器·redis·nginx·minio
这儿有一堆花18 小时前
Nginx服务器集群:横向扩展与集群解决方案
运维·服务器·nginx
果子⌂2 天前
Docker-构建镜像并实现LNMP架构
mysql·nginx·docker·容器·架构·php
一只小阿乐3 天前
window 服务器上部署前端静态资源以及nginx 配置
运维·服务器·nginx
Linux运维技术栈3 天前
Nginx 动静分离原理与工作机制详解:从架构优化到性能提升
运维·nginx·架构
墨苒孤4 天前
【Nginx】Nginx代理WebSocket
运维·websocket·nginx