• Nginx 基础


    介绍

    • Nginx开源版 http://nginx.org/en/

      官方原始的Nginx版本

    • Nginx plus商业版

      开箱即用,集成了大量功能

    • Open Resty https://openresty.org/cn/

      OpenResty是一个基于Nginx与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。更适用于需要大量二次开发的场景,有极强的扩展性

    • Tengine https://tengine.taobao.org/

      由淘宝网发起的Web服务器项目。它在Nginx (opens new window)的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网 (opens new window)天猫商城 (opens new window)等得到了很好的检验。相比于Open Resty,扩展性不够强,但是能够满足绝多数使用场景

    安装

    参考:nginx安装

    目录

    conf #配置文件
    	|-nginx.conf # 主配置文件
    	|-其他配置文件,都被引入到了nginx.conf
    html #静态页面
    logs
    	|-access.log #访问日志(每次访问都会记录)
    	|-error.log #错误日志
    	|-nginx.pid #进程号
    sbin
    	|-nginx #主进程文件
    *_temp #运行时,生成临时文件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nbb9rOst-1655811890990)(Nginx.assets/image-20220502111337135.png)]

    配置

    nginx.conf

    worker_processes  1; # 启动的worker进程数
    
    events {
        worker_connections  1024; #每个worker进程的连接数
    }
    
    
    http {
        include       mime.types; #include是引入关键字,这里引入了mime.types这个配置文件(同在conf目录下,mime.types是用来定义,请求返回的content-type)
        default_type  application/octet-stream; #mime.types未定义的,使用默认格式application/octet-stream
    
        sendfile        on; #详情,见下文
        keepalive_timeout  65; #长链接超时时间
    	
    		#一个nginx可以启用多个server(虚拟服务器)
        server {
            listen       80;#监听端口80
            server_name  localhost;  #接收的域名
    
            location / { 
                root   html; #根目录指向html目录
                index  index.html index.htm; #域名/index 指向 index.html index.htm文件
            }
    
            error_page   500 502 503 504  /50x.html; # 服务器错误码为500 502 503 504,转到"域名/50x.html"
            location = /50x.html {# 指定到html文件夹下找/50x.htm
                root   html;
            }
    
        }
    }
    
    • 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

    sendfile

    打开sendfile,用户请求的数据不用再加载到nginx的内存中,而是直接发送

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tSnyHZwf-1655811890992)(Nginx.assets/image-20220502113913235.png)]

    使用场景

    不同二级域名,映射到不同静态网页

    可以写多个server字段,从前向后匹配,先匹配到哪个就用哪个

    用户访问www.aaa.com,就会走到第一个server配置;www.bbb.com走到第二个配置

     http {
     		#....其他属性
     		server {
            listen       80;
            server_name  www.aaa.com;
    
            location / { 
                root   html/pro; 
                index  index.html index.htm;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    		}
    
     		server {
            listen       80;
            server_name  www.bbb.com;
    
            location / { 
                root   html/test; 
                index  index.html index.htm;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    		}
    }
    
    • 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

    不同域名,映射到同一静态页面

    server_name

    • 可以写多个,用空格分开
    • 使用通配符(*)
    • 使用正则表达式(https://blog.csdn.net/yangyelin/article/details/112976539)
    http{ 		
     		server {
            listen       80;
            server_name  *.aaa.com  ~^[0-9]+\.aaa\.com$; # "\."是转译"."
    
            location / { 
                root   html/test; 
                index  index.html index.htm;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    		}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    网关服务器

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OmTE7Ouo-1655811890992)(Nginx.assets/image-20220503121135171.png)]

    上图中,应用服务器,不能直接被外网访问到,只能通过Nginx服务器进行访问(使用proxy_pass),这时候这台Nginx服务器就成为了网关服务器(承担入口的功能)

    所以,我们启动应用服务器的防火墙,设置其只能接受这台Nginx服务器的请求

    # 添加rich规则
    firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="本机nginx的ip" port protocol="tcp" port="8080" accept" 
    
    # 移除
    firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.174.135" port port="8080" protocol="tcp" accept"
    
    # 重启
    firewall-cmd --reload
    
    # 查看所有规则
    firewall-cmd --list-all 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    反向代理

    反向代理:这种代理方式是代理后端服务器,通常是多个,客户端只看到的是nginx并不能直接访问后端服务器。因为所有的数据都经过Nginx,所以Nginx服务器的性能至关重要。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LMrZNINc-1655811890992)(Nginx.assets/image-20220502173846436.png)]

    负载均衡

    负载均衡:把请求,按照一定算法规则,分配给多台业务服务器(即使其中一个坏了/维护升级,还有其他服务器可以继续提供服务)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tK4K3tGN-1655811890993)(Nginx.assets/image-20220502174023144.png)]

    反向代理 + 负载均衡

    nginx.conf配置文件

    启用proxy_pass,root和index字段就会失效

    proxy_pass后的地址必须写完整 http://xxx,不支持https

    当访问localhost时(Nginx服务器),网页打开的是http://xxx(应用服务器),但是网页地址栏写的还是localhost

    http{ 		
     		server {
            listen       80;
            server_name  localhost;
    
            location / { 
            		proxy_pass http://xxx;
                #root   html/test; 
                #index  index.html index.htm;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    		}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    定义地址别名

    使用upstream定义一组地址【在server字段下】

    访问localhost,访问都会代理到192.168.174.133:80192.168.174.134:80这两个地址之一,每次访问这两个地址轮着切换(后面讲到,因为默认权重相等)

    http{
    	upstream httpds{
    		server xxx:80 weight=10; # 如果是80端口,可以省略不写
    		server xxx:80 weight=20; # weight代表权重
    	}
    	server {
            listen       80;
            server_name  localhost;
    
            location / { 
            		proxy_pass http://httpds; # 注意这里不能写端口,需要在upstream中写
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    		}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    # 如果111:80出现故障,无法提供服务,就用使用backup的这个机器
    upstream httpds{
    		server 111:80 weight=10;
    		server 222:80 weight=80 backup;
    }
    
    # 关闭111
    upstream httpds{
    		server 111:80 weight=10 down;
    		server 222:80 weight=80;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    动静分离

    当用户请求时,动态请求分配到Tomcat业务服务器,静态资源请求放在Nginx服务器中

    例子:

    • 如果请求的资源地址是location//的优先级比较低,如果下面的location没匹配到,就会走http://xxx这个地址的机器
    • 如果请求的资源地址是location/css/*,就会被匹配到nginx的html目录下的css文件夹中(我们把css静态资源放在这个位置)
    server {
            listen       80;
            server_name  localhost;
    				
    				location / { # /的优先级比较低,如果下面的location没匹配到,就会走http://xxx这个地址的机器
            		proxy_pass http://xxx;
            }
            
            location /css {  # root指的是html,location/css指的是root下的css,所以地址就是html/css
            		root html;
                index  index.html index.htm;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    使用正则

    location ~*/(js|css|img){
    	root html;
      index  index.html index.htm;
    }
    
    • 1
    • 2
    • 3
    • 4

    url rewrite

    rewrite是URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。
    
    rewrite    <regex>   <replacement>  [flag];
    关键字				正则				替代内容     flagt标记
    
    正则:per1森容正则表达式语句进行规则匹配
    替代内容:将正则匹配的内容替换成replacement
    
    flag标记说明:
    last  #本条规则匹配完成后,继续向下匹配新的1ocation URI规则
    break #本条规则匹配完成即终止,不再匹配后面的任何规则
    
    redirect #返回302临重定向,游览器地址会显示跳转后的URL地址
    permanent #返回301永久重定向,测览器地址栏会显示跳转后的URL地址
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    浏览器地址栏访问 xxx/123.html实际上是访问xxx/index.jsp?pageNum=123

    server {
            listen       80;
            server_name  localhost;
    				
    				location / { 
    						rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1  break;
            		proxy_pass http://xxx;
            }
          
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    防盗链

    当我们请求到一个页面后,这个页面一般会再去请求其中的静态资源,这时候请求头中,会有一个refer字段,表示当前这个请求的来源,我们可以限制指定来源的请求才返回,否则就不返回,这样可以节省资源

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2pdPa2xJ-1655811890993)(Nginx.assets/image-20220503162830153.png)]

    # 【注意】 下面要配置在location代码块中!!!
    valid_referers [server_name] 或 none
    if ($invalid_referer) {
    	return 403;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    设置有效的refer值

    none:检测地址没有refer,则有效
    server_name:检测主机地址,refer显示是从这个地址来的,则有效(server_name必须是完整的http://xxxx)
    【注意】if ($invalid_referer)中if后有个空格,不写就会报错!

    例子:这里设置nginx服务器中的img目录下的图片必须refer为http:192.168.174/133才能访问

    server {
            listen       80;
            server_name  localhost;
    				
    				location / { 
            		proxy_pass http://xxx;
            }
          
    				location /img{
                    valid_referers http:192.168.174/133;
                    if ($invalid_referer){#无效的
                            return 403;#返回状态码403
                            # rewrite ^/  /img/x.png break; 设置盗链图片
                    }
                    root html;
                    index  index.html index.htm;
            }
            
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    如果引用这张图片的页面且refer并没有被设置,图片无法加载出来

    如果直接访问图片地址,因为没有refer字段指向来源,会直接显示Nginx的页面

    高可用场景

    配置证书

    购买服务器——>购买域名,并解析到这个主机——>购买证书,绑定到域名上,并且把证书文件安装到服务器,并在Nginx上配置好

    这时候,这个域名就可以使用https进行访问里(https://xxxx),浏览器上会有一个小锁

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-czF4nq3l-1655811890993)(Nginx.assets/image-20220503191754606.png)]

    下载证书

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lBbtDrGh-1655811890993)(Nginx.assets/image-20220503192957256.png)]

    下载后,解压压缩包,可以看到两个文件,一个是 xxx.key(私钥)和xxx.pem(证书)

    将两个文件上传到Nginx目录中,记得放置的位置。我这里直接放在nginx.conf配置文件所在的目录(/user/local/nginx/conf),所以写的都是相对路径

    server {
    	listen 443 ss1;
    	
    	ss1 certificate  xxx.pem; #这里是证书路径
    	ss1_ certificate_key  xxx.key  #这里是私钥路径
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    深入理解强化学习——智能体的类型:有模型强化学习智能体与免模型强化学习智能体
    【leetcode】仅仅反转字母 c++
    【附源码】计算机毕业设计java装修服务分析系统设计与实现
    解决 Chrome 浏览器被毒霸篡改问题
    毫秒时间位数,时而1位,时而2位,时而3位,搞得我好乱呐!
    记录一次项目依赖升级
    QT6.6下android编译及调用自定义so库方法
    centos jdk 安装
    期货怎么克服频繁止损(期货交易怎么止损)
    object-fit的属性
  • 原文地址:https://blog.csdn.net/weixin_46053707/article/details/125397344