社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  NGINX

为什么你的 Nginx 撑不住高并发?

Java架构师技术 • 1 周前 • 66 次点击  
以下文章来源Java架构师技术,回复”Spring“获惊喜礼包

责编:架构君,来源运维派(ID:yunweipai)

上一篇推文:公司新来一个技术总监:谁再在 SQL 中写 in 和 not in,直接走人!

大家好,我是Java架构师

在处理高并发场景时,很多运维同学会遇到这些痛点:

  • 并发量一上来就502/504

  • CPU使用率飙升,但吞吐量上不去

  • 连接数达到瓶颈,新请求被拒绝

  • 响应时间越来越慢,用户体验极差


这些问题的根源往往不是硬件性能,而是配置和调优不到位。让我们从基础配置开始,一步步打造能扛住高并发的Nginx。




第一部分:Nginx核心配置优化




1、工作进程与连接数配置


# 工作进程数 = CPU核心数worker_processes auto;
# 每个进程的最大连接数worker_connections 65535;
# 工作进程优先级(-20到20,数值越小优先级越高)worker_priority -10;
# CPU亲和性绑定,避免进程在CPU间切换worker_cpu_affinity auto;
# 工作进程打开文件数限制worker_rlimit_nofile 100000;


实战经验:worker_connections 不是越大越好,需要考虑内存消耗。每个连接大约消耗232-248字节内存。


2、事件驱动模型优化


