Nginx分享

191 阅读9分钟

Nginx服务的命令行控制

options

image.png

-s stop:快速关闭

quit:优雅关闭

reopen:生成新的日志

reload(重启)

Nginx配置文件

1.全局块

(1)user:nginx运行的用户(必须是linux中的用户,不然会报错),对系统权限访问控制更细,更安全。linux 添加用户:useradd aaa,添加完用户后,linux会创建一个 /home/aaa 目录

当我们改变nginx配置中的user字段时,页面仍能正常访问,是因为网页放在/share目录下,所有用户都能共享

image.png

现在我们改变路径

image.png

会出现 403错误,原因:用户权限不足

(2)include:用来引入其他配置文件,使Nginx配置更加灵活

2.events块

(1)accept_mutex on|off 默认为on:用来设置nginx网络连接序列化,如果设置为off,当一个请求过来时,会导致所有worker被唤醒开始竞争,最后只有一个worker拿到请求。如果唤醒的数量太多会影响nginx的整体性能,如果设置为true,会对多个Nginx进程接受连接进行序列号,一个个的唤醒,防止多个进程互相争抢。但是,如果一次来多个请求,一个个接受又太慢,所以要根据实际的生产环境进行配置。

(2)worker connections number:配置单个worker进程的最大连接数,这个数量不仅仅是前端和用户建立的连接数,还包括所有可能的连接数,number不可超过操作系统支持打开最大文件句柄数量

3.http块

(1)定义MIME-Type:浏览器用来区分不同的资源

image.png

image.png

默认以二进制流的方式处理

image.png

image.png

image.png

image.png

image.png

image.png

(2)自定义服务日志(access.log)

Nginx服务器支持对服务日志的格式、大小、输出进行设置

access_log 设置用户访问日志的相关属性 acess_log path [format[buffer=size]] (格式 大小)

(3)sendfile设置nginx服务器是否用sendfile()传输文件,可以大大提高Nginx处理静态资源的性能,默认为off

(4)keepalive_timeout设置长链接的超时时间 ,默认75s

(5)keepalive_requests:设置一个keep_alive连接使用的次数 默认100

4.server块和location块

image.png

1.serve_name:设置虚拟主机服务名称,可设置多个虚拟主机,使用空格分割

2.location:设置请求的URL

3.root/alias:设置请求资源的目录

root:设置请求资源的根目录 root路径 +location路径

alias:用来更改location的URL  替换location路径,如果location路径以/结尾,则alias也必须是/结尾

4.index:设置网站的默认首页

5.error_page code(状态码) :设置网站错误页面

(1)可以指定具体跳转地址 server{error_page 404 www.baidu.com}

(2)指定重定向

error_page   500 502 503 504 404 /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

(3)修改状态码

error_page   500 502 503 504 404 =200 /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

(4)指定错误信息

image.png

6.sendfile 开启高效的文件传输模式 默认off

image.png

image.png

  1. tcp_nopush:该指令必须在sendfile状态下才会生效,主要提高网络包的传输效率,默认值为off,建议为on

8.tcp_nodelay:该指令必须在keep_alive连接开启下才会生效,来提高网络传输的实时性,默认为on

image.png

上面两个操作看上去是互斥的,但是在linux2.5.9以后,这两个操作是可以兼容的tcp_nopush可以确保在发送到客户端之前的数据包是被填满的,大大减少网络开销,当最后一个包没有填满时,会使用tcp_nodelay指令强制发送数据包

5.静态资源压缩

传输内容越小,速度越快

(1)gzip指令:开启关闭gzip压缩,默认值off

(2)gzip_types指令:根据响应页的MIME类型选择性开启Gzip压缩功能

gzip_types:application/javascript

(3)gzip_comp_level指令:设置压缩程度,级别1(最低)-9(最高,效率最低,费时间)默认为1

(4)设置使用Gzip进行压缩是否携带“Vary:Accept-Encoding”的响应头,默认为off

(5)gzip_buffers number size:处理请求压缩的缓冲区数量和大小,number指定Nginx服务器向系统申请缓存空间的个数,size是每个缓存空间的大小,和操作系统有关,建议不设置

(6)gzip_disable regex:针对不同客户端发起的请求,选择性开启和关闭Gzip功能

