为什么Nginx反向代理能做到提高网站的性能?
Nginx假如作为纯粹的反向代理服务器,而且不做一点缓存,也不做静态文件服务,每一个HTTP请求都转发到后端,这样不能提高性能吧?可我感觉像是提高了,但是原因一直没有想通
1楼(未知网友)
推荐一本书《构建高性能Web站点》
2楼(未知网友)
反向代理可以提高网站性能???这个单机环境下是没啥作用的。在集群环境下,Nginx可以支持负载均衡,使网站获得更好的性能和稳定性。
Nginx的快速, 其实在于Linux上优秀网络模型epoll 的支持
而传统Select模型很低效
3楼(未知网友)
提高的是吞吐量,而不是性能
4楼(未知网友)
这是横向伸缩
5楼(未知网友)
如果同时部署在一台机器上,不会有提升,在高并发下性能反而会下降,你可以用ab压一压。
起码在我测试python web server的时候是这样的,前端包个nginx返向代理,做ab测试时,并发100的情况下,平均性能会比不用ngingx下降30%左右,本来建立一次tcp连接就完事了,因为有个返向代理还得再多做一次,在高并发的情况下肯定有性能损失。
6楼(未知网友)
如果nginx 作为纯粹的代理服务器,我不认为对整个网站的性能有所提高,除非nginx 和你的后端是两台不同的服务器。
我们不要相信感觉,让数字来说话。实测了得出数据来比较,才能下定论,性能提高了。
从理论上分析并猜测一下:
假设你的后端是指 apache+php handler ,前面搭一个nginx 作为代理。
nginx 只是将请求转发,后端仍然要面对那么多的请求,没有任何性能上面的帮助,怎么会性能高呢?
而且还nginx 和 apache 还建立了多一次的tcp 连接,在低并发下不会有什么感觉,但在高并发下,性能肯定会下降。
我猜测一下,你的apache 开启了keepalive ,apache 与用户保持连接,apache 也是需要去维护这些连接的,当连接数逐渐高起来的时候,apache 也就吃不消了。而把nginx 假设在前面,nginx 与后端的连接是短连接,也就是,一个请求过去了,apache 返回了就断开了。apache 不再需要维护这些连接,身上的重担少了一块,可以花多一点精力去处理请求了,从而让你感觉到好像快了。
由此我可以得出,你感觉上的性能提升,是可以通过apache 的调优来完成的,与nginx 的代理无关。
7楼(未知网友)
对于配置或架构不合理的后端应用程序,如默认只有100并发的http://asp.net程序,nginx可以在不增加进程数量级的情况下增加并发处理网络的数量,相当于给阻塞式服务套了个非阻塞的壳。
例:一台低配置阿里云,默认配置tomcat和nginx
1、没有nginx 2000并发失败。
zhblue@XXXXXX:~$ ab -n 10000 -c 2000 http://127.0.0.1:8080/pm/
This is ApacheBench, Version 2.3 <$Revision: 1528965 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, Welcome to The Apache Software Foundation!
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
apr_socket_recv: Connection reset by peer (104)
Total of 9701 requests completed
2、加上nginx
zhblue@XXXXXX:~$ ab -n 10000 -c 2000 http://127.0.0.1/pm/
This is ApacheBench, Version 2.3 <$Revision: 1528965 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, Welcome to The Apache Software Foundation!
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: nginx/1.4.6
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /pm/
Document Length: 945 bytes
Concurrency Level: 2000
Time taken for tests: 17.208 seconds
Complete requests: 10000
Failed requests: 21
(Connect: 0, Receive: 0, Length: 21, Exceptions: 0)
Non-2xx responses: 21
Total transferred: 11862213 bytes
HTML transferred: 9433956 bytes
Requests per second: 581.12 [#/sec] (mean)
Time per request: 3441.625 [ms] (mean)
Time per request: 1.721 [ms] (mean, across all concurrent requests)
Transfer rate: 673.18 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 30 61.3 0 200
Processing: 13 1605 2533.8 154 16915
Waiting: 13 1605 2533.8 154 16915
Total: 13 1635 2561.2 154 17026
Percentage of the requests served within a certain time (ms)
50% 154
66% 1103
75% 2185
80% 3020
90% 7012
95% 7409
98% 9738
99% 10115
100% 17026 (longest request)
8楼(未知网友)
在没有碰到性能问题前,不建议做这样的架构调整.保持简单,不断优化.
9楼(未知网友)
打个比方来说:
把服务器想象成饭店,没有Nginx的情况,就如同每一个厨师服务一桌顾客,从点菜开始到炒菜到上菜到收银,有n个厨师就只能服务n桌顾客。有了Nginx的话,Nginx就成了强大的服务员,把招呼,点菜、上菜和收银的活都做了,厨师只需要专心炒菜就行。这样饭店的效率就大大提高了。
技术一点的话:
请求如果直接发到同步处理的后端,那么从收到请求到把响应发出去这段时间,一个进程的资源就被占用了(比如Apache的prefork模式)。在慢连接的情况下,这个进程除了处理之外的大多数时间基本上都耗费在了无意义的等待上。Nginx在这方面的优势就在于它的异步非阻塞模型。这意味着Nginx可以通过基于事件的方式同时处理和维护多个请求,而后端就只需要去做逻辑计算,节约了等待时间去处理更多的请求。
10楼(未知网友)
对于后端是动态服务来说,比如Java和PHP。这类服务器(如JBoss和PHP-FPM)的IO处理能力往往不高。Nginx有个好处是它会把Request在读取完整之前buffer住,这样交给后端的就是一个完整的HTTP请求,从而提高后端的效率,而不是断断续续的传递(互联网上连接速度一般比较慢)。同样,Nginx也可以把response给buffer住,同样也是减轻后端的压力。