Files
zkxw/测试环境部署/nginx.conf
T
zlwuandCursor 8020e667f1 fix: 多张大图并行上传时不再拆掉进行中的请求,并放宽附件上传超时。
审批附件在第一张成功后会重建上传组件,其余请求被取消并显示超时。现保留进行中的文件,附件请求与 Nginx 上传超时放宽到 5 分钟,存储写入不再堵住事件循环。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-29 10:42:07 +08:00

462 lines
16 KiB
Nginx Configuration File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
user root;
worker_processes auto;
events {
worker_connections 8192;
use epoll;
multi_accept on;
}
http {
include mime.types;
default_type application/octet-stream;
charset utf-8;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
# 全局 gzip
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_proxied any;
gzip_comp_level 6;
gzip_types
text/plain
text/css
text/js
text/xml
text/javascript
application/javascript
application/xml+rss
application/json
image/svg+xml;
# =========================
# ZKXW 管理端(测试环境 8112)
# 静态目录: /root/zkxw/dist
# API 反代: 47.99.164.66:8112
# =========================
server {
listen 8112;
listen [::]:8112;
server_name 47.121.120.79 localhost 127.0.0.1;
root /root/zkxw/dist;
index index.html;
client_max_body_size 100M;
access_log /var/log/nginx/zkxw_admin_8112_access.log;
error_log /var/log/nginx/zkxw_admin_8112_error.log;
# 健康检查 / Swagger(须在 location / 之前;否则 /health 会走 SPA 返回 index.html)
location = /health {
proxy_pass http://47.99.164.66:8112/health;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_connect_timeout 10s;
proxy_read_timeout 30s;
}
location ^~ /docs {
proxy_pass http://47.99.164.66:8112;
proxy_http_version 1.1;
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;
}
location = /openapi.json {
proxy_pass http://47.99.164.66:8112/openapi.json;
proxy_http_version 1.1;
proxy_set_header Host $host;
}
# 附件上传:大文件要等正文传完再落存储,不能跟普通接口共用 120s
location ^~ /api/web/admin/attachment/upload {
proxy_pass http://47.99.164.66:8112;
proxy_http_version 1.1;
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_request_buffering off;
proxy_connect_timeout 30s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
# API -> 测试后端(47.99.164.66:8112)
location ^~ /api/ {
proxy_pass http://47.99.164.66:8112;
proxy_http_version 1.1;
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 10s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;
}
# MinIO 附件直链(bucket=zkxw;端口与后端 MINIO_ENDPOINT 映射一致,默认 20003)
location ^~ /minio/zkxw/ {
proxy_pass http://47.99.164.66:20003/zkxw/;
proxy_http_version 1.1;
proxy_set_header Host $http_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_request_buffering off;
proxy_buffering off;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
proxy_connect_timeout 10s;
add_header Access-Control-Allow-Origin * always;
add_header Access-Control-Allow-Methods "GET, HEAD, OPTIONS" always;
add_header Access-Control-Allow-Headers "DNT,User-Agent,Keep-Alive,Content-Type,Authorization,Range,If-Modified-Since,Cache-Control" always;
if ($request_method = OPTIONS) {
add_header Content-Length 0;
add_header Content-Type text/plain;
return 204;
}
}
# SPA 路由(放最后,避免吞掉 /health、/api 等)
location / {
try_files $uri $uri/ /index.html;
}
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, immutable" always;
add_header X-Content-Type-Options nosniff always;
access_log off;
}
# HTML 禁缓存,便于发版后立刻生效
location ~* \.html$ {
add_header Cache-Control "no-cache, no-store, must-revalidate" always;
add_header Pragma "no-cache" always;
add_header Expires "0" always;
}
# 禁止访问隐藏文件
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}
# =========================
# SQXP Admin 静态服务(本机 3006)
# =========================
server {
listen 3006;
listen [::]:3006;
server_name 127.0.0.1 localhost 47.121.120.79;
root /root/sqxp-dist/dist;
index index.html;
access_log /var/log/nginx/sqxp_admin_3006_access.log;
error_log /var/log/nginx/sqxp_admin_3006_error.log;
# SPA 路由支持
location / {
try_files $uri $uri/ /index.html;
}
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, immutable" always;
add_header X-Content-Type-Options nosniff always;
access_log off;
}
# HTML 禁缓存,便于发版后立刻生效
location ~* \.html$ {
add_header Cache-Control "no-cache, no-store, must-revalidate" always;
add_header Pragma "no-cache" always;
add_header Expires "0" always;
}
# 禁止访问隐藏文件
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}
# =========================
# 主站:https://www.chengyantek.cn
# =========================
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.chengyantek.cn;
ssl_certificate "/root/cert/www.chengyantek.cn.pem";
ssl_certificate_key "/root/cert/www.chengyantek.cn.key";
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1h;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/ahchengyan_access.log;
error_log /var/log/nginx/ahchengyan_error.log;
client_max_body_size 100M;
# =========================
# SQXP Admin 外部访问入口
# =========================
location ^~ /sqxp-admin/ {
proxy_pass http://127.0.0.1:3006/;
proxy_http_version 1.1;
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 10s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# =========================
# SQXP API 同域代理 -> 47.99.164.66:8000/api
# 前端请求 /sqxp-api/web/... -> 后端 /api/web/...
# =========================
location ^~ /sqxp-api/ {
proxy_pass http://47.99.164.66:8000/api/;
proxy_http_version 1.1;
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 10s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# 直接把 bucket 路径代理到 MinIO(bucket= sanqiang)
location ^~ /sanqiang/ {
proxy_pass http://127.0.0.1:20004/sanqiang/;
proxy_http_version 1.1;
proxy_set_header Host $http_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 https;
proxy_request_buffering off;
proxy_buffering off;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
proxy_connect_timeout 10s;
}
# ===== MinIO 直链访问(新增,推荐)=====
location ^~ /minio/ {
proxy_pass http://127.0.0.1:20004/;
proxy_http_version 1.1;
proxy_set_header Host $http_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 https;
proxy_request_buffering off;
proxy_buffering off;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
proxy_connect_timeout 10s;
add_header Access-Control-Allow-Origin * always;
add_header Access-Control-Allow-Methods "GET, PUT, POST, DELETE, HEAD, OPTIONS" always;
add_header Access-Control-Allow-Headers "Authorization,Content-Type,Content-Length,Content-MD5,Date,ETag,Range,X-Amz-Date,X-Amz-Conte
nt-Sha256,X-Amz-Security-Token,X-Amz-User-Agent" always;
add_header Access-Control-Expose-Headers "ETag,Content-Length,Content-Range,Accept-Ranges,x-amz-request-id,x-amz-id-2" always;
if ($request_method = OPTIONS) {
add_header Content-Length 0;
add_header Content-Type text/plain;
return 204;
}
}
# ===== 小程序静态资源 =====
location ^~ /sqxp-static/ {
alias /root/sqxp/;
access_log off;
if ($request_method = OPTIONS) {
add_header Access-Control-Allow-Origin * always;
add_header Access-Control-Allow-Methods "GET, HEAD, OPTIONS" always;
add_header Access-Control-Allow-Headers "DNT,User-Agent,Keep-Alive,Content-Type,Authorization,Range,If-Modified-Since,Cache-Contr
ol" always;
add_header Access-Control-Max-Age 86400 always;
add_header Content-Length 0;
add_header Content-Type text/plain;
return 204;
}
add_header Access-Control-Allow-Origin * always;
add_header Access-Control-Allow-Methods "GET, HEAD, OPTIONS" always;
add_header Access-Control-Allow-Headers "DNT,User-Agent,Keep-Alive,Content-Type,Authorization,Range,If-Modified-Since,Cache-Control"
always;
expires 30d;
add_header Cache-Control "public";
add_header Vary "Accept-Encoding";
try_files $uri =404;
}
# favicon
location = /favicon.ico {
root /root/Lyrria/frontend/dist;
access_log off;
log_not_found off;
expires 1y;
add_header Cache-Control "public, immutable";
}
# robots
location = /robots.txt {
access_log off;
log_not_found off;
return 200 "User-agent: *\nDisallow:\n";
}
# WebSocket 代理
location /ws {
proxy_pass http://127.0.0.1:8766;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 10s;
}
# API 代理(Lyrria)
location ^~ /api/ {
proxy_pass http://127.0.0.1:8766$request_uri;
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_read_timeout 60s;
proxy_send_timeout 60s;
proxy_connect_timeout 10s;
}
# 主站静态资源缓存(Lyrria)
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
root /root/Lyrria/frontend/dist;
expires 30d;
add_header Cache-Control "public, immutable" always;
add_header X-Content-Type-Options nosniff always;
}
# SPA 路由支持(Lyrria)
location / {
root /root/Lyrria/frontend/dist;
index index.html;
try_files $uri $uri/ /index.html;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
}
# HTML 不缓存
location ~* \.html$ {
root /root/Lyrria/frontend/dist;
add_header Cache-Control "no-cache, no-store, must-revalidate" always;
add_header Pragma "no-cache" always;
add_header Expires "0" always;
try_files $uri =404;
}
# 禁止访问隐藏文件
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
location ~ ~$ {
deny all;
access_log off;
log_not_found off;
}
}
# 非www在443跳转到www
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name chengyantek.cn;
ssl_certificate "/root/cert/www.chengyantek.cn.pem";
ssl_certificate_key "/root/cert/www.chengyantek.cn.key";
return 301 https://www.chengyantek.cn$request_uri;
}
# =========================
# 未来如果给 img.chengyantek.cn 单独申请好证书,再加这个 server
# =========================
# server {
# listen 443 ssl http2;
# listen [::]:443 ssl http2;
# server_name img.chengyantek.cn;
#
# ssl_certificate "/root/.acme.sh/img.chengyantek.cn_ecc/fullchain.cer";
# ssl_certificate_key "/root/.acme.sh/img.chengyantek.cn_ecc/img.chengyantek.cn.key";
#
# ssl_session_cache shared:SSL:10m;
# ssl_session_timeout 1h;
# ssl_protocols TLSv1.2 TLSv1.3;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
#
# access_log /var/log/nginx/minio_img_access.log;
# error_log /var/log/nginx/minio_img_error.log;
#
# client_max_body_size 100M;
#
# location / {
# proxy_pass http://127.0.0.1:20004;
# proxy_http_version 1.1;
# proxy_set_header Host $http_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 https;
# proxy_request_buffering off;
# proxy_buffering off;
# proxy_read_timeout 600s;
# proxy_send_timeout 600s;
# proxy_connect_timeout 10s;
# }
# }
}