(7)gzip_http version:针对不同HTTP协议,选择性开启关闭gzip功能,默认值1.1

(8)gzip_min_length :针对传输数据的大小,选择性开启关闭gzip功能,默认值20字节,单位 b,K,M,建议1k

6.解决跨域问题:add_header

Access-Control-Allow-Origin(允许跨域访问的源地址信息)

Access-Control-Allow-Methods(允许跨域访问的请求方式)

image.png

7.防盗链

Referer,当浏览器向web服务器发送请求时,一般会带上Referer,来告诉该网页是从哪个页面连接过来的,后台服务器可以获取到Referer来判断是不是自己信任的网站,如果不是可以返回403(服务器拒绝访问)

valid_referers: nginx会通过查看referer自动和valid_referers内容匹配,如果匹配到了就将 $invalid_referer 变量重置为0,如果没有匹配到将$invalid_referer变量重置为1,不区分大小写

image.png

8.Rewrite:实现URL重写 需要安装PCRE库(京东例子 www.360buy.com/)

(1)set $variable value指令:设置一个新的变量,这个变量不能和Nginx服务器预设的变量相同

location /xhn1 {
                set $name xhn;
                set $age 18;
                default_type text/plian;
                return 200 $name=$age;
        }

(2)if (condition):条件判断,注意if和括号之间要有空格

location /xhn1 {
                set $name xhn;
                set $age 18;
                default_type text/plian;
                if ($name){
                        return 200 $name;
                }
                return 200 ??????;
        }
        
if ($request_method !~* GET|POST) {
        return 403;
    }

(3)return 指令

return code [text]

return code URL

return URL

(4)rewrite 通过正则表达式使用和改变URL,可以同时存在一个或多个指令,按照顺序对URL进行匹配和处理

rewrite regex

(5)应用

域名跳转 image.png

域名镜像

将一个完全相同的网站放在不同服务器上,并用不同URL进行访问,其中的一台服务器被称为主站,其余称为镜像

image.png

9.反向代理

image.png

Nginx反向代理模块的指令是由ngx_http_proxy_module模块进行解析。

(1)proxy_pass

用来设置代理服务器地址,可以是主机名称、IP地址加端口号形式

image.png

image.png

(2)proxy_set_header

更改Nginx服务器收到的客户端请求头信息,然后将新的请求头发给代理的服务器

proxy_set_header filed value

10.反向代理调优

Buffer缓冲,Cache缓存

相同点:两种方式都用来提供IO吞吐效率,从而提高Nginx代理性能

不同点:缓冲用来解决不同设备之间数据传递速度不一致导致的性能低的问题,缓冲中的数据一旦完成本次操作后,便可以删除。缓存主要是备份,将被代理服务器的数据缓存到代理服务器,当客户端请求同一个数据时,只需从代理服务器拿到就行,效率较高。

(1)proxy_buffering on | off

proxy_buffering指令用来开启或关闭代理服务器的缓冲区。

(2)proxy_buffers numbers size

指定单个连接从代理服务器读取响应的缓存区的个数和大小

(3)proxy_busy_buffers_size size

限制同时处于BUSY状态的缓冲总大小

(4)proxy_temp_path path

缓冲区满后,仍未被Nginx服务器完全接受,响应数据会存到磁盘上。

(5)proxy_temp_file_write_size size

设置磁盘缓冲区文件的大小

通用网站的配置

proxy_buffering on;

proxy_buffer_size 4 32k

proxy_busy_buffers_size 64k

proxy_temp_file_write_size 64k

11.Nginx负载均衡

(1)概述

早期的网站流量和业务功能比较简单,单台服务器足以满足基本的需求,但是随着业务越来越多,需要多台服务器进行性能扩展和避免单点故障的出现,需要将不同用户流量分发到不同服务器上

(2)原理及处理流程

系统的扩展分为纵向和横向扩展。纵向扩展是从单机角度触发,通过增加系统的硬件处理能力来提升服务器的处理能力。横向扩展通过添加机器来满足大型网站服务的处理能力。

(3)负载均衡作用

  • 解决服务器高并发压力,提高处理性能
  • 提供故障转移,实现高可用
  • 通过增加或减少服务器的数量,增强网站系统的扩展性
  • 再负载均衡服务器上进行过滤,提升网站的安全性

