Nginx 基础知识点整理(续)—— 反向代理

Posted 程序杂烩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx 基础知识点整理(续)—— 反向代理相关的知识,希望对你有一定的参考价值。

上部分主要是nginx的一些基本配置相关的内容,本次是接着上一部分继续写的,关于一些Nginx高效的一些原因,及反向代理的使用。

Nginx的worker进程数量为什么要与CPU核心数量一致呢?

Nginx的一个worker进程可以同时处理的请求数只受限于内存的大小,而在架构设计上,不同的worker进程之间处理并发请求时几乎没有同步锁的限制,worker进程通常不会进入休息睡眠状态,所以,当Nginx上的进程数与CPU核心数相等时,进程间切换的代价是最小的。每个worker进程都是单线程的进程,多worker进程可以充分利用多核系统架构,如果worker进程数多于CPU内核数,那么会增大进程间切换带来的消耗(Linux是抢占式内核)。Nginx为了更好的利用多核的特性,提供了cpu亲缘性的绑定选项,可以将某个进程绑定在某一个核上,这样就不会因为进程的切换带来cache的失效。

关于事件模型epoll的一些了解

epoll库是Nginx服务器支持高性能事件驱动库,属于poll库的一个变种,是在Linux2.5.44引入。它与poll/select库最大的区别在于效率。

poll和select的处理方式

    1. 创建一个待处理事件列表

    2. 列表发送到内核

    3.返回时再轮询检查这个列表,判断事件是否发生。

epoll 的处理方式

1.epoll 库通过相关调用通知内核创建一个有N个描述符的事件列表

2. 给描述符设置所关注事件,并添加到内核事件列表

3. 通过相关能用对事件列表中的描述符进行修改与删除


这样,只需要在进程启动时建立一个epoll对象,并在需要的时候进行添加或者删除就可以了。

关于反向代理

反向代理(Reverse Proxy) 方式是指用代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端。
如下图

当客户端发来HTTP请求时,Nginx并不立刻转发到上游服务器,而是先把用户的请求完整地接收到Nginx所在的服务器的硬盘或者内存中,然后再向上游服务器发起连接,把缓存的客户端请求转发到上游服务器。这种方式的缺点是延长了一个请求的处理时间,并增加了用于缓存请求内容的内存和磁盘空间。而优点则不言而喻,大大降低了上游服务器的负载,尽量把压力放到Nginx的服务器上。

反向代理的基本配置

  1. proxy_pass URL

    该配置项会将当前的请求反向代理到URL参数指定的服务器上,URL可以是主机名或者IP+port形式,也可以是UNIX句柄,亦或者是直接使用upstream块。

    注意 反向代理默认情况下不会转发请求中的Host头部分,如果需要转发,则必须加上 proxy_set_header Host $host.

    1. # 主机名+端口方式

    2. proxy_pass http://example.com:8080/path

    3. # UNIX句柄

    4. proxy_pass http://unix:/path/to/back.socket:/path/;

    5. # 负载均衡方式

    6. upstream backend {...}

    7. proxy_pass http://backend;

  2. proxy_method method

    该配置项表示转发时的协议方法名。如果设置为POST,则客户端发过的GET请求也会转发为POST请求。

  3. proxy_hide_header Header

    该配置项会禁止某些HTTP头部字段不能被转发

  4. proxy_pass_header Header

    与proxy_hide_header刚好相反,会将原来禁止转发的header设置为转发

  5. proxy_pass_request_body on | off

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

  6. proxy_pass_request_headers on | off

    确定是否转发HTTP头部

  7. proxy_redirect [default|off|redirect|replacement]

    当上游服务器返回的响应是重定向或刷新请求时,proxy_redirect 可以重设HTTP头部的location或refresh。

反向代理实例

 
   
   
 
  1. upstream backendServer  {

  2.    server 192.168.0.1:8080 weight=10;

  3.    server 192.168.0.2:8080 weight=10;

  4.    server 192.168.0.3:8080 weight=10;

  5.    ...

  6. }

  7. server {

  8.    listen 80;

  9.    server_name  www.example.com;

  10.    access_log  logs/example.access.log  main;

  11.    error_log  logs/example.error.log;

  12.    root   html;

  13.    index  index.html index.htm index.php;

  14.    ## send request to backendServer ##

  15.    location / {

  16.        proxy_pass  http://backendServer;

  17.        #Proxy Settings

  18.        proxy_redirect     off;

  19.        proxy_set_header   Host             $host;

  20.        proxy_set_header   X-Real-IP        $remote_addr;

  21.        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

  22.        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

  23.        proxy_max_temp_file_size 0;

  24.        proxy_connect_timeout      90;

  25.        proxy_send_timeout         90;

  26.        proxy_read_timeout         90;

  27.        proxy_buffer_size          4k;

  28.        proxy_buffers              4 32k;

  29.        proxy_busy_buffers_size    64k;

  30.        proxy_temp_file_write_size 64k;

  31.   }

  32. }




以上是关于Nginx 基础知识点整理(续)—— 反向代理的主要内容,如果未能解决你的问题,请参考以下文章

nginx重新整理——————反向代理[五]

Nginx基础知识

nginx配置-反向代理

nginx的反向代理和配置

Nginx 反向代理内容替换(整理总结一套自己需要的东西)

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