Nginx 单机百万QPS环境搭建

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

二、准备

我以前也没有搞过高并发的网络,最近看了一些博客文章,准备用一个最简单的模型来实现这个百万QPS的模拟。后台我是用Java写的,Tomcat服务器。这种带业务的请求,单机绝对不可能到达百万QPS(1m-qps)。网上所说的1m-qps测试环境是一个静态的网页来测试的。既然带业务的http单机不能达到要求,那就需要用到集群了。就我目前所学到的知识,基本就只会搭建下面如图所示的集群架构了。

一台性能比较好的机器按照nginx作为负载均衡,剩下的一些普通的机器就在后面。数据库目前只用到一个,后续如何优化和扩展不在本次讨论。

如果使用上面的架构,出去数据库后,整个HTTP的性能瓶颈就在最前面的Nginx负载均衡上了。其他的HTTP-jsp-tomcat机器如果性能不够,可以通过多加几台机器进行水平扩展。而最前面的Nginx就不行了。所以本次所要测试的就是如何让nginx支持1m-qps,并且机器正常工作。nginx只是做数据转发而已。

硬件:服务器88核、128G内存

软件:Debian 8, Nginx 1.11,  wrk压力测试工具

三、操作

  1. 首先设置一些Linux系统参数 在/etc/sysctl.conf 中增加如下配置
 1 vm.swappiness = 0
 2 net.ipv4.neigh.default.gc_stale_time=120
 3 net.ipv4.conf.all.rp_filter=0
 4 net.ipv4.conf.default.rp_filter=0
 5 net.ipv4.conf.default.arp_announce = 2
 6 net.ipv4.conf.all.arp_announce=2
 7 net.ipv4.tcp_max_tw_buckets = 100
 8 net.ipv4.tcp_syncookies = 0
 9 net.ipv4.tcp_max_syn_backlog = 3240000
10 net.ipv4.tcp_window_scaling = 1
11 #net.ipv4.tcp_keepalive_time = 60
12 net.ipv4.tcp_synack_retries = 2
13 net.ipv6.conf.all.disable_ipv6 = 1
14 net.ipv6.conf.default.disable_ipv6 = 1
15 net.ipv6.conf.lo.disable_ipv6 = 1
16 net.ipv4.conf.lo.arp_announce=2
17 fs.file-max = 40000500
18 fs.nr_open = 40000500
19 net.ipv4.tcp_tw_reuse = 1
20 net.ipv4.tcp_tw_recycle = 1
21 net.ipv4.tcp_keepalive_time = 1
22 net.ipv4.tcp_keepalive_intvl = 15
23 net.ipv4.tcp_keepalive_probes = 3
24 
25 net.ipv4.tcp_fin_timeout = 5
26 net.ipv4.tcp_mem = 768432 2097152 15242880
27 net.ipv4.tcp_rmem = 4096 4096 33554432
28 net.ipv4.tcp_wmem = 4096 4096 33554432
29 net.core.somaxconn = 6553600
30 net.ipv4.ip_local_port_range = 2048 64500
31 net.core.wmem_default = 183888608
32 net.core.rmem_default = 183888608
33 net.core.rmem_max = 33554432
34 net.core.wmem_max = 33554432
35 net.core.netdev_max_backlog = 2621244
36 kernel.sem=250 65536 100 2048
37 kernel.shmmni = 655360
38 kernel.shmmax = 34359738368
39 kerntl.shmall = 4194304
40 kernel.msgmni = 65535
41 kernel.msgmax = 65536
42 kernel.msgmnb = 65536
43 
44 net.netfilter.nf_conntrack_max=1000000
45 net.nf_conntrack_max=1000000
46 net.ipv4.netfilter.ip_conntrack_max=1000000
47 kernel.perf_cpu_time_max_percent=60
48 kernel.perf_event_max_sample_rate=6250
49 
50 net.ipv4.tcp_max_orphans=1048576
51 kernel.sched_migration_cost_ns=5000000
52 net.core.optmem_max = 25165824
53 
54 kernel.sem=10000 2560000 10000 256

