Nginx使用指南记录

368 阅读5分钟

1.nginx概念及功能

nginx是一个高性能的HTTP和反向代理Web应用服务器,同时也提供IMAP/POP3/SMTP服务

  1. 反向代理
  2. 通过配置文件可以实现集群和负载均衡
  3. 静态资源虚拟化

2.nginx进程和web请求处理机制

  • 进程解析: nginx启动之后会开启两个进程:master进程和worker进程;主进程(只有一个),相当于一个领导者,工作进程(默认只有一个),相当于一个工作者,为master进行服务。若master进程接收外界的信号,传递给woker,由worker执行;假设信号指令已经传递给woker进程,woker会等到客户端的响应结束才会执行指令。woker进程之间相互独立,如果黑客攻击的话,可能只是攻击其中的一个进程,其他进程可以照样工作。 master会监听woker,如果worker挂了,异常退出,master可以启动新的woker
  • woker的抢占机制: 多个woker进程需要去抢占accept_mutex(互斥锁,跟client对应的),哪个进程抢到互斥锁,就由哪个进程处理请求
  • web请求机制: nginx不同于传统事件处理,是异步请求。woker进程 use epoll是linux的epoll模型。当一个请求阻塞woker进程时,woker可以处理其他的请求。所以理论上只要内存够大,硬件跟上是可以达到几十万几百万的并发。

3.nginx.conf配置解析

nginx的配置分一下几个模块:

#全局配置
main 
#配置工作模式以及连接数
event
#http模块相关配置
http 
#虚拟主机配置,可以有多个
server 
#路由规则,表达式
location 
#集群,内网服务器(负载均衡规则)
upstream 
  1. main全局配置解析
#woker进程是有哪个用户运行的,woker进程可以指定哪个用户运行,默认是nobody
user  nobody; 
#工作进程,默认数量为1
worker_processes  1;
#指定nginx的error_log路径且指定nginx的日志级别,从低到高分别为:debug info notice warn error crit
error_log  logs/error.log  notice;
#指定nginx的pid路径
pid        logs/nginx.pid;
  1. event配置解析
#在linux环境下,默认工作模式为epoll模式(多路复用),且设置设置最大连接数为1024
events {
    worker_connections  1024;
}
  1. http配置解析
    #引入文件,增加代码可阅读性
    include       mime.types;
    #默认的类型
    default_type  application/octet-stream;
    #设置log日志的格式显示内容
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    #配置所有请求访问的日志文件地址
    access_log  logs/access.log  main;
    #文件传输,默认是开启的
    sendfile        on;
    默认是不开启的,搭配sendfile on使用的,如果不开启的话,是同步阻塞的机制的,必须要一个传完了,再传下一个。开启之后,是多个文件达到一定大小再一起传,提升nginx的性能。
    #tcp_nopush     on;

    #客户端超时时间,单位为秒,默认65秒。nginx在这段响应时间里还可以处理其他请求
    keepalive_timeout  65;
    #文件压缩,默认不开启。客户端的js,css等文件通过压缩,文件变小,加快传输效率,减小带宽的压力。但是同时要注意的是,压缩会消耗服务器cpu的性能
    #gzip  on;
    #虚拟主机配置
    server{
        #监听的端口,默认80
        listen       80;
        #虚拟主机Ip
        server_name  localhost;
        #路由匹配规则
        location / {
            root   html;
            index  index.html index.htm;
        }
        #错误页面配置
        error_page  404              /404.html;
    }
    #集群,负载均衡规则
    upstream backend {
        
    }
  1. location匹配规则解析
#1.默认匹配,上面几章用的都是默认匹配
location / {
    root  资源路径
    index  访问的资源
}
#2.精确匹配,精确到某一个资源文件
location =/test.txt {   //home目录下的test.txt文件
    root  /home       //资源路径
}
#3.文件后缀匹配,*代表不区分大小写
location ~* \.(gif|png|bmp|jpg|jpeg){
    root  /home  访问home目录下的所有以上后缀文件
}
#4.^~以某个字符路径开头请求,只能访问/home/test下的路径下的资源
location ^~ /test{
root  /home  
}
  1. upstream集群配置解析
  • 负载均衡之轮询

轮询是负载均衡的默认配置,使用场景:每台的服务器硬件配置相同

upstream server_name{
    server 192.168.1.181:8080
    server 192.168.1.182:8080
}
  • 负载均衡之权重

使用场景:服务器硬件配置的不同,按照一定比例来访问服务器节点

upstream server_name{
    server 192.168.1.181:8080 weight=1;
    server 192.168.1.182:8080 weight=2;
}
  • 负载均衡之ip_hash

hash算法:hash(ip)(ip哈希的值)%node_count(节点数)=index(所要访问的服务器节点)

hash算法只会根据ip的前三个字段值(即192.168.1)做哈希,所以在同一网段的ip_hash访问的是一样的服务器节点

upstream server_name{
    ip_hash;
    server 192.168.1.181:8080
    server 192.168.1.182:8080
}
  • 负载均衡之url_hash

hash算法:hash(url)(ip哈希的值)%node_count(节点数)=index(所要访问的服务器节点)

