• nginx快速入门


    一、nginx安装

    # centos7
    yum install -y nginx
    systemctl start nginx
    systemctl enable nginx
    
    • 1
    • 2
    • 3
    • 4

    其他方式安装参考https://blog.csdn.net/weixin_43424481/article/details/124236742

    二、nginx 基础命令

    命令作用
    nginx -h帮助命令
    nginx -c xxx.conf指定配置文件启动nginx
    nginx -q在检测配置文件期间屏蔽非错误信息
    nginx -s reopen重启nginx
    nginx -s reload重新加载Nginx配置文件,处理完请求后重启nginx
    nginx -s stop强制停止
    nginx -s quit处理完请求后重启nginx
    nginx -t检查配置文件是否有错误
    nginx -T检查配置文件是否有错误,并展示配置文件
    nginx -v查看版本信息
    nginx -V查看版本信息详情
    killall nginx杀死所有nginx服务(非nginx命令)

    三、nginx配置

    模块说明

    nginx官网指令大全:http://nginx.org/en/docs/dirindex.html

    查看指引:Syntax代表语法规则,Default代表默认值,Context代表在哪个模块中使用。一个指令可以在很多模块出现。

    配置块名称作用
    全局(main)块配置影响nginx 全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
    event块配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
    http块可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等
    server块(https块内) 配置虚拟主机的相关参数,一个http中可以有多个server
    location快(server块内) 配置请求的路由,以及各种页面的处理情况

    规则

    1. 用“#”表示注释

    2. 每行配置的结尾需要加上分号(漏了分号会导致无法启动)

    3. 如果配置项值中包括语法符号,比如空格符,那么需要使用单引号或双引号括住配置项值,否则Nginx会报语法错误

    4. 单位简写。

      • 当指定空间大小时,可以使用的单位包括:K或者k千字节(KiloByte,KB),M或者m兆字节(MegaByte,MB)。

        gzip_buffers 48k; 
        client_max_body_size 64M;
        
        • 1
        • 2
      • 当指定时间时,可以使用的单位包括: ms(毫秒),s (秒),m(分钟),h (小时),d(天),w(周,包含7天),M(月,包含30天),y(年,包含365天)。

        expires 10y;
        proxy_read_timeout 5s;
        client_body_timeout 2m;
        
        • 1
        • 2
        • 3

    配置说明

    此文件为nginx安装完后默认配置文件经过细微修改后的配置

    user nginx;#配置用户或者组,默认为nobody
    worker_processes auto;#允许生成的进程数,默认为l,auto为自动设置
    error_log /var/log/nginx/error.log debugger; #错误日志路径级别。这个设置可以放入全局块,http块,server块,级别以此为: debuglinfo|notice|warn|error|critl|alert|emerg
    pid /run/nginx.pid; #指定nginx进程运行文件存放地址
    include /usr/share/nginx/modules/*.conf; #加载其他配置文件
    
    events {
        accept_mutex on;#设置网络连接序列化,防止惊群现象发生,默认为
        onmulti_accept on;#设置一个进程是否同时接受多个网络连接,默认为off#
        use epoll;#事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
        worker_connections 1024;#最大连接数,默认为512
    }
    
    http {
    	#自定义格式日志格式
        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 off; #取消服务日志
        access_log  /var/log/nginx/access.log  main;#请求日志路径,main为log_format的自定义命名,未指定时默认为combined
    
        sendfile            on;#允许sendfile方式传输文件,默认为off,可以在 http 块,server块,location块。
        sendfile max chunk 100k;#每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
        tcp_nopush          on;#启用或禁用FreeBSD 上的TCP_CORK套接字选项或 Linux 上的套接字选项
        tcp_nodelay         on;#当连接转换为保持活动状态时,将启用该选项
        keepalive_timeout   65;#连接超时时间,默认为75s,可以在 http,server,location块。
        types_hash_max_size 4096;#设置类型哈希表的最大值size。哈希表的详细信息请查阅http://nginx.org/en/docs/hash.html
    
        include             /etc/nginx/mime.types;#文件扩展名与文件类型映射表
        default_type        application/octet-stream;#默认文件类型,默认为text/plain
        
    	#加载其他配置文件
        include /etc/nginx/conf.d/*.conf;
    
        error page 404 https://www.baidu.com; #错误页
        server {
            listen       80;    # 监听端口
            server_name  172.0.0.1;    	# 监听地址
            
            location ~*^.+$ {#请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
                root path;#根目录
                proxy_pass http://172.0.0.1:8080;#请求转向mysvr定义的服务器列表
                index index.html; #设置默认页
                deny 127.0.0.1;#拒绝的ip
                allow 172.18.5.54;#允许的ip
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    日志

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    
    • 1
    • 2
    • 3
    变量含义
    $bytes_sent发送到客户端的字节数
    $connection连接序列号
    $connection_requests当前通过连接发出的请求数
    $msec以秒为单位的时间,在日志写入时以毫秒为分辨率
    $pipe如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。
    $request_length请求长度(包括请求行、请求头和请求体)
    $request_time请求处理时间,单位为秒,精度毫秒;从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
    $status响应状态
    $time_iso8601ISO 8601 标准格式的当地时间
    $time_local通用日志格式的本地时间
    $remote_addr
    $http_x_forwarded_for
    记录客户端IP地址
    $remote_user记录客户端用户名称
    $request记录请求的URL和 HTTP协议
    $http_referer记录从哪个页面链接访问过来的
    $body_bytes_sent发送给客户端的字节数,不包括响应头的大小;该变量与Apache模块mod_log_config 里的“%B”参数兼容。
    $http_user_agent记录客户端浏览器相关信息
    access_log  /var/log/nginx/access.log  main;
    #access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
    
    • 1
    • 2
    配置作用
    path指定日志的存放位置。
    format指定日志的格式,跟log_format的名字对应,比如 main。默认使用预定义的 combined。
    buffer用来指定日志写入时的缓存大小。默认是64k。
    gzip日志写入前先进行压缩。压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢。默认是1。
    flush设置缓存的有效时间。如果超过flush 指定的时间,缓存中的内容将被清空。
    if条件判断。如果指定的条件计算为0或空字符串,那么该请求不会写入日志。

    四、功能

    虚拟主机

    通过不同的域名访问不同的服务器或者静态文件

    一、通过不同的域名绑定相同的ip

    我使用的是腾讯云,三个域名都绑定同一个ip

    在这里插入图片描述

    二、如果没有域名,则在本地安装nginx,修改host

    127.0.0.1 test1.nssnail.com test2.nssnail.com test3.nssnail.com
    
    • 1

    test1.nssnail.com

    nginx配置如下

    server{
        listen   80;
        server_name 	 test1.nssnail.com;
    
        location / {
        	proxy_pass http://127.0.0.1:8081;
        }
    }
    server{
        listen   80;
        server_name 	 test2.nssnail.com;
    
        location / {
        	proxy_pass http://127.0.0.1:8082;
        }
    }
    
    server{
        listen   80;
        server_name 	 test3.nssnail.com;
    
        location / {
        	proxy_pass http://127.0.0.1:8083;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    反向代理

    1.正向代理

    正向代理是直接访问目标服务器地址,但是路不一样,是通过了代理服务器再到目标服务器

    在这里插入图片描述

    2.反向代理

    反向代理隐藏目标服务器地址,通过访问代理服务器地址去找到目标服务器

    在这里插入图片描述

    3.在nginx中应用

    通过proxy_pass属性设置被代理服务器,此时访问改服务器的80端口将会被代理访问到本地8081端口

    server{
        listen   80;
        server_name 	 test1.nssnail.com;
    
        location / {
        	proxy_pass http://127.0.0.1:8081;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    客户端通过反向代理获取到的ip为nginx的ip,那么如何获取真实ip呢?只要设置下面的值即可

    server{
        listen   80;
        server_name 	 test1.nssnail.com;
    
        location / {
        	proxy_pass http://127.0.0.1:8081;
        	
        	proxy_set_header Host $host;
        	#获取客户端的ip地址设置到header 中
        	proxy _set_header X-Real-IP $remote_addr;
        	#获取所有转发请求的ip信息列表
        	proxy_set_header X-Forwarded-For Sproxy_add_x_forwarded_for;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    负载均衡

    当一台服务器不够的时候我们就需要三台服务器或者多太服务器来分担压力,比如下图,我们起三台订单服务器通过nginx来对订单服务器进行负载均衡

    在这里插入图片描述

    配置如下

    upstream nssnail{
        server 172.0.0.1:8081; 
        server 172.0.0.1:8082; 
        server 172.0.0.1:8083; 
    }
    
    server{
        listen   80;
        server_name 	 test1.nssnail.com;
    
        location / {
        	proxy_pass nssnail;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    说明

    配置名称说明
    server关键字,定义服务。
    address服务地址,可以是主机名、域名、ip,也可以指定端口号。
    weight参数,表示当前server负载权重,权重越大被请求几率越大。默认是1
    down参数,表示单前的server暂时不参与负载。
    backup参数,其它所有的非 backup机器down或者忙的时候,请求backup机器。
    max_conns参数,限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制。
    max_fails参数,默认为1.某台Server允许请求失败的次数,超过最大次数后,在fail_timeout时间内,新的请求将不会分配给这台机器。
    fail_timeout参数,默认为10秒。某台Server达到max_fails 次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它。
    ip_hash关键字,每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题

    示例

    默认负载的策略为轮询策略,使用weight决定服务的权重

    upstream nssnail{
        server 172.0.0.1:8081 weight=2 max_fails=3 fail_timeout=15; 
        server 172.0.0.1:8082 backup; 
        server 172.0.0.1:8083 down; 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果使用ip_hash策略则在upstream里定义就行了

    upstream nssnail{
    	ip_hash;
        server 172.0.0.1:8081 ; 
        server 172.0.0.1:8082 ; 
        server 172.0.0.1:8083 ; 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    动静分离

    1. 将图片,js等文件通过nginx去加载,而不是走服务器,减少服务器压力
    location ~ .*\.(gif|jpg|ico|png|css|svg|js)$ {
    	//静态资源存放路径
    	root /usr/local/soft/nginx/data/static;
    }
    
    • 1
    • 2
    • 3
    • 4
    1. 用来部署vue的dist文件,实现前后端分离
    location /vue {
        root /usr/local/src/dist;
        try_files $uri $uri/ /index.html;##检查文件是否存
        index  index.html index.htm;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这样访问ip:端口/vue的时候,就会访问到vue的部署项目

    数据压缩

    配置说明
    Gzip on|off是否开启gzip压缩
    Gzip_buffers设置gzip申请内存的大小,作用是按指定大小的倍数申请内存空间。如Gzip_buffers 4 16k,4 16k代表按照原始数据大小以16k为单位的4倍申请内存。
    Gzip_comp_level[1-9]压缩级别, 级别越高,压缩越小,但是会占用CPU资源
    Gzip_disable正则匹配UA 表示什么样的浏览器不进行gzip
    Gzip_min_length开始压缩的最小长度(小于多少就不做压缩),可以指定单位,比如 1k
    Gzip_http_version表示开始压缩的http协议版本
    Gzip_proxiednginx 做前端代理时启用该选项,表示无论后端服务器的headers头返回什么信息,都无条件启用压缩
    Gzip_type对那些类型的文件做压缩(text/pliain,application/xml)
    Gzip_vary on|off是否传输gzip压缩标识; 启用应答头"Vary: Accept-Encoding";给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩

    五、location匹配规则

    规则说明

    location会尝试根据用户请求中的URI来匹配上面的/uri表达式,如果可以匹配,就选择location{}块中的配置来处理用户请求。当然,匹配方式是多样的,

    规则

    location [=|~|~*|^~] /uri/ {}
    
    • 1
    • 2
    • 3
    符号含义
    ~波浪线表示执行一个正则匹配,区分大小写
    ~*表示执行一个正则匹配,不区分大小写
    =进行普通字符精确匹配

    location的指令分为两种匹配模式

    1. 普通字符串匹配: 以=开头或者没有带正则引导符号(~)规则
      • 普通字符串匹配又分为普通匹配精准匹配
    2. 正则匹配:以()开头或者(*)开头的表示正则匹配

    普通字符串匹配

    1. 普通匹配

    location / {
        root   html;
        index  index.html index.htm;
    }
    location /demo {
        root   html;
        index  demo.html;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    上面规则中,比如访问172.0.0.1/xxxxx就会访问第一个location,访问172.0.0.1/demo/xxxxx

    两个location中,url会根据匹配长度最大点的location

    2. 精准匹配

    location =/demo {
        root  html; 
        index test.html;
    }
    location /demo {
       root   html;
       index  demo.html;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    精准模式的优先级要比普通模式高,只有完全匹配才会生效

    172.0.0.1/demo 访问test.html;

    172.0.0.1/demo/xxxx 访问demo.html;

    正则匹配

    location ~* \.(jpg|png|css|js|gif)$ {
        root html/images;
    }
    
    • 1
    • 2
    • 3

    优先级

    匹配过程:

    1. 首先看有没有精准匹配,如果有,则停止匹配过程

    2. 判断普通命中,如果有多个命中,“记录”下最长的命中结果(记录但不结束)

    3. 继续判断正则表达式,按配置里的正则表达式顺序为准,由上到下开始匹配,一旦匹配成功一个,立即返回结果并结束

    普通命中,顺序无关,因为按照命中长短来确定

    正则命中,顺序有关系,因为是从前往后命中

    总结:

    模式含义
    location = /uri=表示精确匹配,只有完全匹配上才能生效
    location ^~/uri^~开头对URL路径进行前缀匹配,并且在正则之前。
    location ~ pattern开头表示区分大小写的正则匹配
    location ~* pattern开头表示不区分大小写的正则匹配
    location /uri不带任何修饰符,也表示前缀匹配,但是在正则匹配之后
    location /通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default

    ps:^~也属于普通匹配,但是优先级会高于正则匹配,当想普通匹配url又不想被重复的正则优先匹配使用这种匹配模式

  • 相关阅读:
    温湿度监控系统——保障鲜花冷链运输
    WebSocket学习笔记
    Transformer面试十问
    计算机算法分析与设计(21)---回溯法(图着色问题)
    最流行的 6 款 Python 解释器
    【libGDX】Mesh立方体贴图(6张图)
    大语言模型之十六-基于LongLoRA的长文本上下文微调Llama-2
    进程(0)——计算机的中的软硬件【Linux】
    使用Unity制作3D驾驶游戏
    Linux | 进程
  • 原文地址:https://blog.csdn.net/qq_26751319/article/details/126251638