events {    # 使用epoll事件驱动(Linux最优选择)    useepoll;        # 允许同时接受多个连接    multi_accepton;        # 连接数配置


    
    worker_connections65535;        # 接受连接后立即禁用accpet锁    accept_mutexoff;}


3、HTTP核心配置优化


http {    # 高效文件传输    sendfileon;    tcp_nopushon;    tcp_nodelayon;        # 连接超时配置    keepalive_timeout60;    keepalive_requests10000;    client_header_timeout10;    client_body_timeout10;    send_timeout10;        # 缓冲区大小优化    client_header_buffer_size4k;    large_client_header_buffers88k;    client_body_buffer_size128k;    client_max_body_size50m;        # 开启gzip压缩    gzipon;    gzip_varyon;    gzip_min_length1000;    gzip_comp_level6;    gzip_types        text/plain        text/css        text/javascript        application/javascript        application/json        application/xml;        # 隐藏版本信息    server_tokensoff;}


第二部分:高级性能优化配置


1、连接池和缓存优化


http {    # 连接池配置    upstream backend {        keepalive300;        keepalive_requests10000;        keepalive_timeout60s;                server192.168.1.100:8080 weight=3 max_fails=3 fail_timeout=30s;        server192.168.1.101:8080 weight=2 max_fails=3 fail_timeout=30s;    }        # 打开文件缓存    open_file_cache max=100000 inactive=20s;    open_file_cache_valid30s;    open_file_cache_min_uses2;    open_file_cache_errorson;        # FastCGI缓存配置(适用于PHP)    fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=fcgi:100m inactive=60m;    fastcgi_cache_key"$scheme$request_method$host$request_uri";    fastcgi_cache_use_staleerror timeout invalid_header http_500;}


2、限流和防护配置


http {    # 限制请求速率    limit_req_zone$binary_remote_addr zone=api:10m rate=100r/s;    limit_req_zone$binary_remote_addr zone=login:10m rate=5r/s;        # 限制连接数    limit_conn_zone$binary_remote_addr zone=perip:10m;    limit_conn_zone$server_name zone=perserver:10m;        server {        # 应用限流规则        limit_req zone=api burst=200 nodelay;        limit_conn perip 20;        limit_conn perserver 2000;                # 静态资源长缓存        location~* \.(jpg|jpeg|png|gif|ico|css|js)$ {            expires1y;            add_header Cache-Control "public, immutable";        }                # API接口优化        location /api/ {            limit_req zone=api burst=50 nodelay;            proxy_pass http://backend;            proxy_http_version1.1;            proxy_set_header Connection "";            proxy_connect_timeout5s;            proxy_send_timeout10s;            proxy_read_timeout10s;        }    }}




第三部分:操作系统内核参数优化




高并发场景下,操作系统层面的优化同样重要。以下是经过实战验证的内核参数配置:


1、网络参数优化


# 编辑 /etc/sysctl.confcat >> /etc/sysctl.conf << EOF
# 网络核心参数net.core.somaxconn = 65535net.core.netdev_max_backlog = 30000net.core.rmem_default = 262144net.core.rmem_max = 16777216net.core.wmem_default = 262144net.core.wmem_max = 16777216
# TCP参数优化net.ipv4.tcp_max_syn_backlog = 65535net.ipv4.tcp_syncookies = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_fin_timeout = 15net.ipv4.tcp_keepalive_time = 600net.ipv4.tcp_keepalive_probes = 3net.ipv4.tcp_keepalive_intvl = 15
# 连接跟踪表大小net.netfilter.nf_conntrack_max = 1048576net.nf_conntrack_max = 1048576
# 文件描述符限制fs.file-max = 1048576
EOF
# 应用配置sysctl -p


2、进程和内存参数


# 编辑 /etc/security/limits.confcat >> /etc/security/limits.conf << EOF
# 用户进程限制* soft nofile 1048576* hard nofile 1048576* soft nproc 1048576* hard nproc 1048576
# nginx用户特殊配置nginx soft nofile 1048576nginx hard nofile 1048576
EOF



第四部分:实战监控与调优



1、性能监控脚本


#!/bin/bash# nginx_monitor.sh - Nginx性能监控脚本
echo"=== Nginx连接状态 ==="ss -s
echo"=== 活跃连接数 ==="netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
echo"=== Nginx进程状态 ==="ps aux | grep nginx | grep -v grep
echo"=== 系统负载 ==="uptime
echo"=== 内存使用情况 ==="free -h
echo"=== Nginx访问统计 ==="curl -s http://localhost/nginx_status


2、性能测试命令


# wrk压测工具使用wrk -t20 -c1000 -d60s --latency http://your-domain.com/
# ab压测命令ab -n 100000 -c 1000 http://your-domain.com/
# 系统资源监控top -p $(pgrep nginx | tr '\n' ',' | sed 's/,$//')




第五部分:高并发架构最佳实践




1、多层缓存策略


# 三级缓存配置示例location / {    # L1: Nginx本地缓存    try_files$uri@proxy;}
location@proxy {    # L2: 代理缓存    proxy_cache my_cache;    proxy_cache_valid2003021h;    proxy_cache_valid4041m;    proxy_pass http://backend;        # 缓存锁,防止缓存击穿    proxy_cache_lockon;    proxy_cache_lock_timeout5s;}


2、负载均衡策略


upstream backend {    # 一致性哈希,保证会话粘性    hash $remote_addr consistent;        # 健康检查(需要nginx-plus或第三方模块)    server 192.168.1.100:8080 weight=3 max_fails=3 fail_timeout=30s;    server 192.168.1.101:8080 weight=3 max_fails=3 fail_timeout=30s;    server 192.168.1.102:8080 weight=2 max_fails=3 fail_timeout=30s backup;}




第六部分:故障排查与性能调优




常见问题及解决方案


1、502 Bad Gateway

  • 检查upstream服务状态

  • 调整proxy_connect_timeout

  • 增加worker_processes


2、连接数不够

  • 调整worker_connections

  • 检查系统文件描述符限制

  • 优化keepalive配置


3、内存占用过高

  • 调整缓存配置

  • 检查日志文件大小

  • 优化gzip配置


性能调优checklist


  • CPU核心数与worker_processes匹配

  • 文件描述符限制已调整

  • 内核网络参数已优化

  • 启用了适当的缓存策略

  • 配置了合理的超时时间

  • 实施了请求限流措施

  • 监控系统已部署




总结



通过本文的全面优化,你的Nginx服务器应该能够:


  • 支持10万+并发连接

  • 响应时间控制在100ms以内

  • CPU使用率保持在合理范围

  • 内存使用更加高效


记住,性能优化是一个持续的过程,需要根据实际业务场景不断调整。建议在生产环境应用前,先在测试环境进行充分验证。


你还有什么想要补充的吗?


欢迎有需要的同学试试,如果本文对您有帮助,也请帮忙点个 赞 + 在看 啦!❤️

在 GitHub猿 还有更多优质项目系统学习资源,欢迎分享给其他同学吧!

最后,再次推荐下我们的AI星

为了跟上AI时代我干了一件事儿,我创建了一个知识星球社群:ChartGPT与副业。想带着大家一起探索ChatGPT和新的AI时代


有很多小伙伴搞不定ChatGPT账号,于是我们决定,凡是这四天之内加入ChatPGT的小伙伴,我们直接送一个正常可用的永久ChatGPT独立账户。


不光是增长速度最快,我们的星球品质也绝对经得起考验,短短一个月时间,我们的课程团队发布了8个专栏、18个副业项目:


简单说下这个星球能给大家提供什么:


1、不断分享如何使用ChatGPT来完成各种任务,让你更高效地使用ChatGPT,以及副业思考、变现思路、创业案例、落地案例分享。

2、分享ChatGPT的使用方法、最新资讯、商业价值。

3、探讨未来关于ChatGPT的机遇,共同成长。

4、帮助大家解决ChatGPT遇到的问题。

5、提供一整年的售后服务,一起搞副业


星球福利:


1、加入星球4天后,就送ChatGPT独立账号。

2、邀请你加入ChatGPT会员交流群。

3、赠送一份完整的ChatGPT手册和66个ChatGPT副业赚钱手册。


其它福利还在筹划中... 不过,我给你大家保证,加入星球后,收获的价值会远远大于今天加入的门票费用 !


本星球第一期原价399,目前属于试运营,早鸟价169,每超过50人涨价10元,星球马上要来一波大的涨价,如果你还在犹豫,可能最后就要以更高价格加入了。。


早就是优势。建议大家尽早以便宜的价格加入!


最后,整理了500多套项目,赠送读者。扫码下方二维码,后台回复赚钱即可获取。


--END--

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!

往期惊喜:

牛逼啊!接私活必备的 400 个开源项目!赶快收藏吧(附源码合集)!

何谓架构?

一个很酷的后台权限管理系统

一个很酷的博客系统

ChatGPT 4.0 国内直接用 !

推荐一套通用管理后台,快速开发、一键生成代码、多端自适应!
性能爆表:SpringBoot利用ThreadPoolTaskExecutor批量插入百万级数据实测!
换掉ES!Redis官方搜索引擎来了,效率大幅提升


扫码关注我们的Java架构师技术

带你全面深入Java

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/198523