nginx快速入门

快速入门

1. 安装gcc 的环境    yum install gcc-c++ -y

2. 安装 Perl 库,nginx 的 http 模块使用 pcre 来解析正则表达式   

  yum install -y pcre pcre-devel

3. 安装zlib 库,它提供了很多种压缩和解压缩的方式     

  yum install -y zlib zlib-devel

4. 安装OpenSSL,它是一个强大的安全套接字层密码库

  yum install -y openssl openssl-devel

5. 上传nginx源码并解压    tar zxvf nginx-1.8.0.tar.gz

6. 进入nginx源码目录 cd nginx-1.8.0   输入下面命令创建makeFile 文件

  ./configure --prefix=/usr/local/wulei/nginx-1.8.0

7. 编译并安装    make && make install   此时会在安装目录生成sbin文件夹。

8. 在  nginx-1.8.0  目录  mkdir  logs ,  它会将日志文件生成在安装目录的该文件夹下,不创建会报错。

9. 进入安装目录的sbin目录 cd /usr/local/wulei/nginx-1.8.0/sbin

  启动:./nginx    查看进程:pgrep nginx 或者 ps aux|grep nginx    杀死进程: kill -9 pid

10. 测试   默认是80端口, 所以我们直接输入nignx的服务器ip就好了

静态网站部署

1. cd /usr/local/wulei/nginx-1.8.0/html

2. 把静态文件上传到该目录

走近nginx/conf/nginx.conf配置文件

#管理员(用户,用户组)
#user  nobody;

#工作线程数量(一般为cpu总核心数(减少上下文的切换):例如2个4核, 一般就为8)
worker_processes  1;

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

#pid        logs/nginx.pid;

 events {
  # 网络模型
  use epoll 
  # 最大连接数
  worker_connections 1024;
 }

#所有的http请求都会进入这里面,这些都是默认配置。
http {
    include       mime.types;
    default_type  application/octet-stream;
    
   #日志格式: remote_addr远程ip地址  remote_user远程用户   time_local用户时间   request请求方式get/post
    #           status状态     body_bytes_sent请求长度   http_referer来源信息       http_user_agent用户代理
    #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;
    
    # 自定义日志格式与日志打印位子
    #log_format  wuleiformat  '$remote_addr - $remote_user [$time_local]';
    #access_log  logs/wulei.log  wuleiformat;

    sendfile        on;    #能否发送文件
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65; #超时时间

    #gzip  on;

    #一个server就是一个虚拟主机
    server {
        listen       80;        # 监听端口
        server_name  localhost; # 监听地址

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {  # 相当于项目的WEB-INF目录 
            root   html;                 # 页面根目录
            index  index.html index.htm; # 首页文件,如果第一个不存在就找第二个
        }

        #error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    
    #======================      我们这里自定义一个方向代理      =====================
  
    server {  
        # 监听80端口
        listen       80;
        server_name  www.wulei.com;
        
        location / {#相当于项目的WEB-INF目录 
            proxy_pass  http://94.191.21.35:8081;
        }
    }

}

动静分离

当我们请求一个网页的时候,可能会加载很多css,js,img等静态文件;一般这些文件是很久都不会变化的,所以我们为了提高页面响应速度,完全可以将这些文件缓存到浏览器中,这就叫动静分离。

1.  vim nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    
    log_format  wuleiformat  '$remote_addr - $remote_user [$time_local]';

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;
     # 输入ip默认访问html文件夹下的index.html文件
        location / {
            root html;
            index index.html index.htm;
        }

     # 代理前端网页用 alias ,url路径一定要以/结尾
location /baby_ting{ alias '/usr/local/wulei/nginx-1.16.1/html/LOVE/'
; } # 所有.png .css ...结尾的文件都直接去/html/images里面找 location ~ \.(png|jpg|js|css|gif)$ {   root html/images;   expires 10m; # 缓存10分钟 # s秒 m分 h时 d天 } } }

2.  修改首页index.html  让它去加载一个静态图片。

 3.  重启可以看到效果(图片第一次加载花了7ms,后面再次刷新就是0ms,查看详细信息看到34分第一次缓存的,直到44分失效)。

反向代理

1. 比如现在有两个项目,url前缀分别是 /a  /b

  

2. nginx.conf 配置网关

#user  nobody;
worker_processes  1;

events {
    worker_connections  1024;
}

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;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        location /a {
            proxy_pass http://127.0.0.1:8080/a/;
        }
        
        location /b {
            proxy_pass http://127.0.0.1:8081/b/;
        }
    }
}

此时: 访问localhost/a/index 就相当于访问 127.0.0.1:8080/a/index了。

负载均衡

1: 我们把项目部署在两台服务器上,在hosts文件里面配置域名解析

2: 配置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;

events {
    worker_connections  1024;
}

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;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

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

    }
    #======================      我们这里自定义负载均衡      =====================
    server {  
        # 监听80端口
        listen       80;
        server_name  www.wulei.com;
        
        location / {
            # 用来获取nginx的真实ip
            proxy_set_header X-Real_IP $remote_addr;
        
            proxy_pass  http://myservers;
        }
#     location /api {
#            proxy_set_header X-Real_IP $remote_addr;
#            #location 代理的url有前缀的时候  proxy_pass  的地址必须以为/结尾
# proxy_pass http://myservers/; # }
    }
    upstream myservers{
        # ip_hash负载均衡策略:  
        ip_hash;
        # 服务器地址
        
        server 192.168.5.6:8081;
        server 192.168.5.5:8081;
    }
}

