news 2026/6/22 8:43:27

Nginx 完全指南:入门、核心功能与高阶运维全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Nginx 完全指南:入门、核心功能与高阶运维全解析

第一章:引言(深度补全)

  • 为什么是 Nginx?除了高并发(C10K 问题解决者),它还是七层负载均衡四层流代理(Stream 模块)的全能选手。内存占用极低(几 MB 可支撑上万连接)。

  • 适用场景细化

    • 前端入口:SPA 应用路由分发(try_files)。

    • API 网关:结合proxy_pass/api/转发至后端微服务。

    • 静态资源 CDN 前置:利用expiresadd_header Cache-Control实现强缓存。

    • WebSocket 长连接:需要配置proxy_http_version 1.1Upgrade头。

  • 环境准备建议:推荐Ubuntu 22.04 LTSCentOS 7+。需要掌握vim/nano编辑、netstat -tlnp查看端口占用。

第二章:基础篇——安装与架构

  • 架构补充说明:Master 进程以 root 运行(读取配置、绑定 80/443 端口),Worker 进程以普通用户(如www-data)运行,极大增强安全性。

  • 源码编译关键参数详解(这是面试高频):

./configure --prefix=/usr/local/nginx \ --with-http_ssl_module \ # 开启 HTTPS --with-http_v2_module \ # 开启 HTTP/2 --with-http_realip_module \ # 获取真实 IP --with-http_stub_status_module \ # 监控状态页 --with-stream \ # 开启 TCP/UDP 代理(四层负载) --with-http_gzip_static_module # 预压缩静态文件

第三章:Nginx 目录结构及文件作用全解

这里以Ubuntu/Debian 系(APT安装)的典型结构为例,这是最通用的标准。源码编译安装路径会略有不同(通常在/usr/local/nginx),但核心逻辑一致。

1. 根目录总览 (/etc/nginx/)

text

/etc/nginx/ ├── nginx.conf # 主配置文件(入口) ├── conf.d/ # 全局通用配置片段目录 ├── sites-available/ # 所有可用的虚拟主机(站点)配置 ├── sites-enabled/ # 当前激活的站点配置(软链接指向 sites-available) ├── modules-enabled/ # 动态加载的模块目录(软链接) ├── modules-available/ # 可用的动态模块目录 ├── snippets/ # 可复用的配置片段(如 SSL、限流、跨域等) ├── mime.types # MIME类型映射表(文件扩展名 -> Content-Type) ├── fastcgi_params # FastCGI 标准参数(用于 PHP 等) ├── uwsgi_params # uWSGI 标准参数(用于 Python 等) ├── scgi_params # SCGI 标准参数 ├── proxy_params # 反向代理标准头参数(如 X-Forwarded-For) └── koi-utf / koi-win / win-utf # 编码转换映射表(处理非UTF-8字符集)

2. 核心文件与目录的作用详解

