ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Nginx核心配置与实战指南:从反向代理到性能调优

Nginx核心配置与实战指南:从反向代理到性能调优 1. 从“它是什么”到“你为什么需要它”如果你在互联网行业待过哪怕只是稍微接触过服务器运维或者后端开发Nginx 这个名字你肯定听过。它经常和“高性能”、“反向代理”、“负载均衡”这些词绑在一起。但很多新手甚至一些用过一段时间的人对它的理解可能还停留在“一个挺好用的 Web 服务器”这个层面。今天我想从一个干了十多年运维和架构的老兵视角跟你聊聊 Nginx不止是安装配置而是把它掰开了、揉碎了讲清楚它到底是怎么工作的以及在实际项目中我们到底该怎么用它、怎么“治”它。简单说Nginx 是一个高性能的 HTTP 和反向代理服务器也是一个 IMAP/POP3/SMTP 代理服务器。这个官方定义听起来有点干巴巴。我更喜欢把它比作一个超级智能的交通枢纽。想象一下你有一个大型机场你的服务器集群每天有成千上万的航班用户请求要起降。Nginx 就是这个机场的塔台和调度中心。它不生产飞机不直接运行业务逻辑但它决定了哪架飞机在哪个跑道降落将请求转发到哪台后端服务器如何高效地排队负载均衡如何应对恶劣天气限流、熔断以及如何把国际航班引导到正确的海关通道反向代理、SSL终结。为什么你需要它如果你的网站每天只有几十个访问量用 Apache 甚至一个简单的 Python Flask 应用直接监听端口问题不大。但一旦流量上来并发连接数增多或者你需要部署多个服务、做高可用Nginx 几乎就成了必需品。它的核心优势在于事件驱动、异步非阻塞的架构这使得它在处理海量并发连接时内存占用极低性能远超传统的多进程/多线程模型如 Apache 的 prefork 模式。我经历过太多项目从单机 Apache 切换到 Nginx 后同样的硬件QPS每秒查询率直接翻倍CPU 和内存使用率还降下来了。所以这篇教程的目标不是给你一堆冷冰冰的配置命令而是带你理解这个“交通枢纽”的运作规则、设计图纸配置文件以及当“堵车”高并发或“事故”故障发生时你该如何指挥调度。我们会从最核心的配置文件讲起覆盖安装、基础配置、核心模块再到反向代理、负载均衡、动静分离、性能调优、安全加固等高级主题最后分享一些我踩过的坑和压箱底的调试技巧。2. 核心配置文件nginx.conf的深度解构Nginx 的一切行为都源于一个文件nginx.conf。它通常位于/etc/nginx/、/usr/local/nginx/conf/或编译安装的目录下。理解这个文件的结构是驾驭 Nginx 的第一步。很多人改配置只知其然出了问题就到处搜片段就是因为没读懂这个“设计总图”。配置文件是由一个个指令和上下文Context构成的。指令就是命令比如worker_processes上下文则像是一个个容器规定了指令的作用范围。整个配置文件可以看作一个嵌套的树形结构。2.1 全局块定义 Nginx 的“基因”配置文件最外层不属于任何{}的指令属于全局块。这里设置的指令影响整个 Nginx 服务器。user nginx nginx; # 定义运行 Nginx 进程的用户和组。安全最佳实践使用非 root 用户。 worker_processes auto; # 工作进程数。设置为 auto 通常是最佳选择Nginx 会自动设置为 CPU 核心数。 error_log /var/log/nginx/error.log warn; # 错误日志路径和级别。级别从低到高debug, info, notice, warn, error, crit。生产环境用 warn 或 error。 pid /run/nginx.pid; # 主进程 PID 文件位置。 worker_rlimit_nofile 65535; # 一个工作进程能打开的最大文件描述符数量。高并发场景必须调高需同步调整系统限制ulimit -n。 events { worker_connections 1024; # 单个工作进程允许的最大并发连接数。最大客户端数 worker_processes * worker_connections。 use epoll; # 在 Linux 上使用高效的事件驱动模型 epoll。这是默认值通常无需显式设置。 multi_accept on; # 允许一个工作进程同时接受多个新连接。在高并发短连接场景下有助于提升性能。 }关键解读worker_processes auto这是 Nginx 1.3.8 和 1.2.5 之后引入的。我建议就用auto让 Nginx 自己判断。除非你有特殊需求比如想把某些进程绑定到特定的 CPU 核心上做优化。worker_connections这个数字不是越大越好。它受限于worker_rlimit_nofile和系统的fs.file-max限制。一个连接至少对应一个文件描述符。计算最大并发时别忘了 Nginx 自身可能还需要连接后端服务器、读写本地文件等会占用额外的文件描述符。events块专门用来配置事件驱动模型相关的参数。epoll是 Linux 2.6 内核下的最佳选择。2.2http块Web 服务的“大本营”http块是配置 HTTP 服务器相关功能的核心区域。所有网站、代理的配置都嵌套在它里面。http { # 基础设置 include /etc/nginx/mime.types; # 引入 MIME 类型映射文件告诉浏览器不同后缀文件的类型。 default_type application/octet-stream; # 默认 MIME 类型。如果找不到对应类型就用这个二进制流。 # 日志格式定义 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 on; # 启用 sendfile 系统调用直接在内核空间完成文件数据传输零拷贝性能极高。 tcp_nopush on; # 与 sendfile on 配合使用。仅在数据包装满时才发送提高网络效率。 tcp_nodelay on; # 启用 TCP_NODELAY 选项禁用 Nagle 算法降低小数据包的延迟。对于高交互应用很重要。 keepalive_timeout 65; # 客户端长连接保持时间秒。减少 TCP 握手开销但占用连接资源。 types_hash_max_size 2048; # MIME 类型哈希表的最大大小。文件类型很多时可以适当调大。 # 引入其他配置文件重要模块化管理的关键 include /etc/nginx/conf.d/*.conf; # 包含 conf.d 目录下所有 .conf 文件。这是管理多站点的标准做法。 include /etc/nginx/sites-enabled/*; # 另一种常见做法通常用于 symlink 到 sites-available。 }关键解读与避坑sendfile ontcp_nopush ontcp_nodelay on这是 Nginx 静态文件服务的“性能三剑客”。对于静态资源图片、CSS、JS一定要打开。但注意如果 Nginx 后面是反向代理到动态应用如 Tomcat, Node.js并且启用了gzip压缩那么sendfile和gzip可能会冲突因为gzip需要先读取内容到内存压缩而sendfile是直接发送。此时Nginx 会自动降级但了解这个机制有助于排查问题。include指令这是保持配置文件整洁和可维护的生命线。千万不要把所有站点的配置都堆在nginx.conf里。通过include将不同站点的配置分离到独立文件管理起来清晰得多。conf.d/和sites-available//sites-enabled/是两种主流模式本质都是利用include。keepalive_timeout需要根据业务权衡。对于 API 服务器或频繁请求的页面设置一个合理的值如 30-65秒能显著提升性能。但对于海量用户、连接数巨大的场景如即时通讯的轮询过长的超时可能导致连接数耗尽此时可能需要调低或结合连接数限制。2.3server块定义一个个“虚拟主机”server块嵌套在http块内每个server块定义了一个虚拟主机Virtual Host用来处理一组特定的域名和端口请求。这是你配置网站的地方。server { listen 80; # 监听端口。可以是 listen 80; listen 443 ssl; listen [::]:80 ipv6onlyon; server_name example.com www.example.com; # 服务器名用于匹配请求的 Host 头。支持通配符(*)和正则表达式(~)。 root /var/www/example.com/html; # 该站点的根目录。请求 /index.html 会映射到 /var/www/example.com/html/index.html。 index index.html index.htm; # 定义索引文件。当请求以 / 结尾时Nginx 会按顺序查找这些文件。 location / { try_files $uri $uri/ 404; # 非常实用的指令。按顺序检查请求的文件是否存在 - 是否存在对应的目录 - 返回404。 } # 一个简单的反向代理例子 location /api/ { proxy_pass http://backend_server_pool; # 将以 /api/ 开头的请求转发到名为 backend_server_pool 的上游服务器组。 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 静态文件服务优化 location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; # 设置浏览器缓存30天 add_header Cache-Control public, immutable; # 现代缓存控制头 access_log off; # 静态资源访问日志通常可以关闭减少磁盘IO } }关键解读server_name匹配规则有优先级精确匹配 以开头的通配符如*.example.com 以结尾的通配符如www.example.* 正则表达式匹配~ default_server。理解这个顺序对处理多域名和兜底配置很重要。location块这是 Nginx 配置的灵魂。它定义了如何响应不同的 URI 请求。匹配规则同样有优先级精确匹配 ^~前缀匹配停止搜索正则 ~或~*正则匹配~*不区分大小写 普通前缀匹配。错误的优先级会导致配置不生效这是最常见的坑之一。try_files我强烈推荐在静态站点中使用它。它比单纯的rootindex更健壮能优雅地处理前端路由如 Vue Router 的 history 模式只需最后指向一个前端入口文件try_files $uri $uri/ /index.html;。proxy_set_header反向代理时默认情况下Nginx 会修改或丢弃一些请求头。Host头通常会被改为上游服务器的地址这可能导致上游服务器基于域名的配置失效。X-Real-IP和X-Forwarded-For是为了将客户端的真实 IP 传递给后端应用否则后端日志里看到的全是 Nginx 服务器的 IP。3. 核心功能实战反向代理、负载均衡与动静分离理解了配置文件的结构我们就可以动手实现 Nginx 最核心的几个功能了。这些功能往往是结合使用的。3.1 反向代理隐藏后端统一入口反向代理是 Nginx 最常用的功能。客户端感知不到后端服务器的存在所有请求都发给 Nginx由 Nginx 转发给后端并将响应返回给客户端。场景你的应用运行在http://localhost:3000比如一个 Node.js 应用但你想用http://yourdomain.com来访问。server { listen 80; server_name yourdomain.com; location / { proxy_pass http://localhost:3000; # 核心指令指向后端服务地址 # 以下是一组重要的代理头设置确保信息正确传递 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 60s; # 与后端服务器建立连接的超时时间 proxy_send_timeout 60s; # 向后端发送请求的超时时间 proxy_read_timeout 60s; # 从后端读取响应的超时时间 proxy_buffering on; # 启用响应缓冲提升性能 proxy_buffer_size 4k; # 存储响应头的缓冲区大小 proxy_buffers 8 4k; # 存储响应体的缓冲区数量和大小 } }为什么需要设置这些头Host很多 Web 应用尤其是使用虚拟主机的依赖Host头来决定显示哪个网站。如果不传递后端可能收到错误的Host如localhost:3000导致路由或链接生成错误。X-Real-IP/X-Forwarded-For这是为了获取用户真实 IP。后端应用的访问日志、风控系统、限流功能都需要真实 IP。X-Forwarded-For是一个链式结构记录了请求经过的所有代理 IP。X-Forwarded-Proto告诉后端用户最初使用的是 HTTP 还是 HTTPS。这对于生成正确的重定向 URL比如强制 HTTPS或应用内部判断协议至关重要。3.2 负载均衡分摊流量提升可用性当单台后端服务器扛不住压力时就需要负载均衡。Nginx 内置了多种负载均衡算法。http { # 1. 定义上游服务器组upstream upstream backend_servers { # 负载均衡算法默认为 round-robin轮询 # least_conn; # 最少连接数 # ip_hash; # 基于客户端IP的哈希保证同一IP落到同一后端可用于会话保持 server 192.168.1.101:8080 weight3 max_fails3 fail_timeout30s; server 192.168.1.102:8080 weight2; server 192.168.1.103:8080 backup; # 备份服务器当其他都不可用时才启用 server 192.168.1.104:8080 down; # 标记为永久下线用于维护 } server { listen 80; server_name app.yourdomain.com; location / { proxy_pass http://backend_servers; # 代理到上游服务器组 # ... 其他代理设置同上 } } }负载均衡算法详解轮询 (round-robin)默认方式。按顺序将请求分发给后端服务器。配合weight参数可以实现加权轮询给性能好的服务器更高权重。最少连接 (least_conn)将新请求发给当前活跃连接数最少的服务器。适合处理时间长短不一的请求场景。IP 哈希 (ip_hash)根据客户端 IP 地址计算哈希值固定分配给某台后端服务器。这能解决会话Session保持问题确保同一用户的请求始终落到同一台后端避免 Session 丢失。但这也破坏了负载的绝对均衡且后端服务器增减时会影响大部分用户的映射。注意ip_hash是基于客户端 IP 的前三段C类网络地址计算的。如果大量用户来自同一个局域网如公司出口IP相同会导致负载严重不均。对于现代无状态应用使用 Token 或外部 Session 存储如 Redis应尽量避免使用ip_hash。健康检查max_fails和fail_timeout参数构成了 Nginx 被动的健康检查机制。在fail_timeout时间内如果连续失败次数达到max_failsNginx 会认为该服务器不可用在接下来的fail_timeout时间内不再向其转发请求。这是一种简单有效的故障隔离。3.3 动静分离解放应用服务器加速静态资源动静分离是提升网站性能的经典手段。将静态文件图片、CSS、JS、字体交给 Nginx 直接处理动态请求才转发给后端应用服务器如 Tomcat, PHP-FPM。server { listen 80; server_name www.yourdomain.com; root /data/www; # 动态请求转发给后端应用 location / { proxy_pass http://app_server; # ... 代理头设置 } # 静态资源由 Nginx 直接处理 location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ { expires 1y; # 设置长期缓存利用浏览器缓存 add_header Cache-Control public, immutable; access_log off; # 关闭访问日志减少IO压力 # 可以进一步开启 gzip 压缩如果未在全局开启 gzip_static on; # 优先使用预压缩的 .gz 文件 # try_files 可以用于检查文件是否存在不存在则返回404或转发给后端 try_files $uri 404; } # 单独处理 HTML 文件缓存策略可以短一些 location ~* \.html$ { expires 1h; # HTML 文件缓存时间短便于更新 add_header Cache-Control public, must-revalidate; } }核心优势性能Nginx 处理静态文件的效率极高sendfile,tcp_nopush远高于应用服务器。减少了应用服务器的 I/O 和 CPU 负担。缓存可以方便地为静态资源设置 HTTP 缓存头利用浏览器和 CDN 缓存极大减少重复请求。并发释放了应用服务器的连接数让它能更专注于处理业务逻辑。实操心得expires和Cache-Control头一起使用Cache-Control的优先级更高。immutable属性告诉浏览器在资源过期前即使刷新页面也不要重新验证非常适合版本化的静态资源如main.a1b2c3.css。gzip_static on;是一个好东西。它会让 Nginx 优先寻找同名的.gz文件例如style.css.gz。你可以在构建阶段预先压缩好静态资源这样 Nginx 就省去了实时压缩的 CPU 开销直接发送压缩好的文件性能更好。4. 性能调优与安全加固实战指南配置好了基本功能下一步就是让 Nginx 跑得更快、更稳、更安全。这部分往往是区分普通使用者和资深运维的关键。4.1 性能调优从参数到系统层1. 连接与缓冲区优化http { # 全局连接优化 keepalive_timeout 30s; # 根据业务调整API 可以短门户网站可以长。 keepalive_requests 100; # 单个长连接上最多可处理的请求数。达到后关闭连接防止内存泄漏。 # 客户端请求体限制防止过大请求攻击 client_max_body_size 10m; # 允许客户端请求体的最大大小上传文件时需要调整。 # 代理缓冲区优化针对反向代理场景 proxy_buffering on; proxy_buffer_size 4k; # 存储响应头的缓冲区 proxy_buffers 8 4k; # 存储响应体的缓冲区数量 * 大小 proxy_busy_buffers_size 16k; # 忙碌时缓冲区大小 proxy_temp_path /var/cache/nginx/proxy_temp; # 临时文件路径确保有足够空间 # 开启 Gzip 压缩对文本内容效果显著 gzip on; gzip_vary on; gzip_min_length 1k; # 小于此值不压缩 gzip_comp_level 6; # 压缩级别 1-9权衡 CPU 和压缩比6 是个好选择 gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xmlrss text/javascript; # 注意图片、PDF等二进制文件通常已压缩再压缩浪费CPU且效果甚微。 }调优依据proxy_buffers的大小需要根据后端响应的平均大小来调整。如果后端经常返回大响应如文件下载需要调大proxy_buffers和proxy_busy_buffers_size否则 Nginx 会频繁与磁盘交换数据使用proxy_temp_path影响性能。2. 系统层优化Nginx 性能也受限于操作系统。以下是一些关键的 Linux 内核参数调整在/etc/sysctl.conf中修改后执行sysctl -p# 增加最大文件描述符数量 fs.file-max 655350 # 优化网络堆栈 net.core.somaxconn 65535 # 监听队列长度需配合nginx中listen指令的backlog参数 net.ipv4.tcp_max_syn_backlog 65535 net.core.netdev_max_backlog 32768 # 启用 TCP 快速打开TFO net.ipv4.tcp_fastopen 3 # 优化 TCP 连接生命周期 net.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_tw_recycle 0 # 在 NAT 环境下tcp_tw_recycle 可能导致问题建议设为 0 net.ipv4.tcp_fin_timeout 30注意net.ipv4.tcp_tw_recycle在高版本内核中已废弃且在存在 NAT 的网络中容易导致连接问题生产环境建议设置为 0。4.2 安全加固筑起防线1. 隐藏 Nginx 版本和信息在http块或server块中添加server_tokens off; # 在错误页面和响应头中隐藏 Nginx 版本号更进一步可以自定义错误页面或者使用第三方模块彻底修改 Server 头。2. 限制访问速率与连接数防止 CC 攻击和暴力扫描。http { # 定义限制区 limit_req_zone $binary_remote_addr zoneapi_limit:10m rate10r/s; limit_conn_zone $binary_remote_addr zoneaddr_conn:10m; server { location /api/ { limit_req zoneapi_limit burst20 nodelay; # 限速每秒10请求突发20个 limit_conn addr_conn 10; # 限制同一IP同时最多10个连接 proxy_pass http://backend; } # 静态资源通常不需要严格限速 location ~* \.(jpg|css|js)$ { limit_req off; limit_conn off; } } }$binary_remote_addr用二进制存储 IP比字符串节省空间。zoneapi_limit:10m定义了一个名为api_limit、大小为 10MB 的共享内存区大约可以存储 16 万个 IP 的状态。burst允许处理突发流量nodelay表示对突发请求立即处理而不是延迟。3. 配置 HTTPS 与强化 SSL现在是 HTTPS 的时代。使用 Let‘s Encrypt 免费证书是标准做法。server { listen 443 ssl http2; # 启用 HTTP/2 server_name yourdomain.com; ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # 强化的 SSL 配置 ssl_protocols TLSv1.2 TLSv1.3; # 禁用老旧不安全的 SSL/TLS 版本 ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_session_tickets off; # 启用 HSTS强制浏览器使用 HTTPS谨慎使用一旦启用很难回退 add_header Strict-Transport-Security max-age63072000; includeSubDomains; preload always; # ... 其他 location 配置 } # HTTP 强制跳转到 HTTPS server { listen 80; server_name yourdomain.com; return 301 https://$server_name$request_uri; }安全建议定期使用 SSL Labs 测试你的 SSL 配置确保获得 A 评级。ssl_ciphers的配置需要随着时间更新以禁用被发现的弱密码套件。4. 防止常见 Web 攻击SQL 注入、XSS 等虽然主要靠应用层防护但 Nginx 可以通过modsecurity模块WAF提供一层额外的防护。路径遍历在location块中确保没有不安全的文件路径拼接。禁用不必要的 HTTP 方法location / { if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 405; } # ... }注意if指令在 Nginx 中需要谨慎使用它有性能开销且可能引发一些意料之外的行为。对于限制方法更好的方式是在后端应用或专门的 WAF 中处理。5. 高级场景、故障排查与运维心得5.1 高级配置场景1. 根据 User-Agent 或条件进行分流map $http_user_agent $backend_pool { default http://web_pc; # 默认后端 ~*bot|crawler|spider http://web_bot; # 爬虫流量导向特定后端 ~*mobile|android|iphone http://web_mobile; # 移动端流量 } server { location / { proxy_pass $backend_pool; # ... } }2. 使用auth_basic做简单认证location /admin { auth_basic Admin Area; auth_basic_user_file /etc/nginx/.htpasswd; # 使用 htpasswd 命令生成此文件 # ... 其他代理或静态配置 }3. 实现 Websocket 代理WebSocket 连接需要特殊的代理头来保持连接升级。location /ws/ { proxy_pass http://websocket_backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host $host; proxy_read_timeout 3600s; # Websocket 连接通常很长需要调大超时 }5.2 故障排查与日志分析当 Nginx 出现问题时日志是你的第一手资料。1. 错误日志 (error.log)error.log的级别在nginx.conf的全局块中设置。排查问题时可以临时改为debug级别但会产生大量日志。connect() failed (111: Connection refused)Nginx 无法连接到上游服务器。检查后端服务是否运行、防火墙规则、网络连通性。upstream timed out (110: Connection timed out)与上游服务器通信超时。检查后端服务性能、网络延迟或调整proxy_connect_timeout、proxy_read_timeout。open() /path/to/file failed (13: Permission denied)文件权限问题。检查 Nginx 工作进程用户通常是nginx或www-data是否有权读取该文件或访问该目录。could not build the proxy_headers_hash通常是因为server_names_hash_bucket_size或server_names_hash_max_size设置过小用于处理大量域名时。在http块中适当调大这两个值。2. 访问日志 (access.log)通过自定义log_format你可以记录丰富的信息。分析访问日志可以帮助你发现异常请求大量 404、40x、50x 状态码的请求可能是扫描或攻击。分析流量来源通过$http_referer和$http_user_agent。定位慢请求通过记录$request_timeNginx 处理请求的总时间和$upstream_response_time后端处理时间可以轻松找出性能瓶颈。log_format detailed $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $request_time $upstream_response_time;3. 常用排查命令nginx -t测试配置文件语法是否正确。修改配置后务必先执行此命令nginx -s reload平滑重载配置不中断现有连接。nginx -s stop/systemctl stop nginx停止服务。ps aux | grep nginx查看 Nginx 进程状态。lsof -i:80或ss -tlnp | grep :80检查 80 端口是否被 Nginx 正常监听。tail -f /var/log/nginx/error.log实时查看错误日志。5.3 运维心得与踩坑记录配置管理一定要用版本控制系统如 Git管理你的 Nginx 配置文件。每次修改前备份修改后nginx -t测试。对于多台服务器考虑使用 Ansible、SaltStack 等工具进行配置分发。平滑升级Nginx 支持热升级。通过kill -USR2 old_master_pid可以启动新的主进程然后逐步关闭旧的工作进程。但这过程相对复杂对于大多数场景在负载均衡器后面逐台服务器进行滚动重启是更稳妥的方式。“地址已在使用”错误重启 Nginx 有时会报bind() to 0.0.0.0:80 failed (98: Address already in use)。这通常是因为旧的 Nginx 进程没有完全退出。可以用fuser -k 80/tcp强制关闭占用端口的进程或者等待一下再重启。try_files与$uri/的坑try_files $uri $uri/ 404;中的$uri/意味着如果请求路径是一个存在的目录Nginx 会尝试在这个目录下找索引文件index指令定义的。如果你不想暴露目录列表确保目录下存在索引文件或者移除$uri/这个参数。负载均衡下的 Session 问题这是经典问题。除了ip_hash更优雅的解决方案是使用外部 Session 存储如 Redis 或 Memcached让所有后端服务器共享 Session 数据。这样应用就成为了无状态服务扩容缩容、服务器故障都不会影响用户会话。监控与告警给 Nginx 配置监控是必须的。关键指标包括活跃连接数Active connections、每秒请求数Requests per second、各上游服务器的健康状态、错误状态码4xx, 5xx的数量。Nginx 自带一个简单的状态模块ngx_http_stub_status_module或者使用更强大的nginx-module-vts模块将数据暴露给 Prometheus 进行收集和告警。Nginx 的强大远不止于此还有流媒体代理、邮件代理、Lua 扩展OpenResty等高级功能。但掌握以上这些核心概念和实战配置你已经能够解决 90% 以上的日常需求并建立起一个高性能、可扩展、安全的 Web 服务前端。记住最好的学习方式就是动手去配去踩坑然后回头来理解为什么。配置文件里的每一个指令背后都有其设计哲学和适用场景。
返回列表