nginx简介

什么是nginx?

nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。

作用:集群(提高吞吐量,减轻单台服务器压力),反向代理(不暴露真实IP地址),虚拟服务器,静态服务器(动静分离)。解决跨域问题,使用nginx搭建企业级api接口网关

反向代理服务器:

 Nginx、lvs、F5(硬件)、haproxy

nginx应用场景

1、http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。

2、虚拟主机。可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。

3、反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。

安全架构:

1.nginx反向代理

2.使用https防止抓包分析

3.搭建企业黑名单和白名单,防盗链

4.模拟请求(csrf),Xss,sql注入

5.ddos(流量攻击,让别人无法访问),使用nginx解决。

6CDN加速,也就是动静分离

nginx配置文件分为3块:

第一部分:全局块:主要设置一些影响nginx服务器运行的配置指令

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;
 

 worker_processes  1:表示nginx服务器处理并发服务的关键配置,work_processes值越大,可以支持的并发处理量也就越多,但是会受到硬件,软件等设备的制约。

第二部分:events块:涉及的指令主要影响nginx服务器与用户的网络连接

events {
    worker_connections  1024;
}

worker_connections  1024:表示支持的最大连接数为1024

第三部分:http块:nginx配置最频繁的部分,代理,缓存和日志定义等绝大多数功能和第三方模块配置都在这里

                              http块可以包括http全局块和server块

(1)http全局块:指令包含文件引入,日志定义,连接超时时间,单链接请求数上限等

    include       mime.types;
    default_type  application/octet-stream;

    #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;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

(2)server块:这和虚拟主机有密切关系,每个http块可以包括多个server块,而每个server就相当于一个虚拟主机

                          而每个server块也分为多个全局server块,以及同事包含多个location块

         一:全局server块:最常见的配置是虚拟主机的监听配置和本虚拟主机的名称或ip配置

         二:location块:这块主要作用是基于Nginx服务器接受到的请求字符串(例如server——name/uri_string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如前面的/uri_string)进行匹配,对特定的请求进行处理。地址定向,数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里运行。

 例:

    server {
        listen       80;
        server_name  123.1.1.1;


        location /dist  {
            root   H:/consoleManage;
            index  index.html;
        }
     
        location /file  {
            root  H:/consoleManage;
        }
         location /consolemanage {
            add_header 'Access-Control-Allow-Origin' '*';
            proxy_pass http://123.1.1.1:8383/consolemanage;
       }
       }

配置静态访问

Web server很重要一部分工作就是提供静态页面的访问,例如images, html page。nginx可以通过不同的配置,根据request请求,从本地的目录提供不同的文件返回给客户端。 
打开安装目录下的nginx.conf文件,默认配置文件已经在http指令块中创建了一个空的server块,在nginx中的http块中已经创建了一个默认的server块。内容如下:

