nginx看这一篇文章就够了

一、Nginx简介

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的。其特点是占有内存少,并发能力强。中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等

  • 官网地址

nginx news

  • 版本介绍

Mainline version : 主线版本

Stable version : 稳定版本

Legacy versions : 历史版本


二、Nginx安装

  • nginx windows目录简介

 

  • windows安装

    • 安装步骤

    1、解压下载的nginx压缩包(所有的配置默认)

    2、启动命令行切换到当前nginx解压目录(nginx.exe目录下)

    3、使用命令行启动 start nginx.exe

    4、有一个一闪而过的效果

    windows环境下nginx常见命令:

    1、启动 start nginx / nginx.exe

    2、停止 nginx.exe -s stop / nginx.exe -s quit (stop快速停止/quit有序停止)

    3、重载 nginx.exe -s reload (主要用于配置修改后的重新载入)

    4、查看nginx版本 nginx -v

    • 注意事项

    不要直接双击nginx.exe,这样会导致修改配置后重启、停止nginx无效,需要手动关闭任务管理器内的所有nginx进程

    • 成功展示

 

  • Linux安装

1、下载
wget https://nginx.org/download/nginx-1.11.6.tar.gz

2、相关依赖库安装(Linux下nginx安装必备的安装库)

  • 2.1 gcc环境 yum install gcc-c++
  • 2.2 PCRE依赖库 yum install -y pcre pcre-devel
  • 2.3 zlib 依赖库 yum install -y zlib zlib-devel
  • 2.4 OpenSSL安全套接字层密码库 yum install -y openssl openssl-devel

3、解压nginx压缩包

​ tar -zxvf nginx-1.11.6.tar.gz

4、进入nginx解压目录执行
./configure

5、安装
make install

6、查找安装路径
whereis nginx
这个命令可以在Linux环境下查找到当前nginx安装到了哪里.

7、启动/停止nginx

  • nginx的命令默认在不指定安装路径的情况下会安装到 /usr/local/nginx/sbin

  • Linux下nginx常用命令

    ./nginx 开启
    ./nginx -s stop 停止
    ./nginx -s quit
    ./nginx -s reload

8、配置文件所在目录

​ /usr/local/nginx/conf

  • 在docker平台安装nginx

1、在docker搜索当前的nginx镜像 docker search nginx

2、拉取当前最新版本 docker pull nginx:latest

3、查看本地镜像 docker images

4、运行nginx容器 docker run –name nginx-app -p 8081:80 -d nginx
–name nginx-app : 给容器起名字
-p 8081:80 : 端口映射,将本地 8081 端口映射到容器内部的 80 端口
-d nginx : 设置容器在在后台一直运行

5、访问测试,看是否安装成功


三、Nginx配置

3.1 配置文件的构成

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
# 全局块
...              
# events块
events {         
   ...
}
# http块
http      
{
    # http全局块
    ...   
    # 虚拟主机server块
    server        
    { 
        # server全局块
        ...       
        # location块
        location [PATTERN]   
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    # http全局块
    ...     
}

3.2 配置文件详解

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
########### 每个指令必须有分号结束。#################
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
#worker_processes 2;  #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #设置网路连接序列化,防止惊群现象①发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll(处理请求效率更高)|resig|/dev/poll|eventport
    worker_connections  1024;    #最大连接数,默认为512
}
http {
    include       mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
    #access_log off; #取消服务日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

    # 定义常量
    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #热备
    }
    error_page 404 https://www.baidu.com; #错误页 

    #定义某个负载均衡服务器   
    server {
        keepalive_requests 120; #单连接请求上限次数。
        listen       4545;   #监听端口
        server_name  127.0.0.1;   #监听地址       
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }
} 

① 惊群效应

惊群效应(thundering herd)是指多进程(多线程)在同时阻塞等待同一个事件的时候(休眠状态),如果等待的这个事件发生,那么他就会唤醒等待的所有进程(或者线程),但是最终却只能有一个进程(线程)获得这个时间的“控制权”,对该事件进行处理,而其他进程(线程)获取“控制权”失败,只能重新进入休眠状态,这种现象和性能浪费就叫做惊群效应


