1 | 作者: 夜泊1990 |
一、Nginx简介
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的。其特点是占有内存少,并发能力强。中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等
- 官网地址
- 版本介绍
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.gz2、相关依赖库安装(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解压目录执行
./configure5、安装
make install6、查找安装路径
whereis nginx
这个命令可以在Linux环境下查找到当前nginx安装到了哪里.7、启动/停止nginx
nginx的命令默认在不指定安装路径的情况下会安装到 /usr/local/nginx/sbin
Linux下nginx常用命令
./nginx 开启
./nginx -s stop 停止
./nginx -s quit
./nginx -s reload8、配置文件所在目录
/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 | # 全局块 |
3.2 配置文件详解
1 | ########### 每个指令必须有分号结束。################# |
① 惊群效应
惊群效应(thundering herd)是指多进程(多线程)在同时阻塞等待同一个事件的时候(休眠状态),如果等待的这个事件发生,那么他就会唤醒等待的所有进程(或者线程),但是最终却只能有一个进程(线程)获得这个时间的“控制权”,对该事件进行处理,而其他进程(线程)获取“控制权”失败,只能重新进入休眠状态,这种现象和性能浪费就叫做惊群效应
四、Nginx反向代理
4.1 什么是反向代理
在说反向代理之前首先我们要先说一下什么是正向代理
- 正向代理概念
正向代理指的是,一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端
- 反向代理概念
反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器
怎么区分正向代理和反向代理:
- 首先代理是一种设计模式
- 服务器采用这样的设计结构实现了这种设计模式
- 正向代理,代理的是客户端,正向代理将代理服务器看成了一个客户端,让这个代理服务器做客户端的功能(为客户端收发请求)
- 反向代理,代理的是服务器(就像是服务器一样,为服务器收发请求)
- 正向代理是代理服务器和用户在一个LAN(Local Area Network)内
- 反向代理是代理服务器和目标服务器在一个LAN内
4.2 为什么要用反向代理
1、可以起到保护网站安全的作用,因为任何来自Internet的请求都必须先经过代理服务器
2、通过缓存静态资源,加速Web请求
3、实现负载均衡
4.3 反向代理的实现
配置反向代理非常简单,只需要在location块中设置代理服务器地址即可
1 | location /ceshi { |
五、Nginx负载均衡
- 负载均衡的基本配置
负载均衡实现:
1 | #设置负载均衡upstream块 |
设置路由规则
1 | # 设置路由规则(当设置负载均衡时,不能在location后设置规则和拦截路径) |
负载均衡设置以上两个块即可,但是要注意upstream块在http块内部和server块同级.
upstream : 设置upstream块
mysvr1 :给upstream起一个名字,在location块里面设置负载均衡服务器群组的upstream块的名字,然后重载nginx配置
- 负载均衡的策略
热备: 如果有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBB
1 | upstream mysvr1 { |
轮询 : nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB
1 | upstream mysvr1 { |
加权轮询: 根据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB
1 | upstream mysvr1 { |
ip_hash: nginx会让相同的客户端ip请求相同的服务器
1 | upstream mysvr1 { |
关于负载均衡的几个常见其他参数(了解)
- down : 表示当前的server暂时不参与负载均衡
- max_fails : 允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误
- fail_timeout : 在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用
1 | upstream mysvr { |
六、Nginx静态资源访问
使用Nginx搭建图片服务器
6.1 配置图片服务器的步骤
配置图片服务器只需要修改nginx.cnf配置文件中的location块即可
1 | #图片服务器的地址设置 |
访问: http://localhost/file 就会展示出来图片列表
6.2 root 和 alias 区别
nginx指定文件路径有两种方式root和alias,这两者的用法区别在于对url的处理方法不同
- 方式一
1 | location /file/ { |
访问地址 http://127.0.0.1/file/ 时,ningx会自动去D:/360Downloads/wpcache/srvsetwp/目录找文件
- 方式二
1 | location /file/ { |
访问地址 http://127.0.0.1/file/ 时,ningx会自动去D:/360Downloads/wpcache/srvsetwp/file 目录找文件
注意事项:
- alias是一个目录别名的定义,root则是最上层目录的定义,file拼接到整个root指定的目录结尾
- alias后面必须要用”/“结束,否则会找不到文件的,而root则可有可无
七、Nginx动静分离
7.1 动静分离介绍
为了提高网站的响应速度,减轻程序服务器(tomcat,jetty等)的负载,对于静态资源比如html、css、js、图片等文件,我们可以在反向代理服务器中进行缓存,这样浏览器在请求一个静态资源时,代理服务器就可以直接处理,而不用将请求转发给后端服务器
7.2 动静分离实现
- 将前端页面都放在nginx中并配置
实现方式:
1、配置静态资源文件 自定义一个index.html文件做测试
1 |
|
2、将index.html页面放在硬盘任意位置,比如我放在了 D:\app\hs_admin,配置nginx,将index.html 设置为nginx的首页
1 | location /abc { |
3、启动nginx服务器,在浏览器中输入 http://localhost/abc/ 测试nginx服务器首页是否设置成功
- 使用SpringBoot构建一个web项目用于前后端分离项目测试
1 | //后台代码 |
- 测试
当项目设计成前后端分离之后,那么我们前后端的数据交互需采用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 = “http://localhost"