server { 

       #本地ip+端口

        listen       80;

        server_name  localhost;

   

        #文件夹

        location /dist {

        #静态资源路径

            root   /data/;

            index  index.html index.htm;

        }

 

      #文件夹

        location /image{

        #静态资源路径

            root   /data/;

      #列出文件夹中的内容,可以不加

           autoindex on;

        }

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

如果动态文件个静态文件混合在一起发布,通过nginx区分,通过location指定不同的后缀名实现不同的请求转发,通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量,具体的expires定义:是给一个资源设定一个过期时间,也就是说无需去服务器验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量,此种方法不适合经常变动的资源,例如设置成3d,表示3天内访问这个url,发送一个请求,对比服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200.

nginx解决网站跨域问题

配置:

server {

        listen       80;

        server_name  www.baidu.com;

 

       #以A开头的项目

        location /A {

                       proxy_pass  http://a.a.com:81/A;

                            index  index.html index.htm;

        }

 

       #以B开头的项目

         location /B {

                       proxy_pass  http://b.b.com:81/B;

                            index  index.html index.htm;

        }

    }

 

nginx配置防盗链

                    #防盗链文件类型

location ~ .*\.(jpg|jpeg|JPG|png|gif|icon)$ {

       #白名单,允许文件链出的域名白名单,域名与域名之间使用空格隔开

     #valid_referers  在浏览器直接输入图片地址就不会再显示图片

        valid_referers blocked http://www.baidu.com www.alibaba.com;

        if ($invalid_referer) {

      # 防盗链设置的防盗链返回403

            return 403;

        }

 }

nginx配置DDOS(流量攻击)

限制请求次数

设置NginxNginx Plus的连接请求在一个真实用户请求的合理范围内。比如,如果你觉得一个正常用户每两秒可以请求一次登录页面,你就可以设置Nginx每两秒钟接收一个客户端IP的请求(大约等同于每分钟个请求)。

limit_req_zone $binary_remote_addr zone=one:10m rate=2r/s;

server {

...

location /login.html {

limit_req zone=one;

...

}

}

 

`limit_req_zone`命令设置了一个叫one的共享内存区来存储请求状态的特定键值,在上面的例子中是客户端IP($binary_remote_addr)location块中的`limit_req`通过引用one共享内存区来实现限制访问/login.html的目的。

 

限制请求速度:

设置NginxNginx Plus的连接数在一个真实用户请求的合理范围内。比如,你可以设置每个客户端IP连接/store不可以超过10个。

漏桶算法可以很好地限制容量池的大小,从而防止流量暴增。如果针对uri+ip作为监测的key,就可以实现定向的设定指定ip对指定uri容量大小,超出的请求做队列处理(队列处理要引入消息机制)或者丢弃处理。这也是v2ex对流量拦截的算法,针对uri+ip做流量监测。 

集群:

当单台服务器,接受高并发情况下,容易宕机,瘫痪时:

使用nginx做反向代理(隐藏IP),集群分布式时采用负载均衡做轮询分配

                                    

在集群中产生的问题:

1分布式job幂等性问题(使用XXLjob分布式任务调度平台)

2会话共享问题

3分布式生成全局ID:

如使用时间戳生成订单号,解决:1提前生成,存在redis中;2 使用zookpeer分布式锁,同一时刻只能有一个jvm生成订单号

  

负载均衡策略(前三种重要,后两种做了解)

  1. 轮询(默认,机器都相同)
    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 
    upstream backserver
    server 192.168.0.14; 
    server 192.168.0.15; 


    2、指定权重
    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 
    upstream backserver { 
    server 192.168.0.14 weight=10; 
    server 192.168.0.15 weight=10; 


    3、IP绑定 ip_hash
    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 
    upstream backserver { 
    ip_hash; 
    server 192.168.0.14:88; 
    server 192.168.0.15:80; 

        4fair(第三方)
       按后端服务器的响应时间来分配请求,响应时间短的优先分配。 
      upstream backserver { 
      server server1; 
      server server2; 
      fair; 
      } 

      5url_hash(第三方)
      按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 
      upstream backserver { 
      server squid1:3128; 
      server squid2:3128; 
      hash $request_uri; 
      hash_method crc32; 
     } 

 

宕机轮训配置规则:

 

    server {

        listen       80;

        server_name  www.baidu.com;

        location / {

                           #对应轮询时的backserver

                            proxy_pass  http://backserver;

                            index  index.html index.htm;

                            #超时

                            proxy_connect_timeout 1;

                            proxy_send_timeout 1;

                            proxy_read_timeout 1;

        }

                  

 }

session共享解决办法:

利用数据库同步session

利用cookie同步session数据(安全性差、http请求都需要带参数增加了带宽消耗)

使用spring-session+Redis

nginx负载均衡策略ip绑定

tomcat配置session共享,占内存

token 重写session

 

高并发&&高可用&高吞吐量解决方案:

数据库:

1.慢查询定位sql语句 进行优化

2.sql语句优化

3.减少全表扫描

4.使用索引:注意索引使用事项

5.分表分库:水平分割(取模算法),垂直分割

6.主从赋值:mysql集群,原理是通过二进制日志文件

7.读写分离:使用mycat进行管理

缓存机制:

1.使用redis缓存数据库内容 

2.redis集群(主从复制)

3.redis读写分离

4.使用redis哨兵机制进行监听

服务器:

反向代理,负载均衡,集群,动静分离

客户端(页面):

1.减少请求

2.用户体验好的话使用ajax异步加载

3.动静分离

4.CDN加速(减轻宽带传输压力,从近访问服务器,比如上海访问上海的服务器,青岛访问青岛的服务器)

项目优化:

1.代码重构

2.jvm调优(垃圾回收机制,回收机制算法,新生代老年代比例),配置jvm参数

3.项目采用分布式和微服务架构

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值