测试:

常用负载均衡策略

1.  ip_hash 策略:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream myservers{  
    ip_hash;    
    server 192.168.5.6:8081;
    server 192.168.5.5:8081;
}

2.  默认轮询策略:

upstream myservers{
    server 192.168.5.6:8081;
    server 192.168.5.5:8081;
}

3.  权重策略:指定轮询几率,weight和访问比率成正比

upstream myservers{
    server 192.168.5.6:8081 weight=9;
    server 192.168.5.5:8081 weight=2;
}

4.  fiar策略(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream myservers{
    server 192.168.5.6:8081;
    server 192.168.5.5:8081;
    fair; 
}

嗅探机制

如果某个应用挂了,请求不应该继续分发过去
  max_fails 允许请求失败的次数,默认为1.当超过最大次数时就不会请求
  fail_timeout : max_fails次失败后,暂停的时间,默认:fail_timeout为10s
  默认http_404状态不被认为是失败的尝试

    server {
        listen       80;
        server_name  localhost;

        location /api {
            proxy_pass  http://myservers/;
            # 将 失败 超时 500 503  404  计为失败
            proxy_next_upstream error timeout http_500 http_503 http_404;
        }
    }
        upstream myservers{
            # 60s 之内失败2次则熔断, 下一个节点再尝试分配流量 
            server 192.168.200.100:8080  max_fails=2 fail_timeout=60s;
            server 192.168.200.100:8081  max_fails=2 fail_timeout=60s;
        }

nginx限流

漏桶算法实现控制速率限流思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求,可以看出漏桶算法能强行限制数据的传输速率.

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

    sendfile        on;
    keepalive_timeout  65;

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

    server {
        listen       80;
        server_name  localhost;

        location /nacos {
            #limit_req zone=myRateLimit;
            #limit_req zone=myRateLimit burst=5;
            limit_req zone=myRateLimit burst=5 nodelay;
            proxy_pass http://127.0.0.1:8081/;
        }
    }
}


参数解析:
binary_remote_addr 是一种key,表示基于 remote_addr(客户端IP) 来做限流,
binary_ 的目的是压缩内存占用量。
zone:定义共享内存区来存储访问信息
myRateLimit:10m 表示一个大小为10M,名字为 myRateLimit的内存区域(名字可以自定义)。1M能存储16000 IP地址的访问信息,10M可以存储16W IP地址访 问信息。
rate 用于设置最大访问速率,rate=10r/s 表示每秒最多处理10个请求。Nginx 实际上以 毫秒为粒度来跟踪请求信息,因此 10r/s 实际上是限制:每100毫秒处理一个请求。这意味 着,自上一个请求处理完后,若后续100毫秒内又有请求到达,将拒绝处理该请求.我们这里 设置成2 方便测试。

limit_req zone=myRateLimit:标识应引用了上面的规则,每500ms可以处理一个请求。
burst:译为突发、爆发,表示在超过设定的处理速率后能额外处理的请求数,当 rate=2r/s 时,将1s拆成2份,即每500ms可处理1个请求。 此处,*burst=5 *,若同时有6个请求到达,Nginx 会处理第一个请求,剩余5个请求将放 入队列,然后每隔500ms从队列中获取一个请求进行处理。若请求数大于6,将拒绝处理 多余的请求,直接返回503.
nodelay:单独使用 burst 参数并不实用。假设 burst=50 ,rate为10r/s,排队中的50个请 求虽然每100ms会处理一个,但第50个请求却需要等待 50 * 100ms即 5s,这么长的处 理时间自然难以接受。 因此,burst 往往结合 nodelay 一起使用。处理突发5个请求的时候,没有延迟,等到完成之后,按照正常的速率处理。

跨域设置

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


events {
    worker_connections  1024;
}


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

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;
    
        location /api {
            #代理的后台地址
            proxy_pass http://192.168.200.100:8080/;
        
            # 指定允许跨域的方法,*代表所有
            add_header Access-Control-Allow-Methods *;
            # 预检命令的缓存,如果不缓存每次会发送两次请求
            add_header Access-Control-Max-Age 3600;
            # 带cookie请求需要加上这个字段,并设置为true
            add_header Access-Control-Allow-Credentials true;
            # 表示允许这个域跨域调用(客户端发送请求的域名和端口) 
            # $http_origin动态获取请求客户端请求的域 不用*的原因是带cookie的请求不支持*号
            add_header Access-Control-Allow-Origin $http_origin;
            # 表示请求头的字段 动态获取
            add_header Access-Control-Allow-Headers 
            $http_access_control_request_headers;
            # OPTIONS预检命令,预检命令通过时才发送请求
            # 检查请求的类型是不是预检命令
            if ($request_method = OPTIONS){
                return 200;
            }
        }
    }
}

 

 

 

posted @ 2018-10-26 13:05  吴磊的  阅读(1059)  评论(0编辑  收藏  举报
//生成目录索引列表