文件/目录核心作用使用频率
nginx.conf总枢纽。定义全局运行参数(worker_processes)、事件模型(events)和顶层 HTTP 块。最后通过include指令加载sites-enabled/*conf.d/*⭐⭐⭐⭐⭐
sites-available/配置仓库。存放所有业务站点的完整server{}配置块文件(如example.com.conf)。文件通常按域名命名,方便管理。⭐⭐⭐⭐⭐
sites-enabled/激活开关。只包含指向../sites-available/软链接。Nginx 默认只加载此目录下的文件。这种设计让你可以方便地“启用/禁用”站点(ln -s/rm),而无需删除原始配置。⭐⭐⭐⭐⭐
conf.d/通用补充。存放非虚拟主机类的全局配置片段,如upstream负载池定义、全局限流规则等。也可放独立站点,但官方更推荐sites-*⭐⭐⭐⭐
snippets/乐高积木。存放可复用的配置块。最典型的用法是存放SSL 证书配置ssl-cert.conf)或安全头配置security-headers.conf),然后在各个server中用include snippets/ssl.conf;一键引用。⭐⭐⭐⭐
mime.types类型词典。将文件后缀(如.html.css.js)映射为浏览器能识别的 MIME 类型。Nginx 通过它设置Content-Type响应头。⭐⭐(一般不动)
proxy_params代理头模板。通常包含proxy_set_header Host $hostproxy_set_header X-Real-IP $remote_addr等标准代理头。使用proxy_pass时顺手include proxy_params;可保证后端拿到真实 IP。⭐⭐⭐⭐
fastcgi_paramsCGI 环境变量。传递SCRIPT_FILENAMEQUERY_STRING等给 PHP-FPM。通常配合fastcgi_pass使用。⭐⭐⭐

3. 运行时关键目录(非/etc下)

路径作用
/usr/sbin/nginxNginx 二进制主程序(启动/重载命令来源)
/var/log/nginx/日志存放目录(access.logerror.log
/var/www/html/默认的网页根目录(Debian/Ubuntu 默认)
/etc/init.d/nginxSystem V 初始化脚本(service nginx start
/lib/systemd/system/nginx.serviceSystemd 服务单元文件(systemctl管理)

4.四个核心场景的配置片段

示例 1:基础静态页面 + 动静分离
# /etc/nginx/sites-available/my-static-site.conf server { # 监听 80 端口(IPv4 和 IPv6) listen 80; listen [::]:80; # 域名绑定 server_name www.myblog.com myblog.com; # 站点根目录 root /var/www/myblog/html; # 默认首页优先顺序 index index.html index.htm; # ----- 处理静态资源(图片/CSS/JS)并开启缓存 ----- location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg)$ { expires 30d; # 设置浏览器缓存 30 天 add_header Cache-Control "public, immutable"; access_log off; # 关闭静态资源访问日志,减少磁盘 IO log_not_found off; # 不记录 404 错误日志 } # ----- 处理前端路由(SPA 历史模式) ----- location / { try_files $uri $uri/ /index.html; # 如果请求的文件不存在,则返回 index.html,交给前端路由处理 } # ----- 动静分离:将 /api/ 请求转发到后端 Java/Go 服务 ----- location /api/ { proxy_pass http://localhost:8080/api/; # 注意:末尾带 / 表示替换掉 /api/,不带 / 则完整转发 include proxy_params; # 自动引入标准代理头(X-Real-IP等) proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; } # ----- 错误页面自定义 ----- error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /var/www/myblog/html; } }
示例 2:负载均衡(Upstream) + HTTPS 强制跳转
# 定义上游服务器池(放在 /etc/nginx/conf.d/upstream.conf 更合适) upstream backend_app { # 负载均衡算法:加权轮询 server 192.168.1.10:8080 weight=5 max_fails=3 fail_timeout=30s; server 192.168.1.11:8080 weight=3 max_fails=3 fail_timeout=30s; server 192.168.1.12:8080 weight=2 max_fails=3 fail_timeout=30s; # 健康检查(商业版支持主动探测,开源版依赖被动探测) # keepalive 32; # 开启长连接池,减少握手开销(需搭配 proxy_http_version 1.1) } # ---- HTTP 服务(强制跳转 HTTPS) ---- server { listen 80; listen [::]:80; server_name api.mycompany.com; # 返回 301 永久重定向到 HTTPS return 301 https://$server_name$request_uri; } # ---- HTTPS 服务(实际业务) ---- server { listen 443 ssl http2; # 开启 SSL 和 HTTP/2 协议 listen [::]:443 ssl http2; server_name api.mycompany.com; # ---------- SSL 证书配置(强烈建议使用 sniper/全链证书) ---------- ssl_certificate /etc/ssl/certs/fullchain.pem; # 公钥 + 中间证书 ssl_certificate_key /etc/ssl/private/privkey.pem; # 私钥(权限设为 600) # 安全加密套件(2024年主流标准) ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384'; ssl_prefer_server_ciphers on; # 会话缓存优化(减少握手时间) ssl_session_cache shared:SSL:50m; ssl_session_timeout 1d; ssl_session_tickets off; # 为了更好的前向安全性,建议关闭 # ---------- 反向代理到后端 Upstream ---------- location / { proxy_pass http://backend_app; # 引用上面定义的 upstream 组 # 核心代理头设置 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; # 告诉后端当前是 HTTP 还是 HTTPS # 超时与缓冲 proxy_connect_timeout 75s; proxy_send_timeout 75s; proxy_read_timeout 75s; proxy_buffering on; proxy_buffer_size 4k; proxy_buffers 8 4k; proxy_busy_buffers_size 8k; # 错误时尝试下一台服务器 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; } # 健康检查状态页(可选,需编译 stub_status 模块) location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; # 只允许本机查看 deny all; } }
示例 3:限流(防 CC 攻击)与访问控制
# 放置在 /etc/nginx/conf.d/security.conf # 1. 定义限流区域(基于 $binary_remote_addr,内存 10M) limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s; # 表示:每秒允许 10 个请求,超出后排队 # 2. 定义连接数限制(每个 IP 最多同时 20 个连接) limit_conn_zone $binary_remote_addr zone=addr:10m; server { listen 80; server_name myapi.com; location /api/ { # 应用限流:burst=20 允许突然爆发 20 个请求排队,nodelay 让队列不等待直接响应 limit_req zone=mylimit burst=20 nodelay; limit_conn addr 20; # 同一 IP 仅允许 20 个并发连接 # 白名单放行(比如内部监控系统) allow 192.168.1.100; allow 10.0.0.0/8; deny all; # 禁止其他 IP 访问敏感接口 proxy_pass http://backend; } }
示例 4:WebSocket 代理配置
server { listen 443 ssl http2; server_name ws.myapp.com; location /ws/ { proxy_pass http://websocket_backend; proxy_http_version 1.1; # WebSocket 必须 1.1 proxy_set_header Upgrade $http_upgrade; # 升级协议 proxy_set_header Connection "upgrade"; # 保持连接升级 # 长连接必须加大超时(默认 60s 不够) proxy_read_timeout 300s; proxy_connect_timeout 75s; # 同样传递真实 IP proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }

第四章:核心配置篇(语法精讲)

  • location 匹配优先级(重难点)

    1. =精确匹配(最高,立即停止)

    2. ^~前缀匹配(若匹配,不再检查正则)

    3. ~(区分大小写正则)和~*(不区分)

    4. 普通前缀匹配(最长匹配原则)
      建议配图或写例子:location = /location /的区别。

核心功能实战(配置逻辑拆解)

  • 静态服务器优化

    • sendfile on;充分利用 Linux 零拷贝。

    • tcp_nopush on;配合sendfile,在数据包达到最大时才发送,提升网络效率。

    • Gzip 必须开启:gzip_types text/plain text/css application/json ...

  • 反向代理重点

    • 缓冲区proxy_buffering on;可将后端响应缓冲到磁盘/内存,避免慢客户端拖慢后端。

    • 重定向处理proxy_redirect default;修复后端 302 跳转时的 Location 头。

  • 负载均衡调度场景

    • ip_hash致命缺点:会导致负载严重不均(某 IP 段请求多就压垮某台机器),现代微服务推荐Redis/Token 集中管理 Session,配合least_conn

    • downbackup配合运维手动下线服务器。

  • HTTPS 安全配置(现代标准)

    • 必须禁用弱加密:ssl_ciphers HIGH:!aNULL:!MD5;

    • 开启ssl_prefer_server_ciphers on;由服务端决定加密套件。

    • 使用全链证书(fullchain.pem) 避免中间证书缺失报错。

高阶应用

  • 限流算法limit_req使用Leaky Bucket(漏桶)算法,burst参数代表瞬时突发队列长度,nodelay参数会让排队请求立即处理但消耗令牌。建议生产必须配置防 CC 攻击。

  • Rewrite 规则陷阱breaklast的区别——last会重走一遍 location 匹配,容易死循环;break则只在当前上下文处理。

  • WebSocket 关键:后端若支持 WS,proxy_read_timeout必须设大(如 300s),否则长连接会被 Nginx 强行断开。

第五章:运维实战速查

  • 平滑重启:修改配置后,nginx -t && nginx -s reload零停机更新。

  • 热升级(二进制替换)kill -USR2 旧MasterPIDkill -WINCH 旧MasterPID,可实现不停服更换 Nginx 版本。

  • 日志切割:配合logrotate工具,防止日志撑爆磁盘。

# /etc/logrotate.d/nginx # 这是 logrotate 工具的配置文件,用于管理 Nginx 日志的轮转(切割)、归档和清理。 # 将此文件放在 /etc/logrotate.d/ 目录下,logrotate 会自动加载并执行。 /var/log/nginx/*.log { # 定义需要轮转的日志文件路径(匹配该目录下所有 .log 结尾的文件) daily # 日志轮转周期为每天(即每天凌晨检查并执行一次切割) missingok # 如果待轮转的日志文件不存在,不报错,直接跳过(避免 cron 任务报错) rotate 52 # 最多保留 52 个归档文件(由于是 daily,即保留最近 52 天的日志) compress # 对轮转下来的旧日志文件启用 gzip 压缩,大幅节省磁盘空间 delaycompress # 延迟压缩:配合 compress 使用,最新轮转出的那个归档文件暂不压缩, # 等到下次轮转时再压缩。这给了一些调试工具(如 less、tail)查看最新归档的时间, # 也防止 postrotate 脚本还在写入时就压缩导致冲突。 notifempty # 如果日志文件为空(大小为 0),则不执行轮转操作,避免产生空归档 create 640 www-data adm # 轮转完成后,新建一个空的日志文件以继续写入。 # 640 是文件权限(属主读写,属组只读,其他人无权限); # www-data 是属主(Nginx 进程运行用户); # adm 是属组(通常用于系统监控日志组)。 postrotate # 轮转操作完成后,执行以下自定义脚本(endscript 结束) # 检查 Nginx 的 PID 文件是否存在(/var/run/nginx.pid 是默认存储路径) [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` # 如果 PID 文件存在,则向 Nginx 主进程发送 USR1 信号。 # 信号 USR1 是 Nginx 的专用信号,作用是“重新打开日志文件”。 # 这一步至关重要:轮转已经把原日志重命名(如 access.log.1), # 如果不发此信号,Nginx 会继续往重命名后的旧文件里写日志; # 发送 USR1 后,Nginx 会重新打开当前路径下的 access.log(即 create 创建的新文件), # 从而实现“切割后无缝续写”,完全不需要重启 Nginx 服务。 endscript # 自定义脚本结束标记 }

第六章:nginx.conf 全功能示例文件

它将作为一个现代 Web 应用的统一入口,涵盖静态服务、反向代理、负载均衡、HTTPS、缓存、限流、重写、WebSocket、FastCGI(PHP)、状态监控、Gzip、访问控制等主流技术。每一行都带有详尽中文注释,说明其用途和适用场景。

配置要点速览(帮助你向读者解释)

功能分类关键指令/模块作用
HTTPS/SSLlisten 443 ssl http2ssl_certificatessl_protocolsssl_ciphers提供加密传输和 HTTP/2 支持
静态缓存expires 30dadd_header Cache-Control减少客户端重复请求,加速加载
反向代理proxy_passproxy_set_headerproxy_cache隐藏后端细节,实现负载均衡与缓存
负载均衡upstream+server权重/健康检查流量分发,提高可用性
WebSocketproxy_http_version 1.1Upgrade/Connection支持实时通信
PHP 解析location ~ \.php$+fastcgi_pass对接 PHP-FPM 运行动态脚本
限流限连limit_reqlimit_conn保护后端免受 CC 攻击或突发流量
访问控制allow/deny基于 IP 的权限管理
URL 重写rewritereturn规范化 URL 或重定向旧链接
状态监控stub_status实时查看连接数、请求状态等
Gzipgzip ongzip_types压缩文本响应,节省带宽
日志管理access_logerror_log记录访问和错误信息,便于排障
安全头add_header(HSTS、X-Frame-Options 等)提升站点安全等级
# ============================================================ # nginx.conf — 全功能示例(注释版) # 适用环境:Ubuntu/Debian(APT 安装), # 也适用于大多数 Linux 发行版(路径可能微调)。 # ============================================================ # ------------------- 1. 全局配置(Main Context) ------------------- # 指定 Nginx 运行的用户和组(通常为 www-data 或 nginx) user www-data; # 工作进程数,通常设置为 CPU 核心数(auto 可自动检测) worker_processes auto; # 错误日志存放路径及级别(可选 debug/info/notice/warn/error/crit/alert/emerg) error_log /var/log/nginx/error.log warn; # 主进程 PID 文件位置(供管理命令使用) pid /var/run/nginx.pid; # 动态加载的模块(如需额外编译的模块,在此引入) # include /usr/share/nginx/modules/*.conf; # ------------------- 2. 事件驱动(Events Context) ------------------- events { # 每个工作进程最大并发连接数(根据系统 ulimit -n 调整) worker_connections 1024; # 使用 epoll 事件模型(Linux 最高效,其它系统可换 kqueue 等) use epoll; # 一次系统调用可接受多个新连接(提升性能) multi_accept on; } # ------------------- 3. HTTP 核心(HTTP Context) ------------------- http { # ---------- 基础设置 ---------- # 引入 MIME 类型映射文件(将扩展名映射为 Content-Type) include /etc/nginx/mime.types; # 默认 MIME 类型(如果映射表未匹配) default_type application/octet-stream; # 日志格式定义(方便统一分析) log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # 访问日志路径及格式 access_log /var/log/nginx/access.log main; # 启用 sendfile(零拷贝,高性能文件传输) sendfile on; # 与 sendfile 配合,在数据包达到最大时才发送(减少网络包数量) tcp_nopush on; # 保持长连接的超时时间(秒) keepalive_timeout 65; # 客户端请求头缓冲大小(防止大请求头丢失) client_header_buffer_size 1k; large_client_header_buffers 4 4k; # 客户端请求体最大大小(限制上传文件大小,默认 1M) client_max_body_size 20M; # ---------- Gzip 压缩 ---------- # 启用 gzip 压缩(文本类资源压缩比极高) gzip on; # 最低压缩阈值(小于此大小的文件不压缩,节省 CPU) gzip_min_length 1k; # 压缩缓冲区大小 gzip_buffers 4 16k; # HTTP 协议版本(1.1 以上才支持压缩) gzip_http_version 1.1; # 压缩级别(1~9,级别越高压缩比越大,但耗 CPU,建议 6) gzip_comp_level 6; # 压缩的文件类型(文本类均需压缩) gzip_types text/plain text/css text/xml application/javascript application/json application/xml+rss image/svg+xml; # 对 IE6 等旧浏览器禁用 gzip(它们不支持) gzip_disable "msie6"; # 向前端代理添加 Vary: Accept-Encoding 头部,告知缓存服务器根据编码区分 gzip_vary on; # ---------- 代理缓存全局设置 ---------- # 定义缓存路径、级别、最大大小和失效时间 proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off; # ---------- 限流区域定义 ---------- # 基于客户端 IP 的请求频率限流(每秒 10 个请求) limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s; # 基于客户端 IP 的并发连接数限制(每个 IP 最多 20 个) limit_conn_zone $binary_remote_addr zone=conn_limit:10m; # ---------- 上游服务池定义(负载均衡) ---------- # 后端 API 服务器池(轮询 + 权重) upstream api_backend { # 默认轮询算法,可指定权重 server 192.168.1.10:8080 weight=5 max_fails=3 fail_timeout=30s; server 192.168.1.11:8080 weight=3 max_fails=3 fail_timeout=30s; server 192.168.1.12:8080 weight=2 max_fails=3 fail_timeout=30s backup; # 备用节点 } # WebSocket 后端服务池(长连接,开启 keepalive) upstream ws_backend { server 192.168.1.20:8081; server 192.168.1.21:8081; keepalive 32; # 每个 worker 保持的空闲长连接数 } # ---------- 虚拟主机 Server 块 ---------- # ---------------------------------------------------------------- # Server 1:HTTP(80)强制跳转到 HTTPS # ---------------------------------------------------------------- server { listen 80; listen [::]:80; server_name www.myapp.com myapp.com; # 将所有 HTTP 请求重定向到 HTTPS(永久重定向 301) return 301 https://$server_name$request_uri; } # ---------------------------------------------------------------- # Server 2:HTTPS(443)主要业务服务 # ---------------------------------------------------------------- server { listen 443 ssl http2; # 开启 SSL 和 HTTP/2 协议 listen [::]:443 ssl http2; server_name www.myapp.com myapp.com; # ---------- SSL/TLS 安全配置 ---------- # 证书路径(全链证书,包含中间证书) ssl_certificate /etc/ssl/certs/fullchain.pem; ssl_certificate_key /etc/ssl/private/privkey.pem; # 私钥(权限 600) # 支持的 TLS 协议版本(禁用过时的不安全协议) ssl_protocols TLSv1.2 TLSv1.3; # 加密套件(优先使用现代安全套件) ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384'; # 优先使用服务器端定义的套件顺序(而非客户端) ssl_prefer_server_ciphers on; # SSL 会话缓存(提升握手效率) ssl_session_cache shared:SSL:50m; ssl_session_timeout 1d; ssl_session_tickets off; # 禁用 session ticket(增强前向安全性) # 启用 OCSP Stapling(减少浏览器验证证书的延迟) ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/ssl/certs/trusted-ca-bundle.crt; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; # 添加安全响应头(防范常见攻击) add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; add_header X-Content-Type-Options nosniff; add_header X-Frame-Options DENY; add_header X-XSS-Protection "1; mode=block"; # ---------- 根目录与静态文件服务 ---------- # 设置网站根目录 root /var/www/myapp/html; # 默认首页(按顺序查找) index index.html index.htm index.php; # 处理静态资源(CSS/JS/图片)——设置强缓存,减轻服务器压力 location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff2?|ttf|eot)$ { expires 30d; # 浏览器缓存 30 天 add_header Cache-Control "public, immutable"; access_log off; # 关闭静态资源访问日志(减少 I/O) log_not_found off; # 不记录 404 错误 } # 处理前端路由(SPA 单页应用):所有不存在的路径回退到 index.html location / { try_files $uri $uri/ /index.html; } # ---------- 反向代理:API 服务(负载均衡) ---------- location /api/ { # 代理到上游负载均衡池 proxy_pass http://api_backend/api/; # 末尾带 / 表示替换路径前缀 # 引入标准代理头设置(X-Real-IP, X-Forwarded-For 等) include proxy_params; # 额外自定义头部 proxy_set_header X-Forwarded-Proto $scheme; # 告知后端原始协议 proxy_set_header Host $host; # 超时设置 proxy_connect_timeout 75s; proxy_send_timeout 75s; proxy_read_timeout 75s; # 启用代理缓存(使用上面定义的缓存区) proxy_cache my_cache; proxy_cache_key "$scheme$request_method$host$request_uri"; # 缓存键 proxy_cache_valid 200 302 60m; # 正常响应缓存 60 分钟 proxy_cache_valid 404 1m; # 404 缓存 1 分钟(避免频繁回源) proxy_cache_use_stale error timeout updating http_500 http_502 http_503; proxy_cache_background_update on; # 后台异步更新过期缓存 proxy_cache_lock on; # 防止并发回源(缓存穿透) # 缓冲区配置(提升性能) proxy_buffering on; proxy_buffer_size 4k; proxy_buffers 8 4k; proxy_busy_buffers_size 8k; # 错误时尝试下一台服务器 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; } # ---------- WebSocket 代理(长连接) ---------- location /ws/ { proxy_pass http://ws_backend/ws/; # 此处需与后端 WebSocket 路径一致 # WebSocket 必须 HTTP/1.1 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 超时时间加长(默认 60s 不够) proxy_read_timeout 300s; proxy_connect_timeout 75s; # 传递真实客户端信息 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; } # ---------- 动态 PHP 处理(FastCGI) ---------- # 匹配所有 .php 文件请求 location ~ \.php$ { # 注意:此处若使用 try_files 会检查文件是否存在,防止空脚本攻击 try_files $uri =404; # FastCGI 参数设置(引入标准参数) include fastcgi_params; # 将请求传递给 PHP-FPM(Unix Socket 或 TCP) fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # 或 127.0.0.1:9000 # 指定脚本文件名 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 超时 fastcgi_connect_timeout 60s; fastcgi_send_timeout 60s; fastcgi_read_timeout 60s; # 缓冲 fastcgi_buffers 16 16k; fastcgi_buffer_size 32k; # 缓存 FastCGI 结果(可选) # fastcgi_cache my_cache; # fastcgi_cache_valid 200 60m; } # ---------- 访问控制与限流示例 ---------- # 管理后台(/admin)限制 IP 访问 + 限流 location /admin/ { # 仅允许内网 IP 访问(示例) allow 192.168.1.0/24; allow 10.0.0.0/8; deny all; # 禁止其他所有 IP # 应用限流:每秒 5 个请求,突发 10 个排队 limit_req zone=req_limit burst=10 nodelay; limit_conn conn_limit 10; # 每个 IP 最多 10 个并发 # 代理到后端管理服务(或直接本地目录) proxy_pass http://api_backend/admin/; } # ---------- 重写规则示例 ---------- # 将旧版 URL 永久重定向到新格式(SEO) location /old-products/ { rewrite ^/old-products/(.*)$ /new-products/$1 permanent; } # 简单跳转(如 /about -> /company/about) location = /about { return 301 /company/about; } # ---------- Nginx 状态监控(需编译 stub_status 模块) ---------- location /nginx_status { stub_status on; access_log off; # 仅允许内网或本机查看 allow 127.0.0.1; allow 192.168.1.0/24; deny all; } # ---------- 自定义错误页面 ---------- error_page 404 /404.html; location = /404.html { root /var/www/myapp/html/errors; internal; # 只能内部访问 } error_page 500 502 503 504 /50x.html; location = /50x.html { root /var/www/myapp/html/errors; internal; } } # ---------------------------------------------------------------- # 可选的其它 Server 块(如 API 子域名、静态 CDN 等)可继续添加 # ---------------------------------------------------------------- # ---------- 包含其它配置片段(方便管理) ---------- include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; # Debian/Ubuntu 风格 }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/22 8:42:55

NXP电能计量库实战:滤波算法在智能电表开发中的核心应用

1. 项目概述与核心价值 在嵌入式系统开发,尤其是智能电表这类对精度和实时性要求极高的领域,数字信号处理(DSP)算法的实现质量直接决定了产品的核心竞争力。我们常常面临一个核心矛盾:如何在有限的微控制器&#xff08…

作者头像 李华
网站建设 2026/6/22 8:39:52

Java FileWriter生产级实战:编码、线程安全与资源管理

1. 这不是教科书里的“Hello World”,而是你明天写业务代码时真正会用到的 FileWriter 实战解析Java 里写文件,很多人第一反应是FileWriter——简单、直白、API 少,三行代码就能把字符串塞进 txt。但现实项目里,我见过太多人栽在这…

作者头像 李华
网站建设 2026/6/22 8:34:54

通达OA会话安全剖析:手工获取PHPSESSID的原理、实战与防御

1. 项目概述:一次针对特定管理系统的安全探索最近在和一些做安全研究的朋友交流时,聊到了一个老生常谈但又历久弥新的话题:那些广泛部署的、看似坚固的企业级应用系统,其安全边界究竟在哪里?通达OA,作为国内…

作者头像 李华
网站建设 2026/6/22 8:33:09

Kubernetes中DaemonSet与Job的精准选型与生产配置指南

1. 项目概述:为什么微服务不该“千篇一律”地跑在Deployment上?在Kubernetes里部署微服务,绝大多数人第一反应就是写个Deployment YAML,配好replicas3,apply完就去喝咖啡——这没错,但就像用菜刀切西瓜、削…

作者头像 李华
网站建设 2026/6/22 8:21:14

vLLM多卡负载均衡:DPLB动态调度原理与实战

1. 项目概述:当大模型推理遇上“高速公路调度员”你有没有遇到过这样的场景:刚把Qwen3.5-27B模型用vLLM拉起来,API服务一开,前几秒响应飞快,但并发请求一上到50路,延迟就从200ms跳到1.8秒,GPU显…

作者头像 李华
网站建设 2026/6/22 8:19:05

TensorRT部署本质:GPU推理的工程化性能压榨

1. 这不是“装个库就完事”的事:TensorRT部署的本质是工程化性能压榨你搜“TensorRT部署”跳出来的,十有八九是三行命令加一个sudo apt install tensorrt——然后呢?然后就没有然后了。项目跑起来卡在GPU显存爆满、推理延迟从标称的5ms飙到80…

作者头像 李华