Nginx负载均衡、反向代理、详细配置

Nginx是为对Apache性能不满意的人而构建的。随着Internet需求的变化,Web服务器的工作也在变化。Nginx的构建比以往任何时候都更有效率,更可扩展,更安全,更强大

Nginx的产生

Nginx同Apache一样都是一种Web服务器,基于REST的架构风格,以统一资源描述符(Uniform Resources Identifier)URI或统一资源定位符(Uniform Resources Locator)URL 作为沟通依据,通过HTTP协议提供的网络服务。
然而这些服务器在设计之初收到当时环境的局限性,例如当时的用户规模、网络带宽和产品特点扥局限性,并且各自的定位和发展都不尽相同。这也使得Web服务器有着各自的鲜明特点。
Apache的发展时期很长,而且是还无争议的世界第一大服务器,它有着很多的优点:稳定、开源和跨平台等。它出现的时间太长了,它兴起的年代,互联网产业还远远比不上现在,所以它被设计为一个重量级的,并不支持高并发的服务器,操作系统对其进程或者现成之前的切换也消耗了大量的CPU资源,导致请求平均响应速度降低。
这些都决定了Apache不能成为高性能Web服务器,轻量级高并发的服务器Nginx就应运而生了。俄罗斯的工程师 Igor Sysoev,他在为 Rambler Media 工作期间,使用 C 语言开发了 Nginx,Nginx 作为 Web 服务器一直为 Rambler Media 提供出色而又稳定的服务。然后呢,Igor Sysoev 将 Nginx 代码开源,并且赋予自由软件许可证。
Nginx为什么这么火:

  • Nginx使用基于事件驱动的架构,使得其可以支持数以百万级别的TCP链接。
  • 高度的模块化和自由软件许可证使得第三方模块层出不穷。
  • Nginx是一个跨平台服务器,可以运行在各种主流的操作系统上。
  • 这些优秀的设计带来了极大的稳定性。

Nginx 基本概念

正向代理与反向代理

为了便于大家理解,先来了解一下基础知识,Nginx是一个高性能的方向代理服务器,那么什么是反向代理呢?

代理是在服务器和客户端之间假设的一层服务器,代理将接收客户端的请求并转发给服务器,然后把服务端的响应转发给客户端。
不管是正向代理还是反向代理,实现的都是上述功能。

正向代理

正向代理(forward)意思是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取的内容,客户端向代理发送一个请求,并指定请求目标(原始服务器),然后代理向原始服务器转交请求并将获取到的内容全部返回给客户端。
正向代理 视为我们服务的,也就是为客户端服务的,客户端可以根据正向代理方位到他们身无法访问的服务器资源。正向代理对我们是透明的,对服务器是非透明的,即服务器不知道自己接受的是来自代理的访问还是真实客户端的访问。

反向代理

反向代理(Reverse Proxy)是指代理服务器来接受internet上的链接请求,然后把请求转发给内部网络上的服务器。并将服务器上得到的结果返回给internet上请求链接的客户端,此时代理服务器岛外就表现为一个反向代理的服务器。
反向代理视为服务端服务的,可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发和负载均衡等。
反向代理对付段是透明的,对客户端非透明,即客户端并不知道自己访问的是代理服务器,而服务器知道反向代理在为他服务。

负载均衡

如果请求数过大,单个服务器解决不了,我们增加服务器数量,然后将请求分发到各个服务器上,将原先的请求集中到单个服务器上的情况改为请求分发到多鞥服务器上就是负载均衡。

内置负载策略