还有在命令行中输入 ulimit -n 20000500

上面的所有参数,这里就不多讲了,具体想要了解的可以上网找资料

2.Nginx 安装 及其配置

nginx用最简单的apt-get 也可以,用源码按照也可以。没有什么特殊要求。下面的配置就有点要求了。 $NGINX/conf/nginx.conf (/etc/nginx/conf/nginx.conf)

 1 worker_processes  88; #这个根据硬件有多少核CPU而定
 2 pid        logs/nginx.pid;
 3 
 4 events {
 5     worker_connections  1024;
 6 }
 7 
 8 http {
 9  include mime.types;
10     default_type  application/octet-stream;
11  sendfile on;
12  tcp\_nopush on;
13 
14     keepalive_timeout  65;
15 
16     gzip off;
17  access\_log off; #日志功能要关闭
18 
19  server {
20         listen       888 backlog=168888;
21  server\_name localhost;
22       root /dev/shm/;
23  }
24 
25 }

上面这个是最简单的配置,具体的Nginx还有很多可以调优的,还有nginx负载均衡配置,请参考我的另外一片博客<Nginx + Tomcat 动静分离实现负载均衡 http://www.cnblogs.com/wunaozai/p/5001742.html>


 1 worker_processes 4;
 2 
 3 error_log /var/log/nginx/error.log info;
 4 
 5 pid /var/run/nginx.pid;
 6 
 7 
 8 events{
 9  use epoll;
10     worker_connections 409600;
11  multi\_accept on;
12  accept\_mutex off;
13 }
14 
15 
16 http{
17  sendfile on;
18  tcp\_nopush on;
19  tcp\_nodelay on;
20     open_file_cache max=200000 inactive=200s;
21  open\_file\_cache\_valid 300s;
22     open_file_cache_min_uses 2;
23     keepalive_timeout 5;
24     keepalive_requests 20000000;
25     client_header_timeout 5;
26     client_body_timeout 5;
27  reset\_timedout\_connection on;
28     send_timeout 5;
29 
30  #日志
31  access\_log off;
32     #access_log /var/log/nginx/access.log;
33     #error_log /var/log/nginx/error.log;
34     #gzip 压缩传输
35     gzip off;
36  #最小1K
37  #gzip\_min\_length 1k; 
38     #gzip_buffers 16 64K;
39     #gzip_http_version 1.1;
40     #gzip_comp_level 6;
41     #gzip_types text/plain application/x-javascript text/css application/xml application/javascript;
42  #gzip\_vary on;
43  #负载均衡组
44  #静态服务器组
45     #upstream static.zh-jieli.com {
46     #    server 127.0.0.1:808 weight=1;
47  #}
48  #动态服务器组
49     upstream zh-jieli.com {
50         server 127.0.0.1:8080;
51  }
52  #配置代理参数
53  #proxy\_redirect off;
54  #proxy\_set\_header Host $host;
55     #proxy_set_header X-Real-IP $remote\_addr;
56     #proxy_set_header X-Forwarded-For $proxy\_add\_x\_forwarded\_for;
57  #client\_max\_body\_size 10m;
58  #client\_body\_buffer\_size 128k;
59     #proxy_connect_timeout 65;
60     #proxy_send_timeout 65;
61     #proxy_read_timeout 65;
62  #proxy\_buffer\_size 4k;
63     #proxy_buffers 4 32k;
64  #proxy\_busy\_buffers\_size 64k;
65  #缓存配置
66     #proxy_cache_key '$host:$server\_port$request\_uri';
67  #proxy\_temp\_file\_write\_size 64k;
68     ##proxy_temp_path /dev/shm/JieLiERP/proxy\_temp\_path;
69     ##proxy_cache_path /dev/shm/JieLiERP/proxy_cache_path levels=1:2 keys_zone=cache_one:200m inactive=5d max_size=1g;
70     #proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
71     
72  server{
73         listen 88 backlog=163840;
74  server\_name test2;
75         root /dev/shm/;
76  }
77 
78  server {
79         listen 443 ssl;
80  server\_name test;
81         location / {
82  index index;
83  }
84 
85         location ~ .*$ {
86  index index;
87             proxy_pass http://zh-jieli.com;
88  }
89  ssl on;
90         ssl_certificate keys/client.pem;
91         ssl_certificate_key keys/client.key.unsecure;
92  }
93 }

