初识 Nginx

部分内容学习自:
看完这篇还不了解Nginx,那我就哭了
nginx学习,看这一篇就够了

Nginx 的产生

Nginx 同 Apache 一样都是一种 Web 服务器。
Apache 的发展时期很长,作为世界第一大服务器。它有着很多优点:稳定、开源、跨平台等等。它兴起的年代,互联网产业远远比不上现在。所以它被设计为一个重量级的,且不支持高并发的服务器。

在 Apache 上运行数以万计的并发访问,会导致服务器消耗大量内存。操作系统对其进行进程或线程间的切换也消耗了大量的 CPU 资源,导致 HTTP 请求的平均响应速度降低。

这些都决定了 Apache 不可能成为高性能 Web 服务器,轻量级高并发服务器 Nginx 就应运而生了。
俄罗斯的工程师 Igor Sysoev,他在为 Rambler Media 工作期间,使用 C 语言开发了 Nginx。

Nginx 是一款自由的、开源的、高性能的 HTTP 服务器和反向代理服务器;同时也是一个 IMAP、POP3、SMTP 代理服务器。
Nginx 可以作为一个 HTTP 服务器进行网站的发布处理;另外 Nginx 可以作为反向代理进行负载均衡的实现。

正向代理(客户端代理)

如科学上网的原理是找到一个代理服务器,我们将请求发送给代理服务器,让代理服务器去访问,然后将访问到的数据传递给我们。这样的代理模式称为正向代理,代理服务器也是作为客户端,去访问服务端,而服务端无感知。

反向代理(服务端代理)

关于反向代理的处理方式,举例如某宝双十一,单个服务器性能瓶颈与人民日益增长的购买欲望之间的矛盾。
于是出现了:分布式、集群;也就是通过部署多台服务器来提高性能。但此时的问题是,服务端有多台,但客户端并不清楚当前应该把请求发送给哪一台服务端。

反向代理就是由一台Nginx 代理服务器负责接收所有客户端的请求,Nginx 服务器接收到之后,按照一定的规则分发给了真正的服务器进行处理。这对客户端来说仍然只能感知到一台服务端的存在。

反向代理的作用:

  • 保证内网的安全,通常将反向代理作为公网访问地址,Web 服务器是内网。
  • 负载均衡,通过反向代理服务器来优化网站的负载。

通常情况下实际生活中,正向代理和反向代理很有可能会存在同一个应用场景中,二者并不互相冲突。正向代理代理客户端的请求去访问目标服务器,目标服务器是一个反向代理服务器,反向代理了多台真实的业务处理服务器。

负载均衡

Nginx 服务器将请求按照一定的规则分发给了真正的服务器,这里按照一定规则分发的过程,就有负载均衡。

Nginx 支持的负载均衡算法

  1. weight 轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx 会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。

    这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率。权重数据越大,被分配到请求的几率越大。

  2. ip_hash:每个请求按照发起客户端的 ip 的 hash 结果进行匹配,这样的算法下一个固定 ip 地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下 Session 共享的问题。

  3. url_hash:按照访问的 URL 的 hash 结果分配请求,每个请求的 URL 会指向后端固定的某个服务器,可以在 Nginx 作为静态服务器的情况下提高缓存效率。但Nginx 默认不支持url_hash,需要安装 Nginx 的 hash 软件包。(并不等同于location里使用正则匹配分发到不同server)

  4. fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配。更贴合实际生产环境做动态调整。但Nginx 默认不支持 fair 算法,使用这种调度算法,需要安装 upstream_fair 模块。

Nginx 的常用命令和配置文件

nginx 下载解压后有如下目录
conf html logs sbin ...
sbin

里面有两个文件:nginx 和 nginx.old

./nginx  # 启动

./nginx -s stop # 停止

./nginx -s reload # 重新加载
conf

nginx的配置文件: nginx.conf。精简之后的内容:

worker_processes  1;

events {
    worker_connections  1024;
}

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

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

nginx 配置文件有三部分组成:

  • 第一部分:全局块。
    从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。
    比如上面第一行配置的:
    worker_processes  1;
    
  • 第二部分:events块。
    比如上面的配置,表示每个 work process 支持的最大连接数为 1024。
    events {
    	worker_connections  1024;
    }
    
  • 第三部分: Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile      on;
        keepalive_timeout  65;
    
        server {
            listen       80; # 监听主机的端口号
            server_name  localhost; # 监听主机的host(本机的host)
    
            location / {
                root   html;
                index  index.html index.htm;
            }
            error_page 500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    }
    
    1. http{}:http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
    2. server{}:一个 http 块可以配置多个 server 块,而每个 server 块就相当于一个虚拟主机。
    3. location{}:一个 server 块可以配置多个 location 块。根据接收到的请求URI中的内容对特定的请求进行处理。
配置反向代理
将本机8081的请求直接跳转到8082
server {
    listen       8081;
    server_name  192.168.1.1;

    location / {
        root   html;
        proxy_pass http://192.168.1.1:8082
        index  index.html index.htm;
    }
}
配置反向代理
根据访问路径的分发给不同服务器

不等于url_hash,且可靠性弱于url_hash。

server {
    listen       8081;
    server_name  192.168.1.1;

    location ~ /vod/ {  # ~ 表示以正则表达式匹配URI
        proxy_pass http://192.168.1.2:8082
    }
    location ~ /edu/ {
        proxy_pass http://192.168.1.3:8083
    }
}

location 正则表达式语法如下:

1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
2、~:用于表示 uri 包含正则表达式,并且区分大小写。
3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字 符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。

配置反向代理
负载均衡效果。默认轮询。
upstream myservers {  # 默认轮询
    server 192.168.1.2:8082;
    server 192.168.1.3:8083;
}
server {
    listen       8081;
    server_name  192.168.1.1;

    location / {
        proxy_pass   http://myservers;
    }
}
weight 权重。

默认为 1,权重越高被分配的客户端越多

upstream myservers { 
    server 192.168.1.2:8082 weight=10;
    server 192.168.1.3:8083 weight=10;
}
server {
    listen       8081;
    server_name  192.168.1.1;

    location / {
        proxy_pass   http://myservers;
    }
}
ip_hash。
upstream myservers { 
	ip_hash;
    server 192.168.1.2:8082;
    server 192.168.1.3:8083;
}
server {
    listen       8081;
    server_name  192.168.1.1;

    location / {
        proxy_pass   http://myservers;
    }
}
fair。
upstream myservers { 
	fair;
    server 192.168.1.2:8082;
    server 192.168.1.3:8083;
}
server {
    listen       8081;
    server_name  192.168.1.1;

    location / {
        proxy_pass   http://myservers;
    }
}

高可用

在使用过程中,负载均衡的某一台被代理的服务器宕机,Nginx 会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。

需要注意的是,Nginx作为一个服务端,自身也会有单点故障的风险,也需要组建Nginx集群。如原文提到使用两台nginx 服务器,配合keepalived实现。

Nginx location、proxy_pass 后有 / 与没 / 的区别:
https://www.cnblogs.com/she11s/p/14456301.html
https://blog.csdn.net/weixin_44003789/article/details/109812546

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值