Nginx

简介:

Nginx (engine x) 是一个高性能的 HTTP反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。Nginx 是由伊戈尔・赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点(俄文:Рамблер)开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

其将源代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011 年 6 月 1 日,nginx 1.0.4 发布。

Nginx 是一款轻量级Web 服务器 / 反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上 nginx 的并发能力在同类型的网页服务器中表现较好,中国大陆使用 nginx 网站用户有:百度、京东新浪网易腾讯淘宝等。


参考资料
所需文件下载密码:a11n

正向代理

概述

我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。

概念

是一个位于客户端和原始服务器 (origin server) 之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标 (原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

用途

  1. 为在防火墙内的局域网客户端提供访问 Internet 的途径
  2. 使用缓冲特性减少网络使用率

图解

反向代理

概念

以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

用途

  1. 将防火墙后面的服务器提供给 Internet 用户访问
  2. 为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务
  3. 可以启用高级 URL 策略和管理技术,从而使处于不同 web 服务器系统的 web 页面同时存在于同一个 URL 空间下

图解

负载均衡

概述

负载均衡是由多台服务器以对称的方式组成一个服务器集合, 每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求按照事先设定分配算法分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。

作用

均衡负载能够平均分配客户请求到服务器列阵,籍此提供快速获取重要数据,解决大量并发访问服务问题。

算法

  1. weight 轮询 (默认)

    每个请求按时间顺序逐一分配到不同的后端服务器, 如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。weight:指定轮询权值,weight 值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。

  2. ip_hash

    每个请求按访问 IP 的 hash 结果分配,这样来自同一个 IP 的访客固定访问一个后端服务器,有效解决了动态网页存在的 session 共享问题。

  3. fair

    比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx 本身是不支持 fair 的,如果需要使用这种调度算法,必须下载 Nginx 的 upstream_fair 模块。

  4. url_hash

    按访问 urI 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx 本身是不支持 url_hash 的,如果需要使用这种调度算法,必须安装 Nginx 的 hash 软件包。

  1. 安装 zlib 依赖库

    1
    sudo apt-get install zlib1g-dev
  2. 解压相关文件

    1
    2
    3
    tar -xzvf nginx-1.11.3.tar.gz
    tar -xZvf openssl-1.0.1.tar.gz
    tar -xZvf pcre- -841.tar.gz
  3. 进入 Nginx 解压目录

    1
    ./configure --prefix=/usr/local/nginx  --with-http_ssl_module  --with-http_flv_module  --with-http_stub_status_module   --with-http_gzip_static_module --with-pcre=../pcre-8.41  --with-openssl=../openssl-1.0.1
  4. 编译

    1
    make

    注意:如果出现 “pcre.h No such file or directory",安装"sudo apt-get install libpcre3 libpcre3-dev"

  5. 安装

    1
    sudo make install
  6. 说明

    nginx 会被安装在 /usr/local/nginx 目录下

    • conf:存放配置文件
    • html:静态网页
    • logs:存放日志文件
    • sbin:存放可执行文件

相关命令

  • 启动 Nginx 服务

    1
    sudo /usr/local/nginx/sbin/nginx
  • 关闭 Nginx 服务

    1
    sudo /usr/local/nginx/sbin/nginx -s stop
  • 重新加载配置

    1
    sudo /usr/local/nginx/sbin/nginx -s reload
  • 置顶配置文件

    1
    sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
  • 查看版本信息

    1
    2
    sudo /usr/local/nginx/sbin/nginx -v
    sudo /usr/local/nginx/sbin/nginx -V
  • 查看 80 端口占用情况

    1
    netstat -ano | grep 80
  • 关闭占用 80 端口的程序

    1
    sudo fuser -k 80/tcp

测试

  1. 启动服务

    1
    sudo /usr/local/nginx/sbin/nginx
  2. 打开浏览器,输入 Nginx 服务器 IP 地址

配置

  • 配置文件大致结构

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    main
    events {
    ....
    }
    http {
    ....
    upstream myproject {
    ....
    }
    server {
    ....
    location {
    ....
    }
    }
    server{
    ....
    location {
    ....
    }
    }
    ....
    }
  • 主要区域

    1. main (全局设置)
    2. events (nginx 工作模式)
    3. http (http 设置)
    4. sever (主机设置)
    5. location (URL 匹配)
    6. upstream (负载均衡服务器设置)
  • main

    1. 作用:全局设置
    2. 内容
      1
      2
      3
      4
      5
      6
      #user nobody;
      worker_ processes1;
      error log logs/error.log notice;
      pid
      logs/nginx.pid;
      worker_ _rlimit_ nofile 65535;
    3. user
      指定 Nginx Worker 进程运行用户以及用户组,默认由 nobody 账号运行。
    4. worker_ processes
      指定了 Nginx 要开启的子进程数。每个 Nginx 进程平均耗费 10M~12M 内存。根据经验,一般指定 1 个进程就足够了,如果是多核 CPU,建议指定和 CPU 的数量一样的进程数即可。
    5. error_ log
      用来定义全局错误日志文件,输出级别:
      1
      2
      3
      4
      5
      6
      debug
      info
      notice
      warn
      error
      crit
    6. pid
      指定进程 id 的存储文件位置
    7. worker_rlimit_nofle
      指定一个 nginx 进程可以打开的最多文件描述符数目,可以使用命令 “ulimit -n 65535" 来设置
  • events

    1. 作用
      指定 nginx 的工作模式和连接数上限
    2. 内容
      1
      2
      3
      4
      events {
      use epoll; #Linux平台
      worker_ connections 1024;
      }
    3. use
      • 作用
        指定 Nginx 的工作模式
      • 模式
        1
        2
        3
        4
        5
        6
        select	标准的工作模式
        poll 标准的工作模式
        kqueue 高效的工作模式,应用于BSD系统中
        epoll 高效的工作模式,应用于Linux平台
        rtsig
        /dev/poll
    4. worker_connections
      • 定义 Nginx 每个进程的最大连接数,即接收前端的最大请求数,默认是 1024
      • 最大客户端连接数计算方式
        1
        2
        3
        由worker_processes和worker_connections决定,即Max_clients=worker_processes*worker_connections,
        在作为反向代理时,Max_clients变为: Max_dlients = worker_processes * worker_ connections/4。
        进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效。
  • http

    1. 作用
      最核心的模块,它负责 HTTP 服务器相关属性的配置,它里面含有 server 和 upstream 子模块
    2. 内容
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      http {
      include mime.types;
      default_type application/octet- stream;
      log_format main '$remote_addr-$remote_user[$time_local]"$request" '
      '$status $body_bytes_sent "$http_referer" '
      "$http_user_agent" "$http_x_forwarded for";
      access_ log logs/ access.log main;
      sendfile on;
      tcp_ nopush on;
      tcp_ nodelay on;
      keepalive_ timeout 65;
      gzip on;

      upstream myproject {
      ....
      }
      server {
      ....
      }
      }
    3. include
      设定文件的 mime 类型,类型在配置文件目录下的 mime.type 文件定义,来告诉 nginx 来识别文件类型
    4. default_type
      设定了默认的类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置 asp 的 locate 环境时,Nginx 是不予解析的,此时,用浏览器访问 asp 文件就会出现下载了
    5. log_format
      设置日志的格式,和记录哪些参数,这里设置为 main,刚好用 access_log 来纪录这种类型,格式:
      1
      2
      127.0.0.1 - - [21/Apr/2015:18:09:54 +0800] "GET /index.php HTTP/1.1" 200 87151 "_" "Mozilla/5.0 (Macintosh;
      Intel Mac OSX 10 .10_ 2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36"
    6. access_log
      纪录每次的访问日志的文件地址,后面的 main 是日志的格式样式,对应于 log_format 的 main
    7. sendfle
      开启高效文件传输模式。将 tcp_nopush 和 tcp_nodelay 两个指令设置为 on 用于防止网络阻塞
    8. tcp_nopush
    9. keepalive_timeout
      设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接
    10. gzip
      使用压缩模块
  • server

    1. 作用
      用来定义一个虚拟主机
    2. 内容
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      server {
      listen 8080;
      server_name localhost;
      charset utf-8;
      access_log logs/host.access.log main;
      error_page 500 502 503 504 /50x.html;
      location ... {
      ...
      }
      }
    3. listen
      指定虚拟主机的服务端口
    4. server_name
      指定 IP 地址或者域名,多个域名之间用空格分开
    5. charset
      设置网页的默认编码格式
    6. access_log
      指定此虚拟主机的访问日志存放路径,最后的 main 用于指定访问日志的输出格式
    7. error_log
      指定此虚拟主机的错误日志存放路径,最后的 error 用于指定访问日志的输出格式
    8. error_page
      错误页面
    9. root
      表示在这整个 server 虚拟主机内,全部的 root web 根目录。注意要和 locate {} 下面定义的区分开来
    10. index
      全局定义访问的默认首页地址。注意要和 locate {} 下面定义的区分开来
  • location

    1. 作用
      • 是 nginx 中用的最多的,也是最重要的模块,负载均衡、反向代理、虚拟域名都与它相关
      • 定位 URL,解析 URL,所以它也提供了强大的正则匹配功能,也支持条件判断匹配,用户可以通过 location 指令实现 Nginx 对动、静态网页进行过滤处理
    2. 访问 nginx 本机目录文件
      1
      2
      3
      4
      location / {
      root html;
      index index.html index.htm;
      }
      1
      2
      3
      location /static/ {
      alias /var/static/;
      }
    3. 反向代理配置
      1
      2
      3
      4
      5
      location / {
      proxy_pass http://www.suyin.tech:8000;
      proxy_set_header X-real-ip $remote_addr;
      proxy_set_header Host $http_host;
      }

      适用于 Django 使用自带 runserver 方式启动服务

    4. 采用 wsgi 方式
      1
      2
      3
      4
      5
      # 采用uwsgi方式
      location / {
      include uwsgi_params;
      uwsgi_pass suyin;
      }

      适用于 Django 使用 wsgi 方式启动服务

  • upstream

    1. 作用
      负债负载均衡模块,通过一个简单的调度算法来实现客户端 IP 到后端服务器的负载均衡
    2. 内容
      1
      2
      3
      4
      5
      6
      upstream suyin {
      ip_hash;
      server 10.11.0.1:8080;
      server 10.11.0.2:8080 down;
      server 10.11.0.3:8080 max_fails=3 fail_timeout=20s;
      }
    3. suyin
      指定负载均衡器的名称,这个名称可以任意指定,在后面需要的地方直接调用即可
    4. 负载均衡调度算法
      • weight
      • ip_hash
      • fair
      • url_hash
    5. down
      表示当前的 server 暂时不参与负载均衡
    6. backup
      预留的备份机器。当其他所有的非 backup 机器出现故障或者忙的时候,才会请求 backup 机器,因此这台机器的压力最轻
    7. max_fails
      允许请求失败的次数,默认为 1。当超过最大次数时,返回 proxy_next_upstream 模块定义的错误
    8. fail_timeout
      在经历了 max_fails 次失败后,暂停服务的时间。max_fails 可以和 fail_timeout 一起使用
    9. 注意
      当负载调度算法为 ip_hash 时, 后端服务器在负载均衡调度中的状态不能是 weight 和 backup
    10. 说明
      nginx 的 worker_rlimit_nofle 达到上限时,再有客户端链接报 502 错误,用了 log_format 指令设置了日志格式之后,需要用 access_log 指令指定日志文件的存放路径
    11. 使用
      1
      2
      3
      4
      5
      6
          upstream suyin {
      server 10.11.0.1:8080 weight=1 max_fails=1 fail_timeout=300s;
      server 10.11.0.2:8080 welght=2 max_falls=1 fall_timeout=300s;
      server 10.11.0.3:8080 weight=1 max_fails=1 fail_timeout=300s;
      }
      }