View Code

  1. 创建一个简单的html文件

看到 root  /dev/shm/ 了吗, 这个就是http服务器根目录了。 echo “a” > /dev/shm/a.html

  1. 安装wrk

git clone https://github.com/wg/wrk.git  然后 make

四、运行

启动nginx

启动wrk 进行并发请求测试

./wrk -t88 -c10000 -d20s "http://127.0.0.1:888/a.html"

top结果图

wrk 结果图

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

片转存中…(img-u7QnH5Bt-1715810259016)]
[外链图片转存中…(img-qgx1hCyg-1715810259016)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

<think>嗯,用户之前问过CDN静态资源的设计,现在又想知道自己用Nginx搭建静态页面和CDN静态资源有什么不同。我需要先理解两者的基本概念,再找出它们的区别。 首先,用户可能是在考虑自己搭建服务器和用CDN之间的选择,或者想优化现有架构。他们可能对性能、成本、维护等方面有疑问。需要明确两者的核心区别,比如CDN的全球分布节点和Nginx的单点部署。 接下来,我需要对比功能、性能、成本、扩展性、安全等方面。Nginx作为反向代理和Web服务器,适合单点或简单架构,而CDN是多节点分发,适合大范围加速。缓存机制方面,Nginx需要手动配置,而CDN自动管理边缘节点缓存。 还要考虑用户的实际应用场景,比如小型网站可能用Nginx足够,但高流量或全球用户就需要CDN。安全方面,CDN通常自带DDoS防护,而Nginx需要自己配置安全措施。 用户可能还有隐藏的问题,比如成本效益,或者如何结合两者使用。比如是否可以在Nginx基础上再接入CDN,这样既利用CDN的分发,又保留自己的服务器控制权。 最后,总结两者的适用场景,帮助用户根据需求做出选择。确保回答清晰,结构合理,覆盖用户可能关心的各个方面。</think>自己使用 **Nginx 搭建静态页面**与通过 **CDN 分发静态资源**在功能、性能、扩展性和运维成本等方面有显著差异。以下是两者的核心区别和适用场景分析: --- ### **1. 核心能力对比** | **维度** | **Nginx 静态服务器** | **CDN 静态资源分发** | |------------------|-----------------------------------------------|---------------------------------------------| | **定位** | 单点/集群的 Web 服务器,直接托管静态文件。 | 分布式缓存网络,通过边缘节点加速分发静态资源。 | | **缓存层级** | 仅本地缓存(依赖 `proxy_cache` 或浏览器缓存)。 | 多级缓存(边缘节点、中间层、源站),覆盖全球节点。 | | **网络覆盖** | 受限于服务器物理位置(如单机房或云服务器区域)。 | 全球边缘节点,用户就近访问。 | | **扩展性** | 需手动扩容服务器或配置负载均衡。 | 自动弹性扩展,天然支持高并发和大流量。 | | **安全性** | 需自行配置防火墙、HTTPS、防盗链等。 | 自带 DDoS 防护、HTTPS 加速、防盗链等安全能力。 | | **运维成本** | 需维护服务器、监控、备份、安全更新等。 | 托管式服务,运维成本低(依赖 CDN 厂商 SLA)。 | --- ### **2. 关键差异详解** #### **(1) 性能与延迟** - **Nginx**: - 用户请求直接访问源站服务器,延迟取决于服务器位置与用户距离。 - 若服务器部署在单一区域(如北京),上海用户访问延迟可能较高。 - **CDN**: - 资源缓存在离用户最近的边缘节点(如上海、广州、纽约等),显著降低延迟。 - 实测中,CDN 可将静态资源加载时间减少 **30%~70%**(尤其对海外用户)。 #### **(2) 缓存与回源机制** - **Nginx**: - 缓存仅存在于服务器本地(通过 `proxy_cache` 模块)或用户浏览器。 - 所有未命中缓存的请求直接由 Nginx 处理,无中间层优化。 - **CDN**: - 边缘节点缓存资源,命中缓存时无需回源。 - 回源请求会经过 CDN 中间层缓存(如存在),进一步减少源站压力。 #### **(3) 高并发与容灾** - **Nginx**: - 单机性能有限(受限于 CPU、带宽、内存),需自行搭建集群和负载均衡(如 Keepalived + Nginx)。 - 容灾依赖人工切换或复杂架构设计。 - **CDN**: - 天然分布式架构,自动负载均衡,轻松应对突发流量(如百万QPS)。 - 多节点冗余,单节点故障无感知。 #### **(4) 安全防护** - **Nginx**: - 需手动配置安全策略:如 `limit_req` 限流、`ModSecurity` WAF 规则、HTTPS 证书更新。 - DDoS 防护能力弱,依赖云厂商的基础防护。 - **CDN**: - 集成 Web 应用防火墙(WAF)、DDoS 流量清洗、HTTPS 加速(支持 TLS 1.3)。 - 自动识别恶意请求(如 CC 攻击、爬虫)。 --- ### **3. 适用场景对比** | **场景** | **Nginx 静态服务器** | **CDN 静态资源分发** | |-------------------------|---------------------------------------------|-------------------------------------------| | **小型网站/内部系统** | ✅ 低成本、简单部署,适合流量低且用户集中的场景。 | ❌ 过度设计,可能增加成本。 | | **全球用户访问** | ❌ 延迟高,用户体验差。 | ✅ 通过边缘节点就近分发,加速全球访问。 | | **突发流量(如秒杀)** | ❌ 需提前扩容服务器,成本高且响应慢。 | ✅ 自动弹性扩展,无需人工干预。 | | **动态+静态混合资源** | ✅ 可统一托管动态接口和静态页面,简化架构。 | ❌ 动态资源需额外回源,可能增加延迟。 | | **敏感数据托管** | ✅ 数据完全自主控制,适合合规性要求高的场景。 | ❌ 依赖第三方 CDN 厂商,可能存在数据隐私风险。 | --- ### **4. 实践建议** #### **(1) 何时选择 Nginx?** - 用户群体集中在单一区域(如本地企业官网)。 - 预算有限,且流量峰值可预测(无需弹性扩展)。 - 需要完全控制服务器环境和数据(如政府、金融场景)。 #### **(2) 何时选择 CDN?** - 用户分布全球,对加载速度敏感(如电商、媒体网站)。 - 预期有突发流量(如促销、热点事件)。 - 希望降低运维复杂度,专注业务开发。 #### **(3) 混合架构:Nginx + CDN** - **典型方案**: 1. 使用 Nginx 作为源站服务器,托管静态资源。 2. 通过 CDN 加速分发,配置 CDN 回源到 Nginx。 3. 对动态 API 保持直连源站,静态资源走 CDN。 - **优势**: - 兼顾自主控制与加速能力。 - 通过 CDN 隐藏源站 IP,提升安全性。 --- ### **5. 配置示例(Nginx 作为 CDN 源站)** ```nginx # Nginx 配置静态资源缓存与 Gzip 压缩 server { listen 80; server_name source.example.com; location /static/ { root /var/www/html; # 设置缓存头(供 CDN 和浏览器缓存) add_header Cache-Control "public, max-age=31536000"; # 启用 Gzip 压缩 gzip on; gzip_types text/css application/javascript image/png; } # 动态请求直接处理 location /api/ { proxy_pass http://backend_app; } } ``` --- ### **总结** - **Nginx 静态服务器**:简单、可控、低成本,适合小规模或区域性服务。 - **CDN 静态资源分发**:高性能、高可用、全球覆盖,适合大规模、高并发场景。 - **最佳实践**:多数场景下,结合 Nginx(源站) + CDN(加速层)的混合架构,既能利用 CDN 的加速能力,又保留了自主控制权。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值