- 00-limits.conf 新增 limit_req_zone perip_req 10r/s + 429 状态码 (zone 定义属服务器配置, 不入库) - 站点 conf 443 server 块挂 limit_req burst=20 nodelay + limit_conn perip 10 - 域名直连无 CDN, binary_remote_addr 即真实 IP; 后端全绑 127.0.0.1 无死角 - 验证: 30 并发部分 429, 桶恢复后正常
150 lines
5.8 KiB
Plaintext
150 lines
5.8 KiB
Plaintext
# openapi.rrrosmontis.icu 统一入口(原 api/pixiv/apixiv.bu4.ren 合并)
|
||
# /pixiv/ /bilibili/ -> openapi 聚合层 127.0.0.1:9008 (main.py)
|
||
# /img-master/ /img-original/ -> i.pximg.net 图片反代(原 apixiv.bu4.ren 逻辑,方案二)
|
||
# 2026-09-02 补 /img-original/:App API 原图 URL 为 /img-original/ 前缀,此前未配置导致 404
|
||
|
||
proxy_cache_path /var/cache/nginx/openapi_img_cache levels=1:2 keys_zone=openapi_img_cache:20m inactive=1d max_size=5g;
|
||
|
||
server {
|
||
listen 80;
|
||
listen [::]:80;
|
||
server_name openapi.rrrosmontis.icu;
|
||
location /.well-known/acme-challenge/ {
|
||
root /var/www/acme;
|
||
}
|
||
location / {
|
||
return 301 https://$host$request_uri;
|
||
}
|
||
}
|
||
|
||
server {
|
||
listen 443 ssl http2;
|
||
server_name openapi.rrrosmontis.icu;
|
||
|
||
ssl_certificate /home/openapi/cert/openapi.rrrosmontis.icu/fullchain.pem;
|
||
ssl_certificate_key /home/openapi/cert/openapi.rrrosmontis.icu/privkey.pem;
|
||
ssl_protocols TLSv1.2 TLSv1.3;
|
||
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:!MD5;
|
||
ssl_prefer_server_ciphers on;
|
||
ssl_session_cache shared:SSL:10m;
|
||
ssl_session_timeout 10m;
|
||
add_header Strict-Transport-Security "max-age=31536000";
|
||
error_page 497 https://$host$request_uri;
|
||
|
||
# ---- 按 IP 限流(轻防滥用档,2026-09-23):10r/s burst 20、并发连接 10,超出 429 ----
|
||
limit_req zone=perip_req burst=20 nodelay;
|
||
limit_conn perip 10;
|
||
|
||
resolver 8.8.8.8 1.1.1.1 ipv6=off valid=300s;
|
||
|
||
# ---- 图片反代 i.pximg.net(原 apixiv.bu4.ren 逻辑,路径前缀 /img-master/)----
|
||
location ^~ /img-master/ {
|
||
set $backend i.pximg.net;
|
||
proxy_pass https://$backend$request_uri;
|
||
|
||
proxy_set_header Host i.pximg.net;
|
||
proxy_set_header User-Agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36";
|
||
proxy_set_header Referer "https://www.pixiv.net/";
|
||
|
||
proxy_ssl_server_name on;
|
||
proxy_ssl_name i.pximg.net;
|
||
|
||
proxy_connect_timeout 10s;
|
||
proxy_read_timeout 300s;
|
||
|
||
proxy_cache openapi_img_cache;
|
||
proxy_cache_valid 200 7d;
|
||
proxy_cache_valid 404 5m;
|
||
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
|
||
proxy_cache_lock on;
|
||
proxy_cache_key "$scheme$proxy_host$request_uri";
|
||
|
||
add_header X-Cache-Status $upstream_cache_status;
|
||
}
|
||
|
||
# ---- 图片反代 i.pximg.net(/img-original/,App API 原图路径,2026-09-02 补)----
|
||
location ^~ /img-original/ {
|
||
set $backend i.pximg.net;
|
||
proxy_pass https://$backend$request_uri;
|
||
|
||
proxy_set_header Host i.pximg.net;
|
||
proxy_set_header User-Agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36";
|
||
proxy_set_header Referer "https://www.pixiv.net/";
|
||
|
||
proxy_ssl_server_name on;
|
||
proxy_ssl_name i.pximg.net;
|
||
|
||
proxy_connect_timeout 10s;
|
||
proxy_read_timeout 300s;
|
||
|
||
proxy_cache openapi_img_cache;
|
||
proxy_cache_valid 200 7d;
|
||
proxy_cache_valid 404 5m;
|
||
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
|
||
proxy_cache_lock on;
|
||
proxy_cache_key "$scheme$proxy_host$request_uri";
|
||
|
||
add_header X-Cache-Status $upstream_cache_status;
|
||
}
|
||
|
||
# ---- pixiv(openapi 聚合层 /pixiv/get_image)----
|
||
location ^~ /pixiv/ {
|
||
proxy_pass http://127.0.0.1:9008;
|
||
proxy_set_header Host $http_host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header X-Real-Port $remote_port;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
proxy_set_header X-Forwarded-Proto $scheme;
|
||
proxy_set_header X-Forwarded-Host $host;
|
||
proxy_set_header X-Forwarded-Port $server_port;
|
||
proxy_set_header REMOTE-HOST $remote_addr;
|
||
proxy_connect_timeout 60s;
|
||
proxy_send_timeout 600s;
|
||
proxy_read_timeout 600s;
|
||
proxy_http_version 1.1;
|
||
proxy_set_header Upgrade $http_upgrade;
|
||
proxy_set_header Connection $connection_upgrade;
|
||
}
|
||
|
||
# ---- bilibili(openapi 聚合层 /bilibili/get_video)----
|
||
location ^~ /bilibili/ {
|
||
proxy_pass http://127.0.0.1:9008;
|
||
proxy_set_header Host $http_host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header X-Real-Port $remote_port;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
proxy_set_header X-Forwarded-Proto $scheme;
|
||
proxy_set_header X-Forwarded-Host $host;
|
||
proxy_set_header X-Forwarded-Port $server_port;
|
||
proxy_set_header REMOTE-HOST $remote_addr;
|
||
proxy_connect_timeout 60s;
|
||
proxy_send_timeout 600s;
|
||
proxy_read_timeout 600s;
|
||
proxy_http_version 1.1;
|
||
proxy_set_header Upgrade $http_upgrade;
|
||
proxy_set_header Connection $connection_upgrade;
|
||
}
|
||
|
||
# ---- 其余(根路径 / )→ 9008(main.py:跳转文章页)----
|
||
location / {
|
||
proxy_pass http://127.0.0.1:9008;
|
||
proxy_set_header Host $http_host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header X-Real-Port $remote_port;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
proxy_set_header X-Forwarded-Proto $scheme;
|
||
proxy_set_header X-Forwarded-Host $host;
|
||
proxy_set_header X-Forwarded-Port $server_port;
|
||
proxy_set_header REMOTE-HOST $remote_addr;
|
||
proxy_connect_timeout 60s;
|
||
proxy_send_timeout 600s;
|
||
proxy_read_timeout 600s;
|
||
proxy_http_version 1.1;
|
||
proxy_set_header Upgrade $http_upgrade;
|
||
proxy_set_header Connection $connection_upgrade;
|
||
}
|
||
|
||
access_log /var/log/nginx/openapi.rrrosmontis.icu.log;
|
||
error_log /var/log/nginx/openapi.rrrosmontis.icu.error.log;
|
||
}
|