四、Nginx反向代理

4.1 什么是反向代理

在说反向代理之前首先我们要先说一下什么是正向代理

  • 正向代理概念

正向代理指的是,一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端

 

  • 反向代理概念

反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器

 

怎么区分正向代理和反向代理:

  1. 首先代理是一种设计模式
  2. 服务器采用这样的设计结构实现了这种设计模式
  3. 正向代理,代理的是客户端,正向代理将代理服务器看成了一个客户端,让这个代理服务器做客户端的功能(为客户端收发请求)
  4. 反向代理,代理的是服务器(就像是服务器一样,为服务器收发请求)
  5. 正向代理是代理服务器和用户在一个LAN(Local Area Network)内
  6. 反向代理是代理服务器和目标服务器在一个LAN内

4.2 为什么要用反向代理

1、可以起到保护网站安全的作用,因为任何来自Internet的请求都必须先经过代理服务器

2、通过缓存静态资源,加速Web请求

3、实现负载均衡

4.3 反向代理的实现

配置反向代理非常简单,只需要在location块中设置代理服务器地址即可

1
2
3
4
location /ceshi {
    # 代理服务器地址
    proxy_pass   http://localhost:8080/PictureSharing/index; # 网站的首页地址(也可以是某一个请求的地址)
}

五、Nginx负载均衡

  • 负载均衡的基本配置

负载均衡实现:

1
2
3
4
5
6
7
8
#设置负载均衡upstream块
upstream mysvr1 {   
	server 127.0.0.1:8080;
	server 127.0.0.1:8081;
}


如果负载均衡不生效,切换浏览器,使用其它浏览器(谷歌浏览器负载均衡可能会失效)

设置路由规则

1
2
3
4
# 设置路由规则(当设置负载均衡时,不能在location后设置规则和拦截路径)
location / {
    proxy_pass  http://mysvr1;
}

负载均衡设置以上两个块即可,但是要注意upstream块在http块内部和server块同级.
upstream : 设置upstream块
mysvr1 :给upstream起一个名字,在location块里面设置负载均衡服务器群组的upstream块的名字,然后重载nginx配置

  • 负载均衡的策略

热备: 如果有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBB

1
2
3
4
upstream mysvr1 {   
	server 127.0.0.1:8080;
	server 127.0.0.1:8081 backup;  #热备 
}

轮询 : nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB

1
2
3
4
upstream mysvr1 {   
	server 127.0.0.1:8080;
	server 127.0.0.1:8081;
}

加权轮询: 根据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB

1
2
3
4
upstream mysvr1 {   
	server 127.0.0.1:8080 weight=1;
	server 127.0.0.1:8081 weight=2;
}

ip_hash: nginx会让相同的客户端ip请求相同的服务器

1
2
3
4
5
upstream mysvr1 {   
	server 127.0.0.1:8080;
	server 127.0.0.1:8081;
	ip_hash;
}

关于负载均衡的几个常见其他参数(了解)

  • down : 表示当前的server暂时不参与负载均衡
  • max_fails : 允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误
  • fail_timeout : 在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用
1
2
3
4
upstream mysvr { 
    server 127.0.0.1:8080 weight=2 max_fails=2 fail_timeout=2;
    server 127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=1;    
}

六、Nginx静态资源访问

使用Nginx搭建图片服务器

6.1 配置图片服务器的步骤

配置图片服务器只需要修改nginx.cnf配置文件中的location块即可

1
2
3
4
5
#图片服务器的地址设置
location /file/ {
	alias  D:/360Downloads/wpcache/srvsetwp/; # 指定根目录
	autoindex on;                             # 文件可以以列表的形式展示出来
}

访问: http://localhost/file 就会展示出来图片列表

6.2 root 和 alias 区别

nginx指定文件路径有两种方式root和alias,这两者的用法区别在于对url的处理方法不同

  • 方式一