upstream server_name{
    hash $request_uri;
    server 192.168.1.181:8080
    server 192.168.1.182:8080
}
  • 指令参数之least_conn

访问连接数最少的那个服务器节点

upstream server_name{
    least_conn;
    server 192.168.1.181:8080
    server 192.168.1.182:8080
}
  • 指令参数之max_conns

使用场景:max_conns用于限制服务器的最大连接数,默认值是0,不做任何限制,相当于限流的作用, 使用的时候要注意使用多个工作进程时,会涉及到共享内存,连接数可能会多于max_conns

upstream server_name{
    server 192.168.1.181:8080 max_conns=2;
    server 192.168.1.182:8080 max_conns=2;
}
  • 指令参数之slow_start

该指令参数配置只适用于商业版,普通版不支持。

使服务器缓慢的启动,慢慢地加入到集群中,不会有流量很快地进来。便于运维人员启动监控软件,更好的监控流量从少到多的过程,达到更好的监控效果

该配置不支持hash和随机的负载均衡,该配置比较适合于权重的负载均衡 该配置不适合于单个服务器,在upstream中至少要有两个或两个以上的服务器

upstream server_name{
    server 192.168.1.181:8080 weight=1 slow_start=60s;
    server 192.168.1.182:8080 weight=2 slow_start=60s;
}
  • 指令参数之down与backup

标识服务器的状态:down为不可用 标识服务器是备用机:backup

upstream server_name{
    server 192.168.1.181:8080  down;
    server 192.168.1.182:8080  backup;
}
  • 指令参数之max_fails与fail_timeout

max_fails和fail_timeout是搭配使用的,max_fails默认值为1,fail_timeout默认值为10s

max_fails:最大的连接失败次数,当连接失败次数达到一定配置数之后,nginx认为该服务器宕机,不会访问到该服务器 fail_timeout:连接失败的时间段

upstream server_name{
    server 192.168.1.181:8080  max_fails=2 fail_timeout=1s; 
    server 192.168.1.182:8080  max_fails=2 fail_timeout=1s;;
}
  • 使用Keepalived提高吞吐量

keepalive 32,指的是保持32个连接,而keepalive的作用就是将其中的连接为长连接,大大减少了连接的创建, 维护和关闭的损耗;

proxy_http_version默认为1.0,1.1为长连接版本号;proxy_set_header配置是将connection清空。

upstream server_name{
    server 192.168.1.181:8080
    server 192.168.1.182:8080
    keepalive 32;
}
server{
    listen 80;
    server_name server_name;
    location / {
    proxy_pass http://server_name;    
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    }
}

4.nginx之妙用

  1. 用nginx解决跨域问题

添加相关的跨域配置

server{
        #监听的端口,默认80
        listen       80;
        #虚拟主机Ip
        server_name  localhost;
        #配置跨域
        #允许跨域请求,*代表所有
        add_header Access-Control-Allow-Origin *;
        #允许带上cookie请求
        add_header 'Access-Control-Allow-Credentials' 'true';
        #允许请求的方法,比如 GET/POST/PUT/DELETE
        add_header Access-Control-Allow-Methods *;
        #允许请求的header
        add_header Access-Control-Allow-Headers *;
        #路由匹配规则
        location / {
            root   html;
            index  index.html index.htm;
        }
}
  1. Nginx中配置静态资源防盗链
server{
        #监听的端口,默认80
        listen   80;
        #虚拟主机Ip
        server_name  localhost;
        #配置防盗链
        #对源站点验证
        valid_referers   192.168.1.181;
        #非法引入进入下方判断
        if ($invalid_referer){
            #或者具体的防盗图片路径
            return 404;
        }
        #路由匹配规则
        location / {
            root   html;
            index  index.html index.htm;
        }
}
  1. Nginx控制浏览器缓存

nginx通过设置未设置expire缓存浏览器资源。 若浏览器访问的是缓存过的资源,则状态是304状态;若静态资源被更改过,再访问静态资源,则被认为重新访问,才会重新被缓存

#缓存10s
location / static{
    alias  /home/imooc;
    expires 10s;
}

expire命令解析

#缓存10s
expires 10s;
#到下午10点30分,缓存过期
expire @22h30m
#不设置缓存,缓存过期时间为1970
expires epoch
#nginx的默认设置,缓存关闭
expires off
#最大缓存时间(不过期),Expires值为31 December2037 23:59:59GMT
expires max 
  1. Nginx的反向代理缓存

upstream服务器也会有静态资源文件通过Nginx被用户请求访问,也会有带宽的损耗和降用的。通过设置反向代理的缓存,可以更快访问静态资源文件,加速体验

server{
    listen 80;
    server_name www.yzw.com;
    #设置缓存的相关配置
    proxy_cache_path  /usr/local/nginx/upstream_cache keys_zone=mycache:5m max_size=1g inactive=8h use_temp_path=off;
    location / {
        proxy_pass http://www.yzw.com;    
        #代表开始并使用mycache的缓存,其中mycache是在keys_zone配置的名称
        proxy_cache mycache
        #针对200和304状态码的缓存设置过期时间
        proxy_cache_valid 200 304 8h
    }
}