1. Nginx反向代理为什么能够提升服务器性能?
对于后端是动态服务来说,比如 Java 和 PHP。这类服务器(如 JBoss 和 PHP-FPM)的 IO 处理能力往往不高。 Nginx 有个好处是它会把 Request 在读取完整之前 buffer 住,这样交给后端的就是一个完整的 HTTP 请求,从而提高后端的效率,而不是断断续续的传递(互联网上连接速度一般比较慢)。 同样,Nginx 也可以把 response 给 buffer 住,同样也是减轻后端的压力。
2. Nginx 和 Apache 各有什么优缺点?
nginx 相对 apache 的优点:
1)轻量级,同样起web服务,比apache占用更少的内存及资源
2)抗并发,nginx处理请求是异步非阻塞的,而apache则是阻塞型的,在高并发下nginx能保持
3)低资源低消耗高性能
4)高度模块化的设计,编写模块相对简单
5)社区活跃,各种高性能模块出品迅速啊
apache 相对 nginx 的优点:
1)rewrite,比nginx的rewrite强大
2)模块超多,基本想到的都可以找到
3)少bug,nginx的bug相对较多
4)超稳定,一般来说,需要性能的 web 服务,用 nginx 。 如果不需要性能只求稳定,那就 apache 吧。
3. Nginx 多进程模型是如何实现高并发的?
进程数与并发数不存在很直接的关系。这取决取 server 采用的工作方式。如果一个 server 采用一个进程负责一个 request 的方式,那么进程数就是并发数。那么显而易见的,就是会有很多进程在等待中。等什么?最多的应该是等待网络传输。
Nginx 的异步非阻塞工作方式正是利用了这点等待的时间。在需要等待的时候,这些进程就空闲出来待命了。因此表现为少数几个进程就解决了大量的并发问题。apache 是如何利用的呢,简单来说:同样的 4 个进程,如果采用一个进程负责一个 request 的方式,那么,同时进来 4 个 request 之后,每个进程就负责其中一个,直至会话关闭。期间,如果有第 5 个 request 进来了。就无法及时反应了,因为 4 个进程都没干完活呢,因此,一般有个调度进程,每当新进来了一个 request,就新开个进程来处理。nginx 不这样,每进来一个 request,会有一个 worker 进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发 request,并等待请求返回。那么,这个处理的 worker 不会这么傻等着,他会在发送完请求后,注册一个事件: “如果 upstream 返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有 request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件, worker 才会来接手,这个request 才会接着往下走。
由于 web server 的工作性质决定了每个 request 的大部份生命都是在网络传输中,实际上花费在 server机器上的时间片不多。这是几个进程就解决高并发的秘密所在。webserver 刚好属于网络 io 密集型应用,不算是计算密集型。异步,非阻塞,使用 epoll,和大量细节处的优化。也正是 nginx 之所以然的技术基石。
4. 如何测试一个网站的性能(并发数)?
Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域。 它可以用于测试静态和动态资源例如静态文件、Java小服务程序、CGI脚本、Java 对象、数据库, FTP服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来在不同压力类别下测试它们的强度和分析整体性能。另外,JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性,JMeter允许使用正则表达式创建断言
参考资料:https://blog.youkuaiyun.com/zhang_ps/article/details/51345904
5. Nginx负载均衡是怎么配置的?反向代理是什么?
打开nginx.conf,在http段加入
Upstream server_lb{
server localhost:8080;
server localhost:8081;
}
在server的配置里引入一个proxy_pass的http:// server_lb
反向代理服务器:
反向代理决定哪个服务器提供服务。
服务器1,服务器2
通常的代理服务器,只用于代理内部网络对Internet的接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。
欢迎关注作者的公众号《Java编程生活》,每日记载Java程序猿工作中遇到的问题