1
2
3
4
location /file/ {
	alias  D:/360Downloads/wpcache/srvsetwp/; # 指定根目录
	autoindex on;                             # 文件可以以列表的形式展示出来
}

访问地址 http://127.0.0.1/file/ 时,ningx会自动去D:/360Downloads/wpcache/srvsetwp/目录找文件

  • 方式二
1
2
3
4
location /file/ {
	root  D:/360Downloads/wpcache/srvsetwp/; # 指定根目录
	autoindex on;                             # 文件可以以列表的形式展示出来
}

访问地址 http://127.0.0.1/file/ 时,ningx会自动去D:/360Downloads/wpcache/srvsetwp/file 目录找文件

注意事项:

  1. alias是一个目录别名的定义,root则是最上层目录的定义,file拼接到整个root指定的目录结尾
  2. alias后面必须要用”/“结束,否则会找不到文件的,而root则可有可无

七、Nginx动静分离

7.1 动静分离介绍

为了提高网站的响应速度,减轻程序服务器(tomcat,jetty等)的负载,对于静态资源比如html、css、js、图片等文件,我们可以在反向代理服务器中进行缓存,这样浏览器在请求一个静态资源时,代理服务器就可以直接处理,而不用将请求转发给后端服务器

 

7.2 动静分离实现

  • 将前端页面都放在nginx中并配置

实现方式:

1、配置静态资源文件 自定义一个index.html文件做测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>首页</title>
        <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
    </head>
    <body>
        <h1>Nginx前后端分离测试</h1>
        <button id="btn">向后台发送请求</button>
        <script>
            $("#btn").click(function(){
                //请求地址访问web服务器的地址
                $.getJSON("http://localhost:8080/getList", function(json){
                    console.log(json)
                });
            });
        </script>
    </body>
</html>

2、将index.html页面放在硬盘任意位置,比如我放在了 D:\app\hs_admin,配置nginx,将index.html 设置为nginx的首页

1
2
3
4
location /abc {
	alias D:/app/hs_admin/;
	index index.html;
}

3、启动nginx服务器,在浏览器中输入 http://localhost/abc/ 测试nginx服务器首页是否设置成功

  • 使用SpringBoot构建一个web项目用于前后端分离项目测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//后台代码
@RestController
public class HelloController {
    @GetMapping(value = "/getList")
    public Object getList(){
        List<Map<String,String>> listMap = new ArrayList<>();
        Map<String,String> map1 = new HashMap<>();
        map1.put("userName","李雷");
        map1.put("age","18");
        Map<String,String> map2 = new HashMap<>();
        map2.put("userName","韩梅梅");
        map2.put("age","17");
        listMap.add(map1);
        listMap.add(map2);
        return listMap;
    }
}
  • 测试

当项目设计成前后端分离之后,那么我们前后端的数据交互需采用JavaScript进行AJAX请求,我这里采用的是jQuery进行测试

在nginx服务器中的index.html页面请求后台的web服务器中的资源会出现跨域调用的问题(No ‘Access-Control-Allow-Origin’ header is present on the requested resource)

7.3 跨域问题解决

  • 什么是跨域

浏览器的同源策略会导致跨域,跨域是指从一个域名的网页去请求另一个域名的资源。比如从www.baidu.com 页面去请求 www.google.com 的资源。跨域的严格一点的定义是:只要 协议(http/https),域名,端口号有任何一个的不同,就被当作是跨域,浏览器因为同源策略不允许AJAX从当前域请求到另一域获取数据

  • 解决方式(Spring框架,专注后台解决方案)

只要在请求的Java类(控制器类)上加@CrossOrigin注解即可

  • @CrossOrigin注解是Spring在4.2版本新增的一个注解
  • @CrossOrigin注解可以修饰类也可以修饰方法
  • @CrossOrigin默认是可以接受其他域的所有请求
  • 还可以针对某一个域进行设置,此注解里面有一个属性
    - origins : 可以设置指定的域名或方法 例如: origins = “nginx
  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jayues_lies

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值