03《Nginx 入门教程》Nginx 与 Apache 对比

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了03《Nginx 入门教程》Nginx 与 Apache 对比相关的知识,希望对你有一定的参考价值。

参考技术A

如果说 nginx 是新生代霸主的话,那么 Apache 就是当之无愧的老霸主。至少在前几年 Nginx 在 Web 服务器领域只是占据老二的位置。

但是随着互联网的发展,越来越多的人和企业开始转向 Nginx 的怀抱,从而使得 Nginx 的市场占有率逐年上升,直到牢牢占据第一的宝座。那么这一对新老技术的代表之间,究竟有着怎样的差别呢?

Nginx 的进程模型前面已经提到过,它是通过 异步的、非阻塞的、事件驱动的方式实现的。 Nginx 的工作进程是多进程的,每个 Worker 进程可以异步处理大量的用户请求,因此在 高并发下 Nginx 能保持低资源低消耗高性能。

Apache 有一共有三种稳定的 MPM(Multi-Processing Module,多进程处理模块)模式 ,其中最常用和默认的是 prefork 模式。prefork 是一个非线程型的、预派生的 MPM,使用多个进程,每个进程在某个确定的时间只单独处理一个连接,效率高,但内存使用比较大。一个进程相对占用更多的系统资源,消耗更多的内存。

因此,Apache 并不擅长处理高并发请求。 在这种场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。因此 Apache 是阻塞型的。当用户请求过多时,开启的进程较多,占用内存大,每秒最多的并发连接请求 最多不超过 3000 个,而 Nginx 则可以每秒并发连接超过 10 万请求。

Nginx 的配置简洁,且支持正则表达式,使用起来非常方便。在启动或者热加载时都会优先检查配置文件是否存在语法错误。Apache 的配置则略显复杂,而且只有启动时候才知道配置是否存在问题,如果是重启出错则会导致服务中断,进而影响业务。

根据前面的进程模型对比,我们可以看出: Nginx 是轻量级、支持高并发、海量请求的 web 服务器,而 Apache 是重量级、不支持高并发的 web 服务器

Nginx 在处理静态文件方面的性能要远超于Apache,而且支持压缩、缓存等配置。 Nginx 最擅长的是静态资源访问和反向代理。其反向代理模块也同时支持 4 层协议( 主要是 TCP 协议/ UDP 协议 )和七层协议( HTTP 协议、WebSocket 协议、WSGI 协议 等)的反向代理。同时也可以作为负载均衡服务器,也支持 4 层和 7 层的负载均衡,这些优势是 Apache 无法比拟的。但是 Apache 在处理动态请求方面有较大优势,比如 rewrite(对 url 重写)功能。如果网站使用 rewrite 频繁的情况下,建议用 Apache。

此外,根据 Nginx 和 Apache 的进程模型,可以看到,Apache 一个进程对应一个连接请求,而 Nginx 的一个 worker 进程可能对应很多个连接请求,这样如果 Nginx 的一个进程死掉,会影响比较多的用户请求, 所以 Apache 相比 Nginx 会更稳定一些。

Nginx 安装和启动都特别容易, 并且几乎可以做到 7*24 不间断运行 ,即使运行数个月也不需要重新启动,支持热部署,实现不间断服务的情况下进行软件版本的升级与版本的回退。而 Apache 在修改配置后,只能手工重启服务或者使用第三方插件实现热部署,期间服务会出现短暂的不可用。

Apache 出现时间比较早,仍然是主流的 Web 服务器,拥有丰富的特性,成熟的技术和开发社区,还有数不甚数的第三方插件。 而 Nginx 作为后起之秀,社区同样非常活跃,版本迭代更新快,各种高性能的第三方模块层出不穷 。使用 Apache 和 Nginx 中出现的大部分问题都能在社区和网上找到相应的解决方案。

Nginx入门与基础之反向代理配置介绍

 众所周知,nginx是一个很优秀的反向代理服务器,它反向代理的性能堪比haproxy,在很多应用场景中,nginx常常单独作为反向代理server+keepalived的配合构建高性能,高可用集群,下面我们讲讲nginx配置反向代理时一些常用配置参数说明,如下:

一. nginx反向代理配置说明

1.1 proxy_pass

语法:proxy_pass URL;

配置块:location、if

此配置项将当前请求反向代理到URL参数指定的服务器上,URL可以是主机名或IP地址加端口的形式,例如:

proxy_pass http://localhost:8000/uri/; 

也可以是UNIX句柄:

proxy_pass http://unix:/path/to/backend.socket:/uri/;

还可以如上节负载均衡中所示,直接使用upstream块,例如:

upstream backend {  
  …  
}  
 
server {  
  location / {  
    proxy_pass  http://backend;  
  }  
}

用户可以把HTTP转换成更安全的HTTPS,例如:

 proxy_pass https://192.168.0.1; 

默认情况下反向代理是不会转发请求中的Host头部的。如果需要转发,那么必须加上配置:

proxy_set_header Host $host; 

1.2 proxy_method