反向代理服务器的基本配置

  1. proxy_pass

    1
    2
    3
    4
    5
    6
    7
    8
    9
    proxy_pass URL;
    配置块location if
    此配置将当前请求代理到URL参数指定的服务器上,URL可以是主机名或者IP地址加PORT的形式
    proxy_pass htp://localhost:8000;
    也可以结合负载均衡实用<负载均衡会说明这种情况>
    也可以吧HTTP转换成HTTPS
    proxy_pass http://192.168.0.1;
    默认情况反向代理不转发请求中的Host头部,如果需要设置转发头部
    则:proxy_set_header Host $host;
  2. proxy_method

    1
    2
    3
    4
    proxy_method method_name;
    配置块 http server location
    此配置项表示转发时的协议方法名:proxy_method POST;
    那么客户端发来的GET请求在转发时方法改为POST;
  3. proxy_hide_header

    1
    2
    3
    4
    5
    6
    proxy_hide_header header1;
    配置块 http server location;
    Nginx会将上游服务器的响应转发给客户端,但默认不转发HTTP头部字段(Date Server X-Pad X-Accel-* )
    使用proxy_hide_header可以指定任意头部不能被转发
    proxy_hide_header Cache-Control;
    proxy_hide_header MicrosoftOfceWebServer;
  4. proxy_pass_header

    1
    2
    3
    4
    proxy_pass_header header1;
    配置块 http server location
    功能与 proxy_hide_header相反,是设置哪些头部允许转发.
    proxy_pass_header X-Accel-Redirect;
  5. proxy_pass_request_body

    1
    2
    3
    4
    proxy_pass_request_body offlon;
    默认 on
    配置块 http server location;
    确定上游服务器是否向上游服务器转发HTTP包体
  6. proxy_pass_request_header

    1
    2
    3
    4
    proxy_pass_request_header on | off;
    默认 on
    配置块 http server location
    确定是否转发HTTP头部
  7. proxy_redirect

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    proxy_redirect [default | off | redirect | replacement]
    默认 default
    配置块 http server location
    当上游服务响应时重定向或刷新(HTTP 301 302),proxy_ redirect可以重设HTTP头部的location或refresh字段

    proxy_redirect http://locahost:8000/two/ http://frontend/one/;
    上游响应302,location是URI是 http://locahost:8000/two/some/uri/
    那是实际转发给客户端的是 http://frontend/one/some/uri/;
    可以使用前面提到的 ngx_http_core_module 模块提供的变量
    proxy_redirect http://locahost:8000/two/ http://$host:server_port/;
    可以省略replacement参数的主机名部分,这时候用虚拟主机名填充
    proxy_redirect http://locahost:8000/two/ /one/;

    使用off参数的时候,将使location和refresh的字段维持不变
    proxy_redirect off;

    如果使用的proxy_redirect default;
    下面两种配置是等效的
    location /{
    proxy_pass http://upstream:port/two/;
    proxy_redirect default;
    }
    location /{
    proxy_pass http://upstream:port/two/;
    proxy_redirect http://upstream.port/two/ /one/;
    }
  8. proxy_next_upstream

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    proxy_next_upstream [error | timeout | invalid_header | http_500 | http_502~504 | http_404 | off]
    默认 proxy_next_upstream error timeout;
    配置块 http server location

    此配置表示上游一台服务 器转发请求出现错误时,继续换一套服务器处理这个请求
    其参数用来说明在那些情况下继续选择下一台上游服务器转发请求.
    error 向上游发起连接发送请求读取响应时出错
    timeout 发送请求或读取响应时出错
    invalid_header 上游服务器发送的响应时不合法
    http_500 上游响应500
    http_502 上游响应502
    http_503 上游响应503
    http_504 上游响应504
    http_404 上游响应404
    off 关闭 proxy_next_upstream 功能只要一出错就选择另外一台上游再次出发
    Nginx反向代理模块中还提供很多配置,如设置连接的超时时间,临时文件如何存储,如何缓存上游服务器响应等功能。