• 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 等都进行一致的高性能响应。

  • 相关阅读:
    Python
    TERSUS笔记116-删除数据操作
    TERSUS笔记115-修改数据操作
    TERSUS笔记114-表格分页操作
    TERSUS笔记113-查询数据操作
    TERSUS笔记111-上传图片在列表中显示
    TERSUS笔记110-增加保存验证数据操作
    TERSUS笔记103-本地开发测试mysql数据库连接
    TERSUS笔记102-CSS样式和icon图标设置说明
    TERSUS笔记101-常用元件和操作说明
  • 原文地址:https://www.cnblogs.com/yangyongjie/p/12093175.html
Copyright © 2020-2023  润新知