语法:proxy_method method;

配置块:http、server、location

此配置项表示转发时的协议方法名。例如设置为

proxy_method POST;

那么客户端发来的GET请求在转发时方法名也会改为POST。

1.3 proxy_hide_header

语法:proxy_hide_header the_header;

配置块:http、server、location

Nginx会将上游服务器的响应转发给客户端,但默认不会转发以下HTTP头部字段:Date、Server、X-Pad和X-Accel-*。使用proxy_hide_header后可以任意地指定哪些HTTP头部字段不能被转发。例如:

proxy_hide_header Cache-Control;  
proxy_hide_header MicrosoftOfficeWebServer;

1.4 proxy_pass_header

语法:proxy_pass_header the_header;

配置块:http、server、location

与proxy_hide_header功能相反,proxy_pass_header会将原来禁止转发的header设置为允许转发。例如:

proxy_pass_header X-Accel-Redirect;

1.5 proxy_pass_request_body

语法:proxy_pass_request_body on | off;

默认:proxy_pass_request_body on;

配置块:http、server、location

作用为确定是否向上游服务器发送HTTP包体部分。

1.6 proxy_pass_request_headers

语法:proxy_pass_request_headers on | off;

默认:proxy_pass_request_headers on;

配置块:http、server、location

作用为确定是否转发HTTP头部。

1.7 proxy_redirect

语法:proxy_redirect [ default|off|redirect replacement ];

默认:proxy_redirect default;

配置块:http、server、location

当上游服务器返回的响应是重定向或刷新请求(如HTTP响应码是301或者302)时,proxy_redirect可以重设HTTP头部的location或refresh字段。

例如,如果上游服务器发出的响应是302重定向请求,location字段的URL是:http://localhost:8000/two/some/uri/,那么在下面的配置情况下,实际转发给客户端的locationhttp://frontend/one/some/uri/

proxy_redirect http://localhost:8000/two/ http://frontend/one/; 

这里还可以使用ngx-http-core-module提供的变量来设置新的location字段。例如

proxy_redirect   http://localhost:8000/    http://$host:$server_port/;  

也可以省略replacement参数中的主机名部分,这时会用虚拟主机名称来填充。例如:

proxy_redirect http://localhost:8000/two/ /one/;

使用off参数时,将使location或者refresh字段维持不变。例如:

proxy_redirect off;

使用默认的default参数时,会按照proxy_pass配置项和所属的location配置项重组发往客户端的location头部。例如,下面两种配置效果是一样的:                                   

location /one/ {  
 proxy_pass       http://upstream:port/two/;  
 proxy_redirect   default;  
}  
 
location /one/ {  
proxy_pass       http://upstream:port/two/;  
proxy_redirect   http://upstream:port/two/   /one/;  
}

1.8 proxy_next_upstream

语法:proxy_next_upstream [error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_404 | off ];

默认:proxy_next_upstream error timeout;

配置块:http、server、location

 此配置项表示当向一台上游服务器转发请求出现错误时,继续换一台上游服务器处理这个请求。前面已经说过,上游服务器一旦开始发送应答,Nginx反向代理服务器会立刻把应答包转发给客户端。因此,一旦Nginx开始向客户端发送响应包,之后的过程中若出现错误也是不允许换下一台上游服务器继续处理的。这很好理解,这样才可以更好地保证客户端只收到来自一个上游服务器的应答。proxy_next_upstream的参数用来说明在哪些情况下会继续选择下一台上游服务器转发请求。

error:当向上游服务器发起连接、发送请求、读取响应时出错。

timeout:发送请求或读取响应时发生超时。

invalid_header:上游服务器发送的响应是不合法的。

http_500:上游服务器返回的HTTP响应码是500。

http_502:上游服务器返回的HTTP响应码是502。

http_503:上游服务器返回的HTTP响应码是503。

http_504:上游服务器返回的HTTP响应码是504。

http_404:上游服务器返回的HTTP响应码是404。

off:关闭proxy_next_upstream功能—出错就选择另一台上游服务器再次转发。

 Nginx的反向代理模块还提供了很多种配置,如设置连接的超时时间、临时文件如何存储,以及最重要的如何缓存上游服务器响应等功能。这些配置可以通过阅读ngx_http_proxy_module模块的说明了解,只有深入地理解,才能实现一个高性能的反向代理服务器。

上面所讲的就是nginx反向代理的一些基本配置参数说明,如想要仔细了解关于nginx的反向代理相关设置请访问http://nginx.org/en/docs/http/ngx_http_proxy_module.html 


本文出自 “菜鸟的成长记” 博客,请务必保留此出处http://blief.blog.51cto.com/6170059/1739178

以上是关于03《Nginx 入门教程》Nginx 与 Apache 对比的主要内容,如果未能解决你的问题,请参考以下文章

Nginx系列教程| 一文带你读懂Nginx的正向与反向代理

day03.集群部署zookeeper大数据教程

nginx+keepalived高可用

Nginx面试题

Nginx入门与实践

nginx入门到精通目录