- config: 反向代理、缓存、负载均衡、安全、SSL 等配置模板 - lua: API 网关、认证、动态路由、限流、WebSocket 等脚本示例 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
132 lines
3.7 KiB
Nginx Configuration File
132 lines
3.7 KiB
Nginx Configuration File
# nginx.conf - API Gateway 配置示例
|
||
# 适用于 OpenResty / lua-nginx-module
|
||
|
||
# 加载 Lua 模块(OpenResty 已内置)
|
||
load_module modules/ndk.so;
|
||
load_module modules/ngx_http_lua_module.so;
|
||
|
||
user nginx;
|
||
worker_processes auto;
|
||
error_log /var/log/nginx/error.log warn;
|
||
pid /var/run/nginx.pid;
|
||
|
||
events {
|
||
worker_connections 1024;
|
||
multi_accept on;
|
||
}
|
||
|
||
http {
|
||
include mime.types;
|
||
default_type application/json;
|
||
|
||
# ---- Lua 全局配置 ----
|
||
lua_package_path "/etc/nginx/lua/?.lua;/usr/local/openresty/lualib/?.lua;;";
|
||
lua_package_cpath "/usr/local/openresty/lualib/?.so;;";
|
||
lua_code_cache on; # 生产环境务必开启
|
||
lua_max_pending_timers 1024;
|
||
lua_max_running_timers 256;
|
||
|
||
# ---- 共享字典 ----
|
||
# 限流计数器
|
||
lua_shared_dict rate_limit 10m;
|
||
# 上游健康状态
|
||
lua_shared_dict upstream_health 1m;
|
||
# API Key 缓存
|
||
lua_shared_dict api_keys 1m;
|
||
|
||
# ---- 日志格式 ----
|
||
log_format api_gateway
|
||
'$remote_addr - $remote_user [$time_local] '
|
||
'"$request" $status $body_bytes_sent '
|
||
'"$http_referer" "$http_user_agent" '
|
||
'route=$arg_route upstream=$upstream_addr '
|
||
'rt=$request_time';
|
||
|
||
access_log /var/log/nginx/access.log api_gateway;
|
||
|
||
# ---- 基础优化 ----
|
||
sendfile on;
|
||
tcp_nopush on;
|
||
tcp_nodelay on;
|
||
keepalive_timeout 65;
|
||
client_max_body_size 10m;
|
||
|
||
# ---- 上游服务器组(由 Lua 动态选择) ----
|
||
upstream default_backend {
|
||
server 127.0.0.1:8080;
|
||
keepalive 32;
|
||
}
|
||
|
||
server {
|
||
listen 80;
|
||
server_name api.example.com;
|
||
|
||
# ---- 健康检查端点 ----
|
||
location /health {
|
||
access_log off;
|
||
default_type application/json;
|
||
return 200 '{"status":"ok"}';
|
||
}
|
||
|
||
# ---- 网关统计信息 ----
|
||
location /gateway/stats {
|
||
internal;
|
||
default_type application/json;
|
||
content_by_lua_block {
|
||
local upstream = require("upstream")
|
||
ngx.say(upstream.stats_json())
|
||
}
|
||
}
|
||
|
||
# ---- 网关主入口 ----
|
||
location / {
|
||
default_type application/json;
|
||
|
||
# ---- 阶段 1: 路由匹配 ----
|
||
access_by_lua_block {
|
||
local gateway = require("gateway")
|
||
gateway.handle()
|
||
}
|
||
|
||
# ---- 阶段 2: 请求体处理 ----
|
||
body_filter_by_lua_block {
|
||
local gateway = require("gateway")
|
||
gateway.filter_response()
|
||
}
|
||
|
||
# ---- 阶段 3: 日志统计 ----
|
||
log_by_lua_block {
|
||
local gateway = require("gateway")
|
||
gateway.log_request()
|
||
}
|
||
|
||
# ---- 代理到动态选择的上游 ----
|
||
proxy_pass http://default_backend;
|
||
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;
|
||
|
||
# 超时设置
|
||
proxy_connect_timeout 5s;
|
||
proxy_read_timeout 30s;
|
||
proxy_send_timeout 15s;
|
||
}
|
||
|
||
# ---- 静态资源 ----
|
||
location /static/ {
|
||
alias /usr/share/nginx/html/;
|
||
expires 30d;
|
||
add_header Cache-Control "public, immutable";
|
||
}
|
||
|
||
# ---- 错误页 ----
|
||
error_page 502 503 504 /50x.json;
|
||
location = /50x.json {
|
||
internal;
|
||
default_type application/json;
|
||
return 502 '{"error":"bad_gateway","message":"上游服务不可用"}';
|
||
}
|
||
}
|
||
}
|