nginx学习笔记

一、简介  

  Nginx是一款免费开源的高性能HTTP服务器及反向代理服务器(Reverse Proxy)产品,同时,它还提供IMAP/POP3代理服务等功能。能够快速响应静态页面(HTML)的请求;支持FastCGI、SSL、Virtual Host、URL Rewrite、HTTP Basic Auth、Gzip等大量使用功能,并且支持第三方功能模块的扩展。其特点是占有内存少,并发能力强。

  Nginx提供的基本功能从大体上归纳为基本HTTP服务、高级HTTP服务和邮件服务等三大类。

  1、Nginx提供基本HTTP服务,可以作为HTTP代理服务器和反向代理服务器,支持通过缓存加速访问,可以完成简单的负载均衡和容错,支持包过滤功能,支持SSL等

  2、Nginx提供高级HTTP服务,可以进行自定义配置,支持虚拟主机,支持URL重定向,支持网络监控,支持流媒体传输等

  3、Nginx作为邮件代理服务器是最早开发这个产品的目的之一,它支持IMAP/POP3代理服务功能,支持内部SMTP代理服务功能

   代理:

    反向代理:代理服务器接收客户端请求

    正向代理:代理客户端请求服务器(代理客户端的请求去访问客户端不能访问的网站,如常见的翻墙工具,游戏代理)

  反向代理典型应用场景:

    将防火墙后面的服务器提供给Internet用户访问,加强安全防护。还可以为后端的多台服务器提供负载均衡,或为后端较慢的服务器提供缓冲服务。另外,反向代理还可以启动高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。

  为什么使用反向代理,原因如下:

    1)、保护和隐藏原始资源服务器

    2)、加密和 SSL 加速

    3)、通过缓存静态资源,加速 Web 请求

    4)、实现负载均衡

  

   负载均衡:

    用来在多个计算机集群、网络资源、CPU、磁盘驱动或其他资源中分配负载,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。

    对于互联网服务,负载均衡通过软件监听一个外部端口,用户通过这个端口来访问服务,而作为负载均衡器的软体会将用户的请求转发给后台内网服务器,内网服务器将请求的响应返回给负载均衡器,负载均衡器再将响应发送到用户,这样就向互联网用户隐藏了内网结构,阻止了用户直接访问后台(内网服务器),使得服务器更加安全,可以阻止对核心网络栈和运行在其他端口服务的攻击。

    当所有后台服务器均出现故障时,有些负载均衡器会提供一些特殊的功能来处理这种情况。如转发请求到一个备用的负载均衡器、显示一条关于服务中断的消息等来提高容错能力。

    nginx是常用的HTTP请求负载均衡器。

  Nginx、Apache 和 Tomcat的区别:

    Nginx:轻量级、高并发 HTTP 服务器。

    Apache HTTP Server Project:一个 Apache 基金会下的 HTTP 服务项目,和 Nginx 功能类似。

    Apache Tomcat:是 Apache 基金会下的另外一个项目,是一个 Application Server。更准确的说是一个 Servlet 应用容器,与 Apache HTTP Server 和 Nginx 相比,Tomcat 能够动态的生成资源并返回到客户端。

  

二、安装配置

1、nginx安装(ubuntu):sudo apt-get install nginx

  nginx文件安装完成之后的文件位置:

    /usr/sbin/nginx:主程序
    /etc/nginx:存放配置文件
    /usr/share/nginx:存放静态文件
    /var/log/nginx:存放日志

  nginx命令:

    查看是否安装成功:nginx -v

    启动:./nginx ,若是端口占用,使用命令netstat -anp | grep 80,找到pid,kill -9 pid 即可

    更改配置重启:./nginx -s reload,每次修改后,都需要清理一下浏览器缓存

    判断配置文件是否正确:./nginx -t

    关闭:ps -ef|grep nginx,

      kill -QUIT 主进程号 :从容停止Nginx
      kill -TERM 主进程号 :快速停止Nginx
      pkill -9 nginx :强制停止Nginx

2、nginx配置

  nginx.conf的配置文件主要分为三部分:

    1)、全局块

    2)、Events块

    3)、HTTP块

  1、全局块用来配置对整个Server都有效的参数。包括配置运行 Nginx 服务器的用户(组)、允许生成的 Worker Process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。如:

user  nobody;
worker_processes  1;
error_log  logs/error.log;

  2、Events块涉及的指令主要影响Nginx服务器与用户的网络连接

events {
    worker_connections  1024; // 每个work process支持的最大连接数为1024
}

  3、HTTP块

  代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。 需要注意的是:HTTP 块也可以包括 HTTP 全局块、Server 块。

    1)、HTTP 全局块

      HTTP 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;

    2)、Server 块

      这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。

      每个 HTTP 块可以包括多个 Server 块,而每个 Server 块就相当于一个虚拟主机。而每个 Server 块也分为全局 Server 块,以及可以同时包含多个 Locaton 块。

      (1)、全局 Server 块:也被叫做“虚拟服务器”部分,它描述的是一组根据不同server_name指令逻辑分割的资源,这些虚拟服务器响应 HTTP 请求,因此都包含在 HTTP 部分。

           最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。

server {
    listen 80;
    #server_name也支持通配符,*.example.com、www.example.*、.example.com
    server_name localhost;
    #charset koi8-r;
    #access_log logs/host.access.log main;

      (2)、Location 块:一个 Server 块可以配置多个 Location 块。

          Location 块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称 (也可以是 IP 别名)之外的字符串(例如前面的 /uri-string)进行匹配,对特定的请求进行处理。

          地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

  nginx配置语法:

    1、配置文件由指令和指令块构成

    2、每条指令以分号(;)结尾,指令和参数间以空格符分隔

    3、指令块以大括号{}将多条指令组织在一起

    4、include 语句允许组合多个配置文件以提高可维护性

    5、使用 # 添加注释

    6、使用 $ 定义变量

    7、部分指令的参数支持正则表达式

  

  在/etc/nginx/nginx.conf 配置文件中,在http块的配置中包含了下面的内容:

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*; 

  因此,针对每个业务的配置,只需在/etc/nginx/conf.d/ 文件夹下创建一个 xxx.conf的配置文件,在其中配置server块的内容即可。

3、配置内容详解

worker_process # 表示工作进程的数量,一般设置为cpu的核数
worker_connections # 表示每个工作进程的最大连接数
server{} # 块定义了虚拟主机
  listen # 监听端口
  server_name # 监听域名
  location {} # 是用来为匹配的 URI 进行配置,URI 即语法中的“/uri/”
  location /{} # 匹配任何查询,因为所有请求都以 / 开头
    root # 指定对应uri的资源查找路径,这里html为相对路径,完整路径为
        # /opt/nginx-1.7.7/html/
    index # 指定首页index文件的名称,可以配置多个,以空格分开。如有多# 个,按配置顺序查找。

  1、location配置

  location匹配规则:

  语法规则:location [=|~|~*|^~] /uri/ { … }

符号 含义
= 开头表示精准匹配
^~   开头表示uri以某个常规字符串开头,理解为匹配url路径即可。nginx不对url做编码,因此请求为 /static/20%/aa ,可以被规则 ^~/static/ /aa 匹配到(注意是空格)
~     开头表示表示区分大小写的正则匹配
~*   开头表示不区分大小写的正则匹配
/     通用匹配,任何请求都会匹配到

  多个 location 配置的情况下匹配顺序为:

    首先匹配 =
    其次匹配 ^~
    其次是按文件中顺序的正则匹配
    最后是交给 / 通用匹配
    当有匹配成功时候,停止匹配,按当前匹配规则处理请求

  location反向代理配置项:

    location:对请求URI进行匹配,location后面配置了匹配规则,支持正则匹配

    proxy_pass:proxy_pass后面跟着一个URL,用来将请求反向代理到URL参数指定的服务器上。

    proxy_set_header:默认情况下,反向代理不会转发原请求中的Host头部,如果需要转发,就需要加上:proxy_set_header Host $host;

    除了上面几个常用配置项,还有 proxy_redirect、proxy_set_body、proxy_limit_rate 等参数

 反向代理Demo:实现访问www.123.com 直接跳转到自己的机器127.0.0.1:8080上

    1):修改本机hosts文件,添加(127.0.0.1  www.123.com)将www.123.com映射到自己的机器ip上

    2):修改nginx.conf配置文件,增加如下配置 

server {
        listen       80;
        server_name  127.0.0.1;
        location / {
               proxy_pass http://127.0.0.1:8080;
        }

  2、nginx.conf 负载均衡配置

  upstream配置示例:

upstream myserver{
    ip_hash;
    server 192.168.10.13:80;
    server 192.168.10.14:80 down;
    server 192.168.10.15:8009 max_fails=3 fail_timeout=20s;
    server 192.168.10.16:8080;
}
server {
    location / {
        proxy_pass http://myserver;
    }
}    

  注,upstream 是定义在 server{ } 之外的,不能定义在 server{ } 内部。定义好 upstream 之后,用 proxy_pass 引用一下即可。

  upstream 是 Nginx 的 HTTP Upstream 模块,这个模块通过一个简单的调度算法来实现客户端 IP 到后端服务器的负载均衡。在上面的设定中,通过 upstream 指令指定了一个负载均衡器的名称 test.net。这个名称可以任意指定,在后面需要用到的地方直接调用即可。

  upstream 支持的负载均衡算法(后两项属于第三方调度算法):

    1、轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器宕机,故障系统被自动剔除,使用户访问不受影响。

    2、ip_hash:每个请求按访问IP的hash结果分配,这样来自同一个ip的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题,电子商务网站比较常用

    3、fair:比上面两个更加智能,可依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应短的优先分配。需要下载nginx的upstream_fair模块。

    4、url_hash:按访问url的hash结果分配请求,使每个url固定到同一个后端服务器,需下载nginx的hash包

    5、least_conn:最少连接负载均衡,即每次选择的后端都是当前最少连接的一个server

    6、hash:这个 hash 模块又支持两种模式 hash, 一种是普通的 hash, 另一种是一致性 hash(consistent)

    

  upstream 支持的状态参数

  在 HTTP Upstream 模块中,可以通过 server 指令指定后端服务器的 IP 地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:

    1、down:表示当前的server暂时不参与负载均衡。

    2、backup:预留的备份机器。当其他所有的非 backup 机器出现故障或者忙的时候,才会请求 backup 机器,因此这台机器的压力最轻。

    3、max_fails:允许请求失败的次数,默认为 1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。

    4、fail_timeout:在经历了 max_fails 次失败后,暂停服务的时间。max_fails 可以和 fail_timeout 一起使用。  

  当负载调度算法为 ip_hash 时,后端服务器在负载均衡调度中的状态不能是backup,因为如果负载均衡把用户分配到了backup服务器上,则不能访问到页面。

4、Nginx Rewrite

  Rewrite可以实现URL重写和重定向功能。如:下面对 /java 的请求重定向到了 /hello

server {
        listen       80;
        server_name  127.0.0.1;
        location / {
               proxy_pass http://127.0.0.1:8080;
               rewrite ^/java /hello/ rediret;
        }    

  Rewrite指令可以在Server块或Location块中配置,其基本语法如下:

rewrite regex replacement [flag];

  1)、rewrite:实现URL重写的指令

  2)、regex:用于匹配要操作的URI的正则表达式

  3)、replacement:将regex正则匹配到的内容替换成replacement

  4)、flag:标记,有如下值:

    (1)last:本条规则匹配完成后,继续向下匹配新的Location URI规则(不常用)

    (2)break:本条规则匹配完成即终止,不再匹配后面的任何规则(不常用)

    (3)redirect:返回302临时重定向,浏览器地址会显示跳转新的URL地址

    (4)permanent:返回301永久重定向,浏览器会显示跳转新的URL地址

  三、OpenResty

  OpenResty(也称为ngx_openresty)是一个基于 Nginx 与 Lua 的高性能 Web 平台,它打包了Nginx的核心和很多的常用的第三方模块以及它们的大多数依赖项。用于方便地搭建能够处理高并发、扩展性极高的动态Web应用、Web服务和动态网关。

  通过整合了众多设计良好的Nginx模块,OpenResty有效地把Nginx服务器转变为一个强大的Web应用服务器,基于它开发人员可以使用Lua变成语言对Nginx核心以及现有的各种NginxC模块进行脚本编程,构建出可以处理一万以上并发请求的极端高性能的Web应用。

  OpenResty 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。

原文地址:https://www.cnblogs.com/yangyongjie/p/12093175.html