(4)负载均衡常用处理方式

方式一:用户手动选择,在网站上提供不同的线路,让用户自己选择

image.png

方式二:DNS轮询方式:大多数域名注册商都对同一台组件添加多条A记录,这就是DNS轮询,DNS服务器将解析请求按照A记录顺序,随机分配到不同的IP上,这样就能完成简单的负载均衡。

缺点:

  • 可靠性低

如果一台服务器发生故障,那么所有访问该服务器的请求将不会有所回应,即使将IP从DNS中去掉,由于各大宽带接入商将众多的DNS存放在缓存中,导致DNS不会实时更新。

  • 负载均衡不均衡

不能区分服务器的差异和当前的运行状态,会导致某几台服务器负荷很低,另几台服务器负荷很高。

Nginx 七层负载均衡

在反向代理的基础上把用户请求根据指定算法分发到一组【upstream虚拟服务池】

1.upstream指令

用来定义一组服务器,可以是不同的端口服务器。服务器可以指定不同权重,默认为1

upstream name{...}

2.server指定后端服务器名称和一些参数,可以使用域名、IP、端口

server name[paramerters]

upstream backend{
    server 192.168.10.100:9001;
    server 192.168.10.100:9002;
    server 192.168.10.100:9003;
}

server{
    listen:8083;
    server_name localhost;
    location / {
        proxy_pass http://backend;
    }
}

3.负载均衡状态

状态概述
down当前server暂时不参与负载均衡
max_fails允许请求的失败次数
fail_timeout经过max_fails失败后,服务暂停时间
max_conns限制最大的连接次数
backup设置为备份服务器,当主服务器不可用时,将用来传递请求

4.负载均衡策略

算法名称说明
轮询默认方式
weight权重方式
ip_hash根据IP分配方式
least_conn依据最少连接方式
url_hash依据URL分配方式
fair依据响应时间方式

url_hash

按照访问的url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及资源时间的浪费。

upstream backend{
    hash $request_uri;
    server 192.168.10.100:9001;
    server 192.168.10.100:9002;
    server 192.168.10.100:9003;
}

server{
    listen:8083;
    server_name localhost;
    location / {
        proxy_pass http://backend;
    }
}

fair

根据页面大小、加载时间长短智能的进行负载均衡

upstream backend{
    fair
    server 192.168.10.100:9001;
    server 192.168.10.100:9002;
    server 192.168.10.100:9003;
}

server{
    listen:8083;
    server_name localhost;
    location / {
        proxy_pass http://backend;
    }
}

5.负载均衡案例

(1)一般轮询规则

upstream backend{
    hash $request_uri;
    server 192.168.10.100:9001;
    server 192.168.10.100:9002;
    server 192.168.10.100:9003;
}

server{
    listen:8083;
    server_name localhost;
    location / {
        proxy_pass http://backend;
    }
}

(2)加权轮序

upstream backend{
    hash $request_uri;
    server 192.168.10.100:9001 weight=7;
    server 192.168.10.100:9002 weight=5;
    server 192.168.10.100:9003 weight=3;
}

server{
    listen:8083;
    server_name localhost;
    location / {
        proxy_pass http://backend;
    }
}

(3)对特定资源实现负载均衡

upstream videobackend{
    hash $request_uri;
    server 192.168.10.100:9001
    server 192.168.10.100:9002 
}
upstream filebackend{
    hash $request_uri;
    server 192.168.10.100:9003
    server 192.168.10.100:9004 
}

server{
    listen:8084;
    server_name localhost;
    location /video/ {
        proxy_pass http://videobackend;
    }
    location /file/ {
        proxy_pass http://filebackend;
    }
}

(4)对不同域名实现负载均衡

upstream test1{
    hash $request_uri;
    server 192.168.10.100:9001
    server 192.168.10.100:9002 
}
upstream test2{
    hash $request_uri;
    server 192.168.10.100:9003
    server 192.168.10.100:9004 
}

server{
    listen:8085;
    server_name www.hello.com;
    location / {
        proxy_pass http://test1;
    }
}
server{
    listen:8086;
    server_name www.nihao.com;
    location / {
        proxy_pass http://test2;
    }
}