• Nginx学习笔记


    一,什么是Nginx?
    Nginx是一款轻量级的Web服务器,反向代理服务器,电子邮件代理服务器
    正向代理:代理的是用户,代理为客户端做事
    反向代理:代理的是服务器,代理为服务器做事
    二,什么是反向代理?
    反向代理方式:用代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,
    并将从服务器上得到的结果返回给internet上请求链接的客户端,此时代理服务器对外就表现为一个
    反向代理服务器。
    三,nginx启动,停止
    1.启动:只需要直接运行Nginx可执行文件

    cd /usr/local/nginx/sbin
    sudo ./nginx

    2.查看nginx进程:
    ps -ef|grep nginx
    3.控制:
    nginx -s stop :快速关闭
    nginx -s quit :优雅的关闭
    nginx -s reload :重新加载配置文件
    nginx -s reopen :重新打开日志文件
    4.停止:
    nginx -s quit :等worder进程处理完当前请求后再退出nginx,
    5.重新加载配置文件:
    nginx -s reload :修改配置文件后,只有重新加载指令被传给Nginx进程或重新启动nginx才会生效。
    一旦主进程收到重新加载配置的信号,就会检查新配置文件的语法正确性,并尝试应用配置信息。如果
    成功,主进程会启动新的worker进程并向老的worker进程发送消息,要求他们关闭。否则,主进程回滚所作的修
    改,继续所用老的配置工作。老的worker进程收到关闭命令,停止接受新连接,继续处理当前请求,直到所有的
    请求都处理完,然后老worker进程退出。
    6.其他控制方式:
    ps -ax | grep nginx :获取正在运行的nginx进程,使用ps工具
    kill -s quit 1628 :根据进程Id退出
    四,配置文件结构
    1.nginx由模块组成,这些模块由配置文件中的指令进行控制
    2.指令分为简单指令和块指令
    3.
    五,提供静态内容
    1.web服务器的一个重要任务是对外提供文件(比如提供图片或静态html页面)
    2.比如,根据请求,从不同的本地目录提供文件:/data/html(包含html文件),/data/images(包含图片)
    3.在http块内部设置一个server块,后者包含两个location块。
    配置文件可能包含几个server块,用监听端口号和server名称进行区分。
    一旦nginx决定用哪个server处理一个请求,它会比对请求首部的URI和server内部的location指令
    4.server块内部的location块:
    location / { // 匹配所有以/开头的请求
    root /data/www;
    }

    location /images/ { // 匹配所有以/images/开头的请求
    root /data;
    }
    如果有多个location块都匹配了请求,nginx会选择前缀最长的一个。所以只有其他全部location全部不
    匹配的时候才匹配第一个location
    5.配置:

    server {
        location / {
            root /data/www;
        }
    
        location /images/ {
            root /data;
        }
    }    

    这已经是一个可以工作的server配置,监听标准80端口,在本机可以访问http://localhost/进行访问
    5.log日志:
    一旦有什么与预期不符的事情,你可以尝试在access.log和error.log文件中查找原因,它们
    在/usr/local/nginx/logs 或者/var/log/nginx目录下面。

    六,配置一个简单的代理服务器
    1,nginx的一个常见用途是作为代理服务器,就是接收客户端请求,然后传递给被代理的服务器并获得响应,
    再返回给客户端
    2,配置一个基本的代理服务器,他会用本地目录来响应所有的图片(静态资源)请求,其他请求会转发给
    被代理的服务器,在这个例子中,服务器和代理服务器都用nginx服务器实现
    2.1:在nginx配置文件中增加一个server块,定义一个被代理的服务器

    server {
        listen 8080;    //监听8080端口,
        root /data/up1;    //并将所有请求映射到本地文件系统的/data/up1目录
    
        location / {
        }
    }

    2.2:创建这个目录,把index.html文件放在目录下
    2.3: 注意:root指令被放在了server上下文。如果用来处理请求的location块中没有自己的root指令,就会使用
    这个root指令
    3.配置:

    server {
        location / {
          proxy_pass http://localhost:8080;
        }
    
        location /images/ {
          root /data;
        }
    }

    现在将/images/包含前缀的请求映射到/data/images目录下的文件,我们修改一下,让它匹配包含特定文件扩展
    名的请求

    server {
        location / {
            proxy_pass http://localhost:8080/;
        }
    
        location ~ .(gif|jpg|png)$ {
            root /data/images;
        }
    }

    这个服务器会过滤以 .gif、 .jpg、 或者 .png结尾的请求,将他们映射到/data/images目录(就是把root参数
    插入到URI中)然后将所有其他请求传递给上面配置好的被代理的服务器。
    七,传递请求头
    1.默认情况,NGINX在代理请求时会重新定义两个HTTP头字段,“Host”和“Connection”,并删除值为空的头部
    字段。“Host”会被设置为 $proxy_host变量的值,“Connection”被设置为close。
    2.要改变这些设置,包括修改其他头字段,使用proxy_set_header指令。这个指令可以在location或者更高层使
    用。也可以在特定的server上下文或者在http块中。

    location /some/path/ {
        proxy_set_header Host $host; //“Host”字段被设置为$host变量
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://localhost:8000;
    }

    3.要阻止一个头字段被传递给被代理的服务器,只要把它设置为空字符串。

    location /some/path/ {
        proxy_set_header Accept-Encoding "";
        proxy_pass http://localhost:8000;
    }

    八,配置缓冲
    1.默认情况,nginx缓冲来自被代理服务器的响应。
    响应被保存在内部缓冲区,直到所有的响应都接收完才发送给客户端。缓冲帮助优化了客户端的性能,如果nginx
    将响应同步发送给客户端,会浪费被代理服务器的时间。然而,当启用了缓冲,nginx允许被代理服务器快速处理
    响应,nginx会保存响应直到客户端下载完成
    2.负责开启和关闭缓冲功能的指令是proxy_buffering。默认这个值是on也就是启用缓冲功能。
    3.proxy_buffers指令控制分配给一个请求的缓冲大小和数量。从被代理服务器返回的第一部分响应被保存在单独
    的缓冲区,这个缓冲区的大小用proxy_buffer_size控制。这部分通常包含一个相当小的响应头,可以比其余的响
    应使用的缓冲更小。

    location /some/path/ {
        proxy_buffers 16 4k;
        proxy_buffer_size 2k;
        proxy_pass http://localhost:8000;
    }

    4.如果缓冲被禁用,一旦收到被代理服务器的响应就会同步发送给客户端。对于需要快速交互的客户端,希望尽
    快收到服务器的响应,会需要这种行为

    location /some/path/ {
        proxy_buffering off;
        proxy_pass http://localhost:8000;
    }

    5.在特定的location禁用缓冲,将location中的proxy_buffering指令设置为off

    location /some/path/ {
        proxy_buffering off;
        proxy_pass http://localhost:8000;
    }

    九.负载均衡
    1.什么是负载均衡?
    当用户访问网站时,先访问一个中间服务器,在让这个中间服务器在服务器集群中选择一个压力较小的
    服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压
    力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。负载均衡使用反向代理的原理实现的
    2.负载均衡的几种方式
    2.1:轮询(默认)
    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除

    upstream backserver {
        server 192.168.0.14;
        server 192.168.0.15;
    }

    2.2:weight
    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

    upstream backserver {
        server 192.168.0.14 weight=3;
        server 192.168.0.15 weight=7;
    }

    权重越高,在被访问的概率越大,如上例,分别是30%,70%。
    2.3:优化版,解决session共享问题
    上述方式存在一个问题就是说,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二
    次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一
    个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。
    我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该
    请求通过哈希算法,自动定位到该服务器。 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后
    端服务器,可以解决session的问题。( nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端,这样一来
    这个ip下的某个客户端和某个后端就能建立起稳固的session)

    upstream backserver {
        ip_hash;
        server 192.168.0.14:88;
        server 192.168.0.15:80;
    }

    2.4: fair(第三方)
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。

    upstream backserver {
        server server1;
        server server2;
        fair;
    }

    2.5:url_hash(第三方)
    按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

    upstream backserver {
        server squid1:3128;
        server squid2:3128;
        hash $request_uri;
        hash_method crc32;
    }

    3.每个设备的状态设置为:

    down 表示单前的server暂时不参与负载
    weight 默认为1.weight越大,负载的权重就越大。
    max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
    fail_timeout:max_fails次失败后,暂停的时间。
    backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

    upstream myServer { 
    
        server 127.0.0.1:9090 down;
    
        server 127.0.0.1:8080 weight=2;
    
        server 127.0.0.1:6060;
    
        server 127.0.0.1:7070 backup;
    
    }

    4.配置实例:

    #user nobody;
    worker_processes 4;
    events {
        # 最大并发数
        worker_connections 1024;
    }
    http{
        # 待选服务器列表
        upstream myproject{
        # ip_hash指令,将同一用户引入同一服务器。
        ip_hash;
        server 125.219.42.4 fail_timeout=60s;
        server 172.31.2.183;
      }
    
      server{
          # 监听端口
          listen 80;
          # 根目录下
          location / {
              # 选择哪个服务器列表
              proxy_pass http://myproject;
          }
    
      }
    }

    十.nginx面试相关
    1.nginx是如何处理一个请求的?
    首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在nginx的master进程里

    先初始化好这个监控的socket(创建socket,设置addrreuse等选项,绑定到指定的ip地址端口,再listen)
    然后再fork(一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程 )出多个子
    进程出来
    然后子进程会竞争accept新的连接。此时,客户端就可以向nginx发起连接了。当客户端与nginx进行三次握
    手,与nginx建立好一个连接后
    此时,某一个子进程会accept成功,得到这个建立好的连接的socket,然后创建nginx对连接的封装,即
    ngx_connection_t结构体
    接着,设置读写事件处理函数并添加读写事件来与客户端进行数据的交换。最后,nginx或客户端来主动关掉
    连接,到此,一个连接就寿终正寝了
    2.正向代理和反向代理

  • 相关阅读:
    top指令
    Trie
    最大公约数
    angular2 获取到的数据无法实时更新的问题
    npm install 的时候出现 write access 导致不能成功安装的问题
    angular 的 @Input、@Output 的一个用法
    windows 安装 apache 服务以及添加 php 解析
    php 性能优化之opcache
    intellij 插件结构(文件结构以及概念层面上的结构)
    jetBrains 插件开发第一课-- 在主菜单栏新增一个菜单
  • 原文地址:https://www.cnblogs.com/inspred/p/9323483.html
Copyright © 2020-2023  润新知