轮循(默认)
http {

    # ... 省略其它配置

    upstream tomcats {
        server 192.168.0.100:8080;
        server 192.168.0.101:8080;
        server example.com:8080;
    }

    server {
        listen 80;

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

    # ... 省略其它配置
}
  • proxy_pass http://tomcats:表示将所有请求转发到tomcats服务器组中配置的某一台服务器上。

  • upstream模块:配置反向代理服务器组,Nginx会根据配置,将请求分发给组里的某一台服务器。tomcats是服务器组的名称。

  • upstream模块下的server指令:配置处理请求的服务器IP或域名,端口可选,不配置默认使用80端口。通过上面的配置,Nginx默认将请求依次分配给100,101,102来处理,可以通过修改下面这些参数来改变默认的分配策略:

    1、weight:默认为1,将请求平均分配给每台server。

    upstream tomcats {
        server 192.168.0.100:8080 weight=2;  # 2/6次
        server 192.168.0.101:8080 weight=3;  # 3/6次
        server 192.168.0.102:8080 weight=1;  # 1/6次
    }
    

    上例配置,表示6次请求中,100分配2次,101分配3次,102分配1次。
    2、fail_timeout:默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它。
    3、max_fails:默认为1,某台Server允许请求失败的次数,超过最大次数后,在fail_timeout时间内,新的请求将不会分配给这台机器。如果设置为0,Nginx会将这台Server置为永久无效状态

    upstream tomcats {
        server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
        server 192.168.0.101:8080 weight=3;
        server 192.168.0.102:8080 weight=1;
    }
    

    192.168.0.100这台机器,如果有3次请求失败,nginx在15秒内,不会将新的请求分配给它。
    4、backup:备份机,所有服务器挂了之后才会生效。
    5、max_conns:限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0。

fair

根据服务器的响应时间来分配请求,响应时间短的优先分配,即负载压力小的优先会分配。

url_hash

按请求url的hash结果来分配请求,使每个url定向到同一个后端服务器,服务器做缓存时比较有效。
加快服务器的解析速度,可以把动态页面和静态页面交给不同的服务器来解析,降低原来单个服务器的压力

ip_hash

按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题,但是如果某个服务器宕机,这个服务器的session信息就会丢失,目前较好的办法就是session+redis,把session保存在redis中。

Nginx常用命令

在这里插入代码片
# 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务
nginx -s stop
# 平稳关闭Nginx,保存相关信息,有安排的结束web服务
nginx -s quit
# 因改变了Nginx相关配置,需要重新加载配置而重载
nginx -s reload
# 重新打开日志文件
nginx -s reopen
# 为 Nginx 指定一个配置文件,来代替缺省的
nginx -c filename
# 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件
nginx -t
#  显示 nginx 的版本
nginx -v
# 显示 nginx 的版本,编译器版本和配置参数
nginx -V
# 格式换显示 nginx 配置参数
2>&1 nginx -V | xargs -n1
2>&1 nginx -V | xargs -n1 | grep lua

Nginx功能

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

  • HTTP和HTTPS(TLS/SSL/SNI)
  • 超快速的Web服务器用于静态内容
  • FastCGI、WSGI和SCGI用于动态内容
  • 具有负载均衡和缓存功能的加速Web代理
  • 不间断实时二进制升级和配置
  • 压缩和内容过滤器
  • 虚拟主机
  • FLV和MP4的媒体流
  • 带宽和连接策略
  • 全面的访问控制
  • 自定义日志
  • 嵌入式脚本
  • 带有TLS的SMTP、IMAP和POP3的邮件代理
  • 逻辑灵活可扩展
  • 跨平台,在多种系统上可以运行

Nginx配置


#打开主配置文件,若你是用lnmp环境安装
vim /usr/local/nginx/conf/nginx.conf

----------------------------------------

user                    #设置nginx服务的系统使用用户
worker_processes        #工作进程数 一般情况与CPU核数保持一致
error_log               #nginx的错误日志
pid                     #nginx启动时的pid

events {
    worker_connections    #每个进程允许最大连接数
    use                   #nginx使用的内核模型
}

使用Nginx的http服务,在配置文件中nginx.conf区域内,可配置无数个server,每一个server对应一个虚拟主机或者域名。


http {
    ... ...        #后面再详细介绍 http 配置项目
    
    server {
        listen 80                          #监听端口;
        server_name localhost              #地址
        
        location / {                       #访问首页路径
            root /xxx/xxx/index.html       #默认目录
            index index.html index.htm     #默认文件
        }        
        
        error_page  500 504   /50x.html    #当出现以上状态码时从新定义到50x.html
        location = /50x.html {             #当访问50x.html时
            root /xxx/xxx/html             #50x.html 页面所在位置
        }        
    }
    
    server {
        ... ... 
    } 
}

一个server可以出现多个location,对不同的访问路径进行不同情况的配置。
http 的配置详情:


http {
    sendfile  on                  #高效传输文件的模式 一定要开启
    keepalive_timeout   65        #客户端服务端请求超时时间
    log_format  main   XXX        #定义日志格式 代号为main
    access_log  /usr/local/access.log  main     #日志保存地址 格式代码 main
}

下面是Nginx配置中内置全局变量,可以再任何位置使用它们:

变量名 功能
$host 请求信息中的Host,如果请求中没有Host行,则等于设置的服务器名
$requset_method 客户端请求类型,如GET或者POST
$remote_addr 客户端的IP地址
$args 请求中的参数
$content_length 请求头中的Content-length字段
$http_user_agent 客户端agent信息
$http_cookie 客户端cookie信息
$remote_addr 客户端的IP地址
$remote_port 客户端的IP地址
$remote_addr 客户端的端口
$server_protocol 请求使用的协议,如HTTP/1.0或者HTTP/1.1
$server_addr 服务器的IP地址
$server_name 服务器名称
$server_port 服务器的端口号

参考内容:
https://mp.weixin.qq.com/s/XoqGvYBabW8YBl9xEeNYZw
https://blog.csdn.net/xyang81/article/details/51702900

你可能感兴趣的:(服务器,nginx,反向代理,nginx配置